Skip to content

Commit 03ad5da

Browse files
author
Michael Meskes
committed
- Only use typedefs inside their scope.
- Variables that are out of scope, were not removed all the time. - Make a varchar NULL set everything to 0 when not using indicators. - Synced parser.
1 parent 4eb5f0a commit 03ad5da

File tree

10 files changed

+116
-34
lines changed

10 files changed

+116
-34
lines changed

src/interfaces/ecpg/ChangeLog

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1814,6 +1814,13 @@ Thu Jun 17 13:50:06 CEST 2004
18141814
Sun Jun 20 12:44:01 CEST 2004
18151815

18161816
- Synced parser and keyword list.
1817+
1818+
Sun Jun 27 13:50:58 CEST 2004
1819+
1820+
- Only use typedefs inside their scope.
1821+
- Variables that are out of scope, were not removed all the time.
1822+
- Make a varchar NULL set everything to 0 when not using indicators.
1823+
- Synced parser.
18171824
- Set pgtypes library version to 1.2.
18181825
- Set ecpg version to 3.2.0.
18191826
- Set compat library version to 1.2.

src/interfaces/ecpg/compatlib/informix.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,12 +1002,12 @@ ECPG_informix_get_var(int number)
10021002
int
10031003
rsetnull(int t, char *ptr)
10041004
{
1005-
ECPGset_informix_null(t, ptr);
1005+
ECPGset_noind_null(t, ptr);
10061006
return 0;
10071007
}
10081008

10091009
int
10101010
risnull(int t, char *ptr)
10111011
{
1012-
return (ECPGis_informix_null(t, ptr));
1012+
return (ECPGis_noind_null(t, ptr));
10131013
}

src/interfaces/ecpg/ecpglib/data.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.23 2004/05/05 15:03:04 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.24 2004/06/27 12:28:39 meskes Exp $ */
22

33
#define POSTGRES_ECPG_INTERNAL
44
#include "postgres_fe.h"
@@ -76,7 +76,10 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
7676
* and 0 if not
7777
*/
7878
if (PQgetisnull(results, act_tuple, act_field))
79+
{
80+
printf("MM NULL\n");
7981
value_for_indicator = -1;
82+
}
8083

8184
switch (ind_type)
8285
{
@@ -107,7 +110,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
107110
* Informix has an additional way to specify NULLs
108111
* note that this uses special values to denote NULL
109112
*/
110-
ECPGset_informix_null(type, var + offset * act_tuple);
113+
ECPGset_noind_null(type, var + offset * act_tuple);
111114
}
112115
else
113116
{
@@ -411,7 +414,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
411414
if (INFORMIX_MODE(compat))
412415
{
413416
/* Informix wants its own NULL value here instead of an error */
414-
ECPGset_informix_null(ECPGt_numeric, nres);
417+
ECPGset_noind_null(ECPGt_numeric, nres);
415418
}
416419
else
417420
{
@@ -454,7 +457,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
454457
if (INFORMIX_MODE(compat))
455458
{
456459
/* Informix wants its own NULL value here instead of an error */
457-
ECPGset_informix_null(ECPGt_interval, ires);
460+
ECPGset_noind_null(ECPGt_interval, ires);
458461
}
459462
else
460463
{
@@ -493,7 +496,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
493496
if (INFORMIX_MODE(compat))
494497
{
495498
/* Informix wants its own NULL value here instead of an error */
496-
ECPGset_informix_null(ECPGt_date, &ddres);
499+
ECPGset_noind_null(ECPGt_date, &ddres);
497500
}
498501
else
499502
{
@@ -531,7 +534,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
531534
if (INFORMIX_MODE(compat))
532535
{
533536
/* Informix wants its own NULL value here instead of an error */
534-
ECPGset_informix_null(ECPGt_timestamp, &tres);
537+
ECPGset_noind_null(ECPGt_timestamp, &tres);
535538
}
536539
else
537540
{

src/interfaces/ecpg/ecpglib/execute.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.33 2004/05/05 15:03:04 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.34 2004/06/27 12:28:40 meskes Exp $ */
22

33
/*
44
* The aim is to get a simpler inteface to the database routines.
@@ -532,7 +532,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
532532
case ECPGt_NO_INDICATOR:
533533
if (stmt->force_indicator == false)
534534
{
535-
if (ECPGis_informix_null(var->type, var->value))
535+
if (ECPGis_noind_null(var->type, var->value))
536536
*tobeinserted_p = "null";
537537
}
538538
break;

src/interfaces/ecpg/ecpglib/misc.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.20 2004/03/14 14:47:33 momjian Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.21 2004/06/27 12:28:40 meskes Exp $ */
22

33
#define POSTGRES_ECPG_INTERNAL
44
#include "postgres_fe.h"
@@ -266,7 +266,7 @@ ECPGlog(const char *format,...)
266266
}
267267

268268
void
269-
ECPGset_informix_null(enum ECPGttype type, void *ptr)
269+
ECPGset_noind_null(enum ECPGttype type, void *ptr)
270270
{
271271
switch (type)
272272
{
@@ -301,6 +301,7 @@ ECPGset_informix_null(enum ECPGttype type, void *ptr)
301301
break;
302302
case ECPGt_varchar:
303303
*(((struct ECPGgeneric_varchar *) ptr)->arr) = 0x00;
304+
((struct ECPGgeneric_varchar *) ptr)->len = 0;
304305
break;
305306
case ECPGt_decimal:
306307
memset((char *) ptr, 0, sizeof(decimal));
@@ -331,7 +332,7 @@ _check(unsigned char *ptr, int length)
331332
}
332333

333334
bool
334-
ECPGis_informix_null(enum ECPGttype type, void *ptr)
335+
ECPGis_noind_null(enum ECPGttype type, void *ptr)
335336
{
336337
switch (type)
337338
{

src/interfaces/ecpg/include/ecpglib.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ void ECPGraise_backend(int line, PGresult *result, PGconn *conn, int compat);
7777
bool ECPGget_desc_header(int, char *, int *);
7878
bool ECPGget_desc(int, char *, int,...);
7979

80-
void ECPGset_informix_null(enum ECPGttype, void *);
81-
bool ECPGis_informix_null(enum ECPGttype, void *);
80+
void ECPGset_noind_null(enum ECPGttype, void *);
81+
bool ECPGis_noind_null(enum ECPGttype, void *);
8282
bool ECPGdescribe(int, bool, const char *,...);
8383

8484
/* dynamic result allocation */

src/interfaces/ecpg/preproc/extern.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ extern struct typedefs *get_typedef(char *);
8282
extern void adjust_array(enum ECPGttype, char **, char **, char *, char *, int, bool);
8383
extern void reset_variables(void);
8484
extern void check_indicator(struct ECPGtype *);
85+
extern void remove_typedefs(int);
8586
extern void remove_variables(int);
8687
extern struct variable *new_variable(const char *, struct ECPGtype *, int);
8788
extern ScanKeyword *ScanKeywordLookup(char *text);

src/interfaces/ecpg/preproc/preproc.y

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.288 2004/06/20 10:45:47 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.289 2004/06/27 12:28:42 meskes Exp $ */
22

33
/* Copyright comment */
44
%{
@@ -542,7 +542,7 @@ add_additional_variables(char *name, bool insert)
542542
%type <str> inf_val_list inf_col_list using_descriptor into_descriptor
543543
%type <str> ecpg_into_using prepared_name struct_union_type_with_symbol
544544
%type <str> ECPGunreserved ECPGunreserved_interval cvariable
545-
%type <str> AlterDbOwnerStmt OptTableSpaceOwner CreateTableSpaceStmt
545+
%type <str> AlterOwnerStmt OptTableSpaceOwner CreateTableSpaceStmt
546546
%type <str> DropTableSpaceStmt indirection indirection_el
547547

548548
%type <struct_union> s_struct_union_symbol
@@ -578,7 +578,7 @@ statement: ecpgstart opt_at stmt ';' { connection = NULL; }
578578
| c_thing { fprintf(yyout, "%s", $1); free($1); }
579579
| CPP_LINE { fprintf(yyout, "%s", $1); free($1); }
580580
| '{' { braces_open++; fputs("{", yyout); }
581-
| '}' { remove_variables(braces_open--); fputs("}", yyout); }
581+
| '}' { remove_typedefs(braces_open); remove_variables(braces_open--); fputs("}", yyout); }
582582
;
583583

584584
opt_at: AT connection_target
@@ -594,9 +594,9 @@ opt_at: AT connection_target
594594
};
595595

596596
stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); }
597-
| AlterDbOwnerStmt { output_statement($1, 0, connection); }
598597
| AlterDomainStmt { output_statement($1, 0, connection); }
599598
| AlterGroupStmt { output_statement($1, 0, connection); }
599+
| AlterOwnerStmt { output_statement($1, 0, connection); }
600600
| AlterSeqStmt { output_statement($1, 0, connection); }
601601
| AlterTableStmt { output_statement($1, 0, connection); }
602602
| AlterUserSetStmt { output_statement($1, 0, connection); }
@@ -2385,12 +2385,42 @@ RenameStmt: ALTER AGGREGATE func_name '(' aggr_argtype ')' RENAME TO name
23852385
{ $$ = cat_str(6, make_str("alter trigger"), $3, make_str("on"), $5, make_str("rename to"), $8); }
23862386
| ALTER USER UserId RENAME TO UserId
23872387
{ $$ = cat_str(4, make_str("alter user"), $3, make_str("rename to"), $6); }
2388+
| ALTER TABLESPACE name RENAME TO name
2389+
{ $$ = cat_str(4, make_str("alter tablespace"), $3, make_str("rename to"), $6); }
23882390
;
23892391

23902392
opt_column: COLUMN { $$ = make_str("column"); }
23912393
| /*EMPTY*/ { $$ = EMPTY; }
23922394
;
23932395

2396+
/*****************************************************************************
2397+
*
2398+
* ALTER THING name OWNER TO newname.
2399+
*
2400+
*****************************************************************************/
2401+
2402+
AlterOwnerStmt: ALTER AGGREGATE func_name '(' aggr_argtype ')' OWNER TO UserId
2403+
{ $$ = cat_str(6, make_str("alter aggregate"), $3, make_str("("), $5, make_str(") owner to"), $9); }
2404+
| ALTER CONVERSION_P any_name OWNER TO UserId
2405+
{ $$ = cat_str(4, make_str("alter conversion"), $3, make_str("owner to"), $6); }
2406+
| ALTER DATABASE database_name OWNER TO UserId
2407+
{ $$ = cat_str(4, make_str("alter database"), $3, make_str("owner to"), $6); }
2408+
| ALTER DOMAIN_P database_name OWNER TO UserId
2409+
{ $$ = cat_str(4, make_str("alter domain"), $3, make_str("owner to"), $6); }
2410+
| ALTER FUNCTION func_name func_args OWNER TO UserId
2411+
{ $$ = cat_str(5, make_str("alter function"), $3, $4, make_str("owner to"), $7); }
2412+
| ALTER OPERATOR any_operator '(' oper_argtypes ')' OWNER TO UserId
2413+
{ $$ = cat_str(6, make_str("alter operator"), $3, make_str("("), $5, make_str(") owner to"), $9); }
2414+
| ALTER OPERATOR CLASS any_name USING access_method OWNER TO UserId
2415+
{ $$ = cat_str(6, make_str("alter operator class"), $4, make_str("using"), $6, make_str("owner to"), $9); }
2416+
| ALTER SCHEMA name OWNER TO UserId
2417+
{ $$ = cat_str(4, make_str("alter schema"), $3, make_str("owner to"), $6); }
2418+
| ALTER TYPE_P any_name OWNER TO UserId
2419+
{ $$ = cat_str(4, make_str("alter type"), $3, make_str("owner to"), $6); }
2420+
| ALTER TABLESPACE name OWNER TO UserId
2421+
{ $$ = cat_str(4, make_str("alter tablespace"), $3, make_str("owner to"), $6); }
2422+
;
2423+
23942424

23952425
/*****************************************************************************
23962426
*
@@ -2589,8 +2619,6 @@ opt_equal: '=' { $$ = make_str("="); }
25892619
*
25902620
*****************************************************************************/
25912621

2592-
AlterDbOwnerStmt: ALTER DATABASE database_name OWNER TO UserId
2593-
{ $$ = cat_str(4, make_str("alter database"), $3, make_str("owner to"), $6); }
25942622
AlterDatabaseSetStmt: ALTER DATABASE database_name SET set_rest
25952623
{ $$ = cat_str(4, make_str("alter database"), $3, make_str("set"), $5); }
25962624
| ALTER DATABASE database_name VariableResetStmt
@@ -2632,8 +2660,6 @@ AlterDomainStmt:
26322660
{ $$ = cat_str(4, make_str("alter domain"), $3, make_str("add"), $5); }
26332661
| ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
26342662
{ $$ = cat_str(5, make_str("alter domain"), $3, make_str("drop constraint"), $6, $7); }
2635-
| ALTER DOMAIN_P any_name OWNER TO UserId
2636-
{ $$ = cat_str(4, make_str("alter domain"), $3, make_str("owner to"), $6); }
26372663
;
26382664

26392665
opt_as: AS {$$ = make_str("as"); }
@@ -4582,6 +4608,7 @@ type_declaration: S_TYPEDEF
45824608
/* initial definition */
45834609
this->next = types;
45844610
this->name = $5;
4611+
this->brace_level = braces_open;
45854612
this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
45864613
this->type->type_enum = $3.type_enum;
45874614
this->type->type_str = mm_strdup($5);
@@ -4897,6 +4924,7 @@ struct_union_type_with_symbol: s_struct_union_symbol
48974924
/* initial definition */
48984925
this->next = types;
48994926
this->name = mm_strdup(su_type.type_str);
4927+
this->brace_level = braces_open;
49004928
this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
49014929
this->type->type_enum = su_type.type_enum;
49024930
this->type->type_str = mm_strdup(su_type.type_str);
@@ -5417,6 +5445,7 @@ ECPGTypedef: TYPE_P
54175445
/* initial definition */
54185446
this->next = types;
54195447
this->name = $3;
5448+
this->brace_level = braces_open;
54205449
this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
54215450
this->type->type_enum = $5.type_enum;
54225451
this->type->type_str = mm_strdup($3);

src/interfaces/ecpg/preproc/type.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,26 +123,27 @@ struct cursor
123123

124124
struct typedefs
125125
{
126-
char *name;
127-
struct this_type *type;
128-
struct ECPGstruct_member *struct_member_list;
129-
struct typedefs *next;
126+
char *name;
127+
struct this_type *type;
128+
struct ECPGstruct_member *struct_member_list;
129+
int brace_level;
130+
struct typedefs *next;
130131
};
131132

132133
struct _defines
133134
{
134-
char *old;
135-
char *new;
136-
int pertinent;
135+
char *old;
136+
char *new;
137+
int pertinent;
137138
struct _defines *next;
138139
};
139140

140141
/* This is a linked list of the variable names and types. */
141142
struct variable
142143
{
143-
char *name;
144+
char *name;
144145
struct ECPGtype *type;
145-
int brace_level;
146+
int brace_level;
146147
struct variable *next;
147148
};
148149

src/interfaces/ecpg/preproc/variable.c

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,13 +275,47 @@ find_variable(char *name)
275275
return (p);
276276
}
277277

278+
void
279+
remove_typedefs(int brace_level)
280+
{
281+
struct typedefs *p,
282+
*prev;
283+
284+
for (p = prev = types; p;)
285+
{
286+
if (p->brace_level >= brace_level)
287+
{
288+
/* remove it */
289+
if (p == types)
290+
prev = types = p->next;
291+
else
292+
prev->next = p->next;
293+
294+
if (p->type->type_enum == ECPGt_struct || p->type->type_enum == ECPGt_union)
295+
free(p->struct_member_list);
296+
free(p->type);
297+
free(p->name);
298+
free(p);
299+
if (prev == types)
300+
p = types;
301+
else
302+
p = prev ? prev->next : NULL;
303+
}
304+
else
305+
{
306+
prev = p;
307+
p = prev->next;
308+
}
309+
}
310+
}
311+
278312
void
279313
remove_variables(int brace_level)
280314
{
281315
struct variable *p,
282316
*prev;
283317

284-
for (p = prev = allvariables; p; p = p ? p->next : NULL)
318+
for (p = prev = allvariables; p;)
285319
{
286320
if (p->brace_level >= brace_level)
287321
{
@@ -326,10 +360,16 @@ remove_variables(int brace_level)
326360
ECPGfree_type(p->type);
327361
free(p->name);
328362
free(p);
329-
p = prev;
363+
if (prev == allvariables)
364+
p = allvariables;
365+
else
366+
p = prev ? prev->next : NULL;
330367
}
331368
else
369+
{
332370
prev = p;
371+
p = prev->next;
372+
}
333373
}
334374
}
335375

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy