Commit 607cd930 authored by Thomas G. Lockhart's avatar Thomas G. Lockhart

Changes from Michael Meskes:

Check strdup calls for out of memory.
Set library version to 2.6.2
Synced preproc.y and keywords.c with gram.y and keywords.c yet again.
Set version to 2.4.3
parent cbfc9ec6
...@@ -5,7 +5,7 @@ PQ_INCLUDE=-I$(SRCDIR)/interfaces/libpq ...@@ -5,7 +5,7 @@ PQ_INCLUDE=-I$(SRCDIR)/interfaces/libpq
SO_MAJOR_VERSION=2 SO_MAJOR_VERSION=2
SO_MINOR_VERSION=6 SO_MINOR_VERSION=6
SO_PATCHLEVEL=1 SO_PATCHLEVEL=2
PORTNAME=@PORTNAME@ PORTNAME=@PORTNAME@
......
...@@ -148,6 +148,22 @@ ecpg_alloc(long size, int lineno) ...@@ -148,6 +148,22 @@ ecpg_alloc(long size, int lineno)
return (new); return (new);
} }
static char *
ecpg_strdup(const char *string, int lineno)
{
char *new = strdup(string);
if (!new)
{
ECPGfinish(actual_connection);
ECPGlog("out of memory\n");
register_error(ECPG_OUT_OF_MEMORY, "out of memory in line %d", lineno);
return NULL;
}
return (new);
}
/* This function returns a newly malloced string that has the ' and \ /* This function returns a newly malloced string that has the ' and \
in the argument quoted with \. in the argument quoted with \.
*/ */
...@@ -246,7 +262,7 @@ ECPGexecute(struct statement * stmt) ...@@ -246,7 +262,7 @@ ECPGexecute(struct statement * stmt)
memcpy((char *) &sqlca, (char *) &sqlca_init, sizeof(sqlca)); memcpy((char *) &sqlca, (char *) &sqlca_init, sizeof(sqlca));
copiedquery = strdup(stmt->command); copiedquery = ecpg_strdup(stmt->command, stmt->lineno);
/* /*
* Now, if the type is one of the fill in types then we take the * Now, if the type is one of the fill in types then we take the
...@@ -914,9 +930,9 @@ ECPGconnect(int lineno, const char *dbname, const char *user, const char *passwd ...@@ -914,9 +930,9 @@ ECPGconnect(int lineno, const char *dbname, const char *user, const char *passwd
/* add connection to our list */ /* add connection to our list */
if (connection_name != NULL) if (connection_name != NULL)
this->name = strdup(connection_name); this->name = ecpg_strdup(connection_name, lineno);
else else
this->name = strdup(dbname); this->name = ecpg_strdup(dbname, lineno);
if (all_connections == NULL) if (all_connections == NULL)
this->next = NULL; this->next = NULL;
......
...@@ -3,7 +3,7 @@ include $(SRCDIR)/Makefile.global ...@@ -3,7 +3,7 @@ include $(SRCDIR)/Makefile.global
MAJOR_VERSION=2 MAJOR_VERSION=2
MINOR_VERSION=4 MINOR_VERSION=4
PATCHLEVEL=2 PATCHLEVEL=3
CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \ CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \
-DMINOR_VERSION=$(MINOR_VERSION) -DPATCHLEVEL=$(PATCHLEVEL) \ -DMINOR_VERSION=$(MINOR_VERSION) -DPATCHLEVEL=$(PATCHLEVEL) \
...@@ -27,6 +27,10 @@ uninstall: ...@@ -27,6 +27,10 @@ uninstall:
ecpg: $(OBJ) ecpg: $(OBJ)
$(CC) -o ecpg $(OBJ) $(LEXLIB) $(LDFLAGS) $(CC) -o ecpg $(OBJ) $(LEXLIB) $(LDFLAGS)
pgc.c: pgc.l
$(LEX) $<
mv lex.yy.c pgc.c
y.tab.h y.tab.c: preproc.y y.tab.h y.tab.c: preproc.y
$(YACC) $(YFLAGS) $< $(YACC) $(YFLAGS) $<
......
...@@ -67,6 +67,7 @@ extern void lex_init(void); ...@@ -67,6 +67,7 @@ extern void lex_init(void);
extern char *input_filename; extern char *input_filename;
extern int yyparse(void); extern int yyparse(void);
extern void *mm_alloc(size_t), *mm_realloc(void *, size_t); extern void *mm_alloc(size_t), *mm_realloc(void *, size_t);
extern char *mm_strdup(const char *);
ScanKeyword *ScanECPGKeywordLookup(char *); ScanKeyword *ScanECPGKeywordLookup(char *);
ScanKeyword *ScanCKeywordLookup(char *); ScanKeyword *ScanCKeywordLookup(char *);
extern void yyerror(char *); extern void yyerror(char *);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.5 1998/09/21 05:52:53 scrappy Exp $ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.6 1998/10/03 02:33:36 thomas Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -29,8 +29,9 @@ ...@@ -29,8 +29,9 @@
* search is used to locate entries. * search is used to locate entries.
*/ */
static ScanKeyword ScanKeywords[] = { static ScanKeyword ScanKeywords[] = {
/* name value */ /* name, value */
{"abort", ABORT_TRANS}, {"abort", ABORT_TRANS},
{"absolute", ABSOLUTE},
{"action", ACTION}, {"action", ACTION},
{"add", ADD}, {"add", ADD},
{"after", AFTER}, {"after", AFTER},
...@@ -40,7 +41,6 @@ static ScanKeyword ScanKeywords[] = { ...@@ -40,7 +41,6 @@ static ScanKeyword ScanKeywords[] = {
{"analyze", ANALYZE}, {"analyze", ANALYZE},
{"and", AND}, {"and", AND},
{"any", ANY}, {"any", ANY},
{"archive", ARCHIVE},
{"as", AS}, {"as", AS},
{"asc", ASC}, {"asc", ASC},
{"backward", BACKWARD}, {"backward", BACKWARD},
...@@ -67,7 +67,9 @@ static ScanKeyword ScanKeywords[] = { ...@@ -67,7 +67,9 @@ static ScanKeyword ScanKeywords[] = {
{"createdb", CREATEDB}, {"createdb", CREATEDB},
{"createuser", CREATEUSER}, {"createuser", CREATEUSER},
{"cross", CROSS}, {"cross", CROSS},
{"current", CURRENT}, {"current", CURRENT}, /* 6.4 to 6.5 is migration time! CURRENT
* will be removed in 6.5! Use OLD keyword
* in rules. Jan */
{"current_date", CURRENT_DATE}, {"current_date", CURRENT_DATE},
{"current_time", CURRENT_TIME}, {"current_time", CURRENT_TIME},
{"current_timestamp", CURRENT_TIMESTAMP}, {"current_timestamp", CURRENT_TIMESTAMP},
...@@ -87,6 +89,7 @@ static ScanKeyword ScanKeywords[] = { ...@@ -87,6 +89,7 @@ static ScanKeyword ScanKeywords[] = {
{"double", DOUBLE}, {"double", DOUBLE},
{"drop", DROP}, {"drop", DROP},
{"each", EACH}, {"each", EACH},
{"encoding", ENCODING},
{"end", END_TRANS}, {"end", END_TRANS},
{"execute", EXECUTE}, {"execute", EXECUTE},
{"exists", EXISTS}, {"exists", EXISTS},
...@@ -113,6 +116,7 @@ static ScanKeyword ScanKeywords[] = { ...@@ -113,6 +116,7 @@ static ScanKeyword ScanKeywords[] = {
{"inherits", INHERITS}, {"inherits", INHERITS},
{"inner", INNER_P}, {"inner", INNER_P},
{"insert", INSERT}, {"insert", INSERT},
{"insensitive", INSENSITIVE},
{"instead", INSTEAD}, {"instead", INSTEAD},
{"interval", INTERVAL}, {"interval", INTERVAL},
{"into", INTO}, {"into", INTO},
...@@ -136,10 +140,12 @@ static ScanKeyword ScanKeywords[] = { ...@@ -136,10 +140,12 @@ static ScanKeyword ScanKeywords[] = {
{"minvalue", MINVALUE}, {"minvalue", MINVALUE},
{"month", MONTH_P}, {"month", MONTH_P},
{"move", MOVE}, {"move", MOVE},
{"names", NAMES},
{"national", NATIONAL}, {"national", NATIONAL},
{"natural", NATURAL}, {"natural", NATURAL},
{"nchar", NCHAR}, {"nchar", NCHAR},
{"new", NEW}, {"new", NEW},
{"next", NEXT},
{"no", NO}, {"no", NO},
{"nocreatedb", NOCREATEDB}, {"nocreatedb", NOCREATEDB},
{"nocreateuser", NOCREATEUSER}, {"nocreateuser", NOCREATEUSER},
...@@ -152,7 +158,9 @@ static ScanKeyword ScanKeywords[] = { ...@@ -152,7 +158,9 @@ static ScanKeyword ScanKeywords[] = {
{"numeric", NUMERIC}, {"numeric", NUMERIC},
{"of", OF}, {"of", OF},
{"oids", OIDS}, {"oids", OIDS},
{"old", CURRENT},
{"on", ON}, {"on", ON},
{"only", ONLY},
{"operator", OPERATOR}, {"operator", OPERATOR},
{"option", OPTION}, {"option", OPTION},
{"or", OR}, {"or", OR},
...@@ -163,12 +171,15 @@ static ScanKeyword ScanKeywords[] = { ...@@ -163,12 +171,15 @@ static ScanKeyword ScanKeywords[] = {
{"position", POSITION}, {"position", POSITION},
{"precision", PRECISION}, {"precision", PRECISION},
{"primary", PRIMARY}, {"primary", PRIMARY},
{"prior", PRIOR},
{"privileges", PRIVILEGES}, {"privileges", PRIVILEGES},
{"procedural", PROCEDURAL}, {"procedural", PROCEDURAL},
{"procedure", PROCEDURE}, {"procedure", PROCEDURE},
{"public", PUBLIC}, {"public", PUBLIC},
{"read", READ},
{"recipe", RECIPE}, {"recipe", RECIPE},
{"references", REFERENCES}, {"references", REFERENCES},
{"relative", RELATIVE},
{"rename", RENAME}, {"rename", RENAME},
{"reset", RESET}, {"reset", RESET},
{"returns", RETURNS}, {"returns", RETURNS},
...@@ -177,9 +188,11 @@ static ScanKeyword ScanKeywords[] = { ...@@ -177,9 +188,11 @@ static ScanKeyword ScanKeywords[] = {
{"rollback", ROLLBACK}, {"rollback", ROLLBACK},
{"row", ROW}, {"row", ROW},
{"rule", RULE}, {"rule", RULE},
{"scroll", SCROLL},
{"second", SECOND_P}, {"second", SECOND_P},
{"select", SELECT}, {"select", SELECT},
{"sequence", SEQUENCE}, {"sequence", SEQUENCE},
{"serial", SERIAL},
{"set", SET}, {"set", SET},
{"setof", SETOF}, {"setof", SETOF},
{"show", SHOW}, {"show", SHOW},
...@@ -190,6 +203,7 @@ static ScanKeyword ScanKeywords[] = { ...@@ -190,6 +203,7 @@ static ScanKeyword ScanKeywords[] = {
{"substring", SUBSTRING}, {"substring", SUBSTRING},
{"table", TABLE}, {"table", TABLE},
{"time", TIME}, {"time", TIME},
{"timestamp", TIMESTAMP},
{"timezone_hour", TIMEZONE_HOUR}, {"timezone_hour", TIMEZONE_HOUR},
{"timezone_minute", TIMEZONE_MINUTE}, {"timezone_minute", TIMEZONE_MINUTE},
{"to", TO}, {"to", TO},
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#undef yywrap #undef yywrap
#endif /* yywrap */ #endif /* yywrap */
int debugging = 0;
extern YYSTYPE yylval; extern YYSTYPE yylval;
int llen; int llen;
char literal[MAX_PARSE_BUFFER]; char literal[MAX_PARSE_BUFFER];
......
...@@ -100,7 +100,7 @@ new_variable(const char * name, struct ECPGtype * type) ...@@ -100,7 +100,7 @@ new_variable(const char * name, struct ECPGtype * type)
{ {
struct variable * p = (struct variable*) mm_alloc(sizeof(struct variable)); struct variable * p = (struct variable*) mm_alloc(sizeof(struct variable));
p->name = strdup(name); p->name = mm_strdup(name);
p->type = type; p->type = type;
p->brace_level = braces_open; p->brace_level = braces_open;
...@@ -528,57 +528,52 @@ output_statement(char * stmt, int mode) ...@@ -528,57 +528,52 @@ output_statement(char * stmt, int mode)
%token TYPECAST %token TYPECAST
/* Keywords (in SQL92 reserved words) */ /* Keywords (in SQL92 reserved words) */
%token ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY AS, ASC, %token ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC,
BEGIN_TRANS, BETWEEN, BOTH, BY, BEGIN_TRANS, BETWEEN, BOTH, BY,
CASCADE, CAST, CHAR, CHARACTER, CHECK, CLOSE, COLLATE, COLUMN, COMMIT, CASCADE, CAST, CHAR, CHARACTER, CHECK, CLOSE, COLLATE, COLUMN, COMMIT,
CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME, CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME,
CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,
DAY_P, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DOUBLE, DROP, DAY_P, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DOUBLE, DROP,
END_TRANS, EXECUTE, EXISTS, EXTRACT, END_TRANS, EXECUTE, EXISTS, EXTRACT,
FETCH, FLOAT, FOR, FOREIGN, FROM, FULL, FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
GRANT, GROUP, HAVING, HOUR_P, GRANT, GROUP, HAVING, HOUR_P,
IN, INNER_P, INSENSITIVE, INSERT, INTERVAL, INTO, IS, IN, INNER_P, INSENSITIVE, INSERT, INTERVAL, INTO, IS,
JOIN, KEY, LANGUAGE, LEADING, LEFT, LIKE, LOCAL, JOIN, KEY, LANGUAGE, LEADING, LEFT, LIKE, LOCAL,
MATCH, MINUTE_P, MONTH_P, NAMES, MATCH, MINUTE_P, MONTH_P, NAMES,
NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NOTIFY, NULL_P, NUMERIC, NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULL_P, NUMERIC,
OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P, OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P,
PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC, PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,
READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK, READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,
SCROLL, SECOND_P, SELECT, SET, SUBSTRING, SCROLL, SECOND_P, SELECT, SET, SUBSTRING,
TABLE, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE, TABLE, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE,
TO, TRAILING, TRANSACTION, TRIM, TO, TRAILING, TRANSACTION, TRIM, TRUE_P,
UNION, UNIQUE, UPDATE, USER, USING, UNION, UNIQUE, UPDATE, USER, USING,
VALUES, VARCHAR, VARYING, VIEW, VALUES, VARCHAR, VARYING, VIEW,
WHERE, WITH, WORK, YEAR_P, ZONE WHERE, WITH, WORK, YEAR_P, ZONE
/* Keywords (in SQL3 reserved words) */ /* Keywords (in SQL3 reserved words) */
%token FALSE_P, TRIGGER, TRUE_P %token TRIGGER
/* Keywords (in SQL92 non-reserved words) */ /* Keywords (in SQL92 non-reserved words) */
%token TYPE_P %token TYPE_P
/* Keywords for Postgres support (not in SQL92 reserved words) */ /* Keywords for Postgres support (not in SQL92 reserved words)
%token ABORT_TRANS, AFTER, AGGREGATE, ANALYZE, *
BACKWARD, BEFORE, BINARY, CACHE, CLUSTER, COPY, CYCLE, * The CREATEDB and CREATEUSER tokens should go away
DATABASE, DELIMITERS, DO, EACH, EXPLAIN, EXTEND, * when some sort of pg_privileges relation is introduced.
* - Todd A. Brandys 1998-01-01?
*/
%token ABORT_TRANS, AFTER, AGGREGATE, ANALYZE, BACKWARD, BEFORE, BINARY,
CACHE, CLUSTER, COPY, CREATEDB, CREATEUSER, CYCLE,
DATABASE, DELIMITERS, DO, EACH, ENCODING, EXPLAIN, EXTEND,
FORWARD, FUNCTION, HANDLER, FORWARD, FUNCTION, HANDLER,
INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL, INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL,
LANCOMPILER, LISTEN, UNLISTEN, LOAD, LOCK_P, LOCATION, MAXVALUE, MINVALUE, MOVE, LANCOMPILER, LISTEN, UNLISTEN, LOAD, LOCATION, LOCK_P, MAXVALUE, MINVALUE, MOVE,
NEW, NONE, NOTHING, NOTNULL, OIDS, OPERATOR, PROCEDURAL, NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL,
OIDS, OPERATOR, PASSWORD, PROCEDURAL,
RECIPE, RENAME, RESET, RETURNS, ROW, RULE, RECIPE, RENAME, RESET, RETURNS, ROW, RULE,
SERIAL, SEQUENCE, SETOF, SHOW, START, STATEMENT, STDIN, STDOUT, TRUSTED, SERIAL, SEQUENCE, SETOF, SHOW, START, STATEMENT, STDIN, STDOUT, TRUSTED,
VACUUM, VERBOSE, VERSION, ENCODING UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
/* Keywords (obsolete; retain through next version for parser - thomas 1997-12-0 4) */
%token ARCHIVE
/*
* Tokens for pg_passwd support. The CREATEDB and CREATEUSER tokens should go a way
* when some sort of pg_privileges relation is introduced.
*
* Todd A. Brandys
*/
%token PASSWORD, CREATEDB, NOCREATEDB, CREATEUSER, NOCREATEUSER, VALID, UNTIL
/* Special keywords, not in the query language - see the "lex" file */ /* Special keywords, not in the query language - see the "lex" file */
%token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE %token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE
...@@ -615,7 +610,7 @@ output_statement(char * stmt, int mode) ...@@ -615,7 +610,7 @@ output_statement(char * stmt, int mode)
%type <str> Iconst Fconst Sconst TransactionStmt CreateStmt UserId %type <str> Iconst Fconst Sconst TransactionStmt CreateStmt UserId
%type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt %type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt
%type <str> OptArchiveType OptInherit key_reference key_action %type <str> OptInherit key_reference key_action
%type <str> key_match constraint_expr ColLabel SpecialRuleRelation %type <str> key_match constraint_expr ColLabel SpecialRuleRelation
%type <str> ColId default_expr ColQualifier columnDef ColQualList %type <str> ColId default_expr ColQualifier columnDef ColQualList
%type <str> ColConstraint ColConstraintElem default_list NumericOnly FloatOnly %type <str> ColConstraint ColConstraintElem default_list NumericOnly FloatOnly
...@@ -1059,9 +1054,9 @@ copy_delimiter: USING DELIMITERS Sconst { $$ = cat2_str(make1_str("using delim ...@@ -1059,9 +1054,9 @@ copy_delimiter: USING DELIMITERS Sconst { $$ = cat2_str(make1_str("using delim
*****************************************************************************/ *****************************************************************************/
CreateStmt: CREATE TABLE relation_name '(' OptTableElementList ')' CreateStmt: CREATE TABLE relation_name '(' OptTableElementList ')'
OptInherit OptArchiveType OptInherit
{ {
$$ = cat5_str(make1_str("create table"), $3, make3_str(make1_str("("), $5, make1_str(")")), $7, $8); $$ = cat4_str(make1_str("create table"), $3, make3_str(make1_str("("), $5, make1_str(")")), $7);
} }
; ;
...@@ -1424,14 +1419,6 @@ OptInherit: INHERITS '(' relation_name_list ')' { $$ = make3_str(make1_str("inh ...@@ -1424,14 +1419,6 @@ OptInherit: INHERITS '(' relation_name_list ')' { $$ = make3_str(make1_str("inh
| /*EMPTY*/ { $$ = make1_str(""); } | /*EMPTY*/ { $$ = make1_str(""); }
; ;
/*
* "ARCHIVE" keyword was removed in 6.3, but we keep it for now
* so people can upgrade with old pg_dump scripts. - momjian 1997-11-20(?)
*/
OptArchiveType: ARCHIVE '=' NONE { $$ = make1_str("archive = none"); }
| /*EMPTY*/ { $$ = make1_str(""); }
;
CreateAsStmt: CREATE TABLE relation_name OptCreateAs AS SubSelect CreateAsStmt: CREATE TABLE relation_name OptCreateAs AS SubSelect
{ {
$$ = cat5_str(make1_str("create table"), $3, $4, make1_str("as"), $6); $$ = cat5_str(make1_str("create table"), $3, $4, make1_str("as"), $6);
...@@ -2481,14 +2468,14 @@ CursorStmt: DECLARE name opt_cursor CURSOR FOR ...@@ -2481,14 +2468,14 @@ CursorStmt: DECLARE name opt_cursor CURSOR FOR
/* initial definition */ /* initial definition */
this->next = cur; this->next = cur;
this->name = $2; this->name = $2;
this->command = cat4_str(cat5_str(cat5_str(make1_str("declare"), strdup($2), $3, make1_str("cursor for select"), $7), $8, $9, $10, $11), $12, $13, $14); this->command = cat4_str(cat5_str(cat5_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for select"), $7), $8, $9, $10, $11), $12, $13, $14);
this->argsinsert = argsinsert; this->argsinsert = argsinsert;
this->argsresult = argsresult; this->argsresult = argsresult;
argsinsert = argsresult = NULL; argsinsert = argsresult = NULL;
cur = this; cur = this;
$$ = cat3_str(make1_str("/*"), strdup(this->command), make1_str("*/")); $$ = cat3_str(make1_str("/*"), mm_strdup(this->command), make1_str("*/"));
} }
; ;
...@@ -3847,53 +3834,77 @@ TypeId: ColId ...@@ -3847,53 +3834,77 @@ TypeId: ColId
* list due to shift/reduce conflicts in yacc. If so, move * list due to shift/reduce conflicts in yacc. If so, move
* down to the ColLabel entity. - thomas 1997-11-06 * down to the ColLabel entity. - thomas 1997-11-06
*/ */
ColId: ident { $$ = $1; } ColId: ident { $$ = $1; }
| datetime { $$ = $1; } | datetime { $$ = $1; }
| ABSOLUTE { $$ = make1_str("absolute"); } | ABSOLUTE { $$ = make1_str("absolute"); }
| ACTION { $$ = make1_str("action"); } | ACTION { $$ = make1_str("action"); }
| CACHE { $$ = make1_str("cache"); } | AFTER { $$ = make1_str("after"); }
| CYCLE { $$ = make1_str("cycle"); } | AGGREGATE { $$ = make1_str("aggregate"); }
| DATABASE { $$ = make1_str("database"); } | BACKWARD { $$ = make1_str("backward"); }
| DELIMITERS { $$ = make1_str("delimiters"); } | BEFORE { $$ = make1_str("before"); }
| DOUBLE { $$ = make1_str("double"); } | CACHE { $$ = make1_str("cache"); }
| EACH { $$ = make1_str("each"); } | CREATEDB { $$ = make1_str("createdb"); }
| ENCODING { $$ = make1_str("encoding"); } | CREATEUSER { $$ = make1_str("createuser"); }
| FUNCTION { $$ = make1_str("function"); } | CYCLE { $$ = make1_str("cycle"); }
| INCREMENT { $$ = make1_str("increment"); } | DATABASE { $$ = make1_str("database"); }
| INDEX { $$ = make1_str("index"); } | DELIMITERS { $$ = make1_str("delimiters"); }
| INSENSITIVE { $$ = make1_str("insensitive"); } | DOUBLE { $$ = make1_str("double"); }
| KEY { $$ = make1_str("key"); } | EACH { $$ = make1_str("each"); }
| LANGUAGE { $$ = make1_str("language"); } | ENCODING { $$ = make1_str("encoding"); }
| LOCATION { $$ = make1_str("location"); } | FORWARD { $$ = make1_str("forward"); }
| MATCH { $$ = make1_str("match"); } | FUNCTION { $$ = make1_str("function"); }
| MAXVALUE { $$ = make1_str("maxvalue"); } | HANDLER { $$ = make1_str("handler"); }
| MINVALUE { $$ = make1_str("minvalue"); } | INCREMENT { $$ = make1_str("increment"); }
| NEXT { $$ = make1_str("next"); } | INDEX { $$ = make1_str("index"); }
| OF { $$ = make1_str("of"); } | INHERITS { $$ = make1_str("inherits"); }
| ONLY { $$ = make1_str("only"); } | INSENSITIVE { $$ = make1_str("insensitive"); }
| OPERATOR { $$ = make1_str("operator"); } | INSTEAD { $$ = make1_str("instead"); }
| OPTION { $$ = make1_str("option"); } | ISNULL { $$ = make1_str("isnull"); }
| PASSWORD { $$ = make1_str("password"); } | KEY { $$ = make1_str("key"); }
| PRIOR { $$ = make1_str("prior"); } | LANGUAGE { $$ = make1_str("language"); }
| PRIVILEGES { $$ = make1_str("privileges"); } | LANCOMPILER { $$ = make1_str("lancompiler"); }
| READ { $$ = make1_str("read"); } | LOCATION { $$ = make1_str("location"); }
| RECIPE { $$ = make1_str("recipe"); } | MATCH { $$ = make1_str("match"); }
| RELATIVE { $$ = make1_str("relative"); } | MAXVALUE { $$ = make1_str("maxvalue"); }
| ROW { $$ = make1_str("row"); } | MINVALUE { $$ = make1_str("minvalue"); }
| SCROLL { $$ = make1_str("scroll"); } | NEXT { $$ = make1_str("next"); }
| SERIAL { $$ = make1_str("serial"); } | NOCREATEDB { $$ = make1_str("nocreatedb"); }
| START { $$ = make1_str("start"); } | NOCREATEUSER { $$ = make1_str("nocreateuser"); }
| STATEMENT { $$ = make1_str("statement"); } | NOTHING { $$ = make1_str("nothing"); }
| TIME { $$ = make1_str("time"); } | NOTNULL { $$ = make1_str("notnull"); }
| TIMEZONE_HOUR { $$ = make1_str("timezone_hour"); } | OF { $$ = make1_str("of"); }
| TIMEZONE_MINUTE { $$ = make1_str("timezone_minute"); } | OIDS { $$ = make1_str("oids"); }
| TRIGGER { $$ = make1_str("trigger"); } | ONLY { $$ = make1_str("only"); }
| TYPE_P { $$ = make1_str("type"); } | OPERATOR { $$ = make1_str("operator"); }
| VALID { $$ = make1_str("valid"); } | OPTION { $$ = make1_str("option"); }
| VERSION { $$ = make1_str("version"); } | PASSWORD { $$ = make1_str("password"); }
| ZONE { $$ = make1_str("zone"); } | PRIOR { $$ = make1_str("prior"); }
| PRIVILEGES { $$ = make1_str("privileges"); }
| PROCEDURAL { $$ = make1_str("procedural"); }
| READ { $$ = make1_str("read"); }
| RECIPE { $$ = make1_str("recipe"); }
| RELATIVE { $$ = make1_str("relative"); }
| RENAME { $$ = make1_str("rename"); }
| RETURNS { $$ = make1_str("returns"); }
| ROW { $$ = make1_str("row"); }
| RULE { $$ = make1_str("rule"); }
| SCROLL { $$ = make1_str("scroll"); }
| SEQUENCE { $$ = make1_str("sequence"); }
| SERIAL { $$ = make1_str("serial"); }
| START { $$ = make1_str("start"); }
| STATEMENT { $$ = make1_str("statement"); }
| STDIN { $$ = make1_str("stdin"); }
| STDOUT { $$ = make1_str("stdout"); }
| TIME { $$ = make1_str("time"); }
| TIMEZONE_HOUR { $$ = make1_str("timezone_hour"); }
| TIMEZONE_MINUTE { $$ = make1_str("timezone_minute"); }
| TRIGGER { $$ = make1_str("trigger"); }
| TRUSTED { $$ = make1_str("trusted"); }
| TYPE_P { $$ = make1_str("type"); }
| VALID { $$ = make1_str("valid"); }
| VERSION { $$ = make1_str("version"); }
| ZONE { $$ = make1_str("zone"); }
; ;
/* Column label /* Column label
* Allowed labels in "AS" clauses. * Allowed labels in "AS" clauses.
* Include TRUE/FALSE SQL3 reserved words for Postgres backward * Include TRUE/FALSE SQL3 reserved words for Postgres backward
...@@ -3905,20 +3916,37 @@ ColId: ident { $$ = $1; } ...@@ -3905,20 +3916,37 @@ ColId: ident { $$ = $1; }
* when used as a full identifier. - thomas 1997-11-06 * when used as a full identifier. - thomas 1997-11-06
*/ */
ColLabel: ColId { $$ = $1; } ColLabel: ColId { $$ = $1; }
| ARCHIVE { $$ = make1_str("archive"); } | ABORT_TRANS { $$ = make1_str("abort"); }
| ANALYZE { $$ = make1_str("analyze"); }
| BINARY { $$ = make1_str("binary"); }
| CLUSTER { $$ = make1_str("cluster"); } | CLUSTER { $$ = make1_str("cluster"); }
| CONSTRAINT { $$ = make1_str("constraint"); } | CONSTRAINT { $$ = make1_str("constraint"); }
| COPY { $$ = make1_str("copy"); }
| CROSS { $$ = make1_str("cross"); } | CROSS { $$ = make1_str("cross"); }
| CURRENT { $$ = make1_str("current"); }
| DO { $$ = make1_str("do"); }
| EXPLAIN { $$ = make1_str("explain"); }
| EXTEND { $$ = make1_str("extend"); }
| FALSE_P { $$ = make1_str("false"); }
| FOREIGN { $$ = make1_str("foreign"); } | FOREIGN { $$ = make1_str("foreign"); }
| GROUP { $$ = make1_str("group"); } | GROUP { $$ = make1_str("group"); }
| LISTEN { $$ = make1_str("listen"); }
| LOAD { $$ = make1_str("load"); } | LOAD { $$ = make1_str("load"); }
| LOCK_P { $$ = make1_str("lock"); }
| MOVE { $$ = make1_str("move"); }
| NEW { $$ = make1_str("new"); }
| NONE { $$ = make1_str("none"); }
| ORDER { $$ = make1_str("order"); } | ORDER { $$ = make1_str("order"); }
| POSITION { $$ = make1_str("position"); } | POSITION { $$ = make1_str("position"); }
| PRECISION { $$ = make1_str("precision"); } | PRECISION { $$ = make1_str("precision"); }
| RESET { $$ = make1_str("reset"); }
| SETOF { $$ = make1_str("setof"); }
| SHOW { $$ = make1_str("show"); }
| TABLE { $$ = make1_str("table"); } | TABLE { $$ = make1_str("table"); }
| TRANSACTION { $$ = make1_str("transaction"); } | TRANSACTION { $$ = make1_str("transaction"); }
| TRUE_P { $$ = make1_str("true"); } | TRUE_P { $$ = make1_str("true"); }
| FALSE_P { $$ = make1_str("false"); } | VACUUM { $$ = make1_str("vacuum"); }
| VERBOSE { $$ = make1_str("verbose"); }
; ;
SpecialRuleRelation: CURRENT SpecialRuleRelation: CURRENT
...@@ -3980,7 +4008,7 @@ storage_clause : S_EXTERN { $$ = "extern"; } ...@@ -3980,7 +4008,7 @@ storage_clause : S_EXTERN { $$ = "extern"; }
type: simple_type type: simple_type
{ {
$$.type_enum = $1; $$.type_enum = $1;
$$.type_str = strdup(ECPGtype_name($1)); $$.type_str = mm_strdup(ECPGtype_name($1));
} }
| struct_type | struct_type
{ {
...@@ -4215,7 +4243,7 @@ connection_target: database_name opt_server opt_port ...@@ -4215,7 +4243,7 @@ connection_target: database_name opt_server opt_port
} }
| Sconst | Sconst
{ {
$$ = strdup($1); $$ = mm_strdup($1);
$$[0] = '\"'; $$[0] = '\"';
$$[strlen($$) - 1] = '\"'; $$[strlen($$) - 1] = '\"';
free($1); free($1);
...@@ -4431,7 +4459,7 @@ action : SQL_CONTINUE { ...@@ -4431,7 +4459,7 @@ action : SQL_CONTINUE {
| DO name '(' dotext ')' { | DO name '(' dotext ')' {
$<action>$.code = W_DO; $<action>$.code = W_DO;
$<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")")); $<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")"));
$<action>$.str = cat2_str(make1_str("do"), strdup($<action>$.command)); $<action>$.str = cat2_str(make1_str("do"), mm_strdup($<action>$.command));
} }
| DO SQL_BREAK { | DO SQL_BREAK {
$<action>$.code = W_BREAK; $<action>$.code = W_BREAK;
...@@ -4441,7 +4469,7 @@ action : SQL_CONTINUE { ...@@ -4441,7 +4469,7 @@ action : SQL_CONTINUE {
| SQL_CALL name '(' dotext ')' { | SQL_CALL name '(' dotext ')' {
$<action>$.code = W_DO; $<action>$.code = W_DO;
$<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")")); $<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")"));
$<action>$.str = cat2_str(make1_str("call"), strdup($<action>$.command)); $<action>$.str = cat2_str(make1_str("call"), mm_strdup($<action>$.command));
} }
/* some other stuff for ecpg */ /* some other stuff for ecpg */
......
...@@ -20,6 +20,21 @@ mm_alloc(size_t size) ...@@ -20,6 +20,21 @@ mm_alloc(size_t size)
return ptr; return ptr;
} }
/* strdup + error check */
char *
mm_strdup(const char *string)
{
char *new = strdup(string);
if (new == NULL)
{
fprintf(stderr, "Out of memory\n");
exit(OUT_OF_MEMORY);
}
return new;
}
/* duplicate memberlist */ /* duplicate memberlist */
static struct ECPGstruct_member * static struct ECPGstruct_member *
struct_member_dup(struct ECPGstruct_member * rm) struct_member_dup(struct ECPGstruct_member * rm)
......
...@@ -52,7 +52,7 @@ exec sql declare cur cursor for ...@@ -52,7 +52,7 @@ exec sql declare cur cursor for
while (1) { while (1) {
strcpy(msg, "fetch"); strcpy(msg, "fetch");
exec sql fetch cur into :personal:ind_personal, :married:ind_married; exec sql fetch in cur into :personal:ind_personal, :married:ind_married;
printf ("%8.8s was born %d (age = %d) %s%s\n", personal.name.arr, personal.birth.born, personal.birth.age, ind_married ? "" : "and married ", ind_married ? "" : married); printf ("%8.8s was born %d (age = %d) %s%s\n", personal.name.arr, personal.birth.born, personal.birth.age, ind_married ? "" : "and married ", ind_married ? "" : married);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment