diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 125b1b2ef4f..415bde7d4e5 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -737,3 +737,15 @@ Wed Dec 8 08:26:13 CET 1999 - Clean up error handling. - Set ecpg version to 2.6.11. +Tue Dec 14 07:28:10 CET 1999 + + - Synced preproc.y with gram.y. + - Simplified string handling. + +Wed Dec 15 08:10:52 CET 1999 + + - Fixed typo in parser. + - Included Bruce's patch to fix two more memory leaks in libecpg. + - Some cleanup in libecpg. + - Set library version to 3.0.9. + - Set ecpg version to 2.6.12. diff --git a/src/interfaces/ecpg/lib/Makefile.in b/src/interfaces/ecpg/lib/Makefile.in index ed3df4625a4..2c74b31b04a 100644 --- a/src/interfaces/ecpg/lib/Makefile.in +++ b/src/interfaces/ecpg/lib/Makefile.in @@ -6,13 +6,13 @@ # Copyright (c) 1994, Regents of the University of California # # IDENTIFICATION -# $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/Makefile.in,v 1.53 1999/12/07 10:29:16 meskes Exp $ +# $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/Makefile.in,v 1.54 1999/12/16 06:53:10 meskes Exp $ # #------------------------------------------------------------------------- NAME= ecpg SO_MAJOR_VERSION= 3 -SO_MINOR_VERSION= 0.8 +SO_MINOR_VERSION= 0.9 SRCDIR= @top_srcdir@ include $(SRCDIR)/Makefile.global diff --git a/src/interfaces/ecpg/lib/ecpglib.c b/src/interfaces/ecpg/lib/ecpglib.c index 3d6fd056230..4c0134c3933 100644 --- a/src/interfaces/ecpg/lib/ecpglib.c +++ b/src/interfaces/ecpg/lib/ecpglib.c @@ -230,13 +230,14 @@ static char * quote_postgres(char *arg, int lineno) { - char *res = (char *) ecpg_alloc(2 * strlen(arg) + 1, lineno); + char *res = (char *) ecpg_alloc(2 * strlen(arg) + 3, lineno); int i, - ri; + ri = 0; if (!res) return (res); + res[ri++] = '\''; for (i = 0, ri = 0; arg[i]; i++, ri++) { switch (arg[i]) @@ -253,6 +254,7 @@ quote_postgres(char *arg, int lineno) res[ri] = arg[i]; } + res[ri++] = '\''; res[ri] = '\0'; return res; @@ -498,7 +500,6 @@ ECPGexecute(struct statement * stmt) { /* set slen to string length if type is char * */ int slen = (var->varcharsize == 0) ? strlen((char *) var->value) : var->varcharsize; - char *tmp; if (!(newcopy = ecpg_alloc(slen + 1, stmt->lineno))) return false; @@ -506,19 +507,10 @@ ECPGexecute(struct statement * stmt) strncpy(newcopy, (char *) var->value, slen); newcopy[slen] = '\0'; - if (!(mallocedval = (char *) ecpg_alloc(2 * strlen(newcopy) + 3, stmt->lineno))) + mallocedval = quote_postgres(newcopy, stmt->lineno); + if (!mallocedval) return false; - strcpy(mallocedval, "'"); - tmp = quote_postgres(newcopy, stmt->lineno); - if (!tmp) - return false; - - strcat(mallocedval, tmp); - free(tmp); - - strcat(mallocedval, "'"); - free(newcopy); tobeinserted = mallocedval; @@ -541,7 +533,6 @@ ECPGexecute(struct statement * stmt) { struct ECPGgeneric_varchar *variable = (struct ECPGgeneric_varchar *) (var->value); - char *tmp; if (!(newcopy = (char *) ecpg_alloc(variable->len + 1, stmt->lineno))) return false; @@ -549,19 +540,10 @@ ECPGexecute(struct statement * stmt) strncpy(newcopy, variable->arr, variable->len); newcopy[variable->len] = '\0'; - if (!(mallocedval = (char *) ecpg_alloc(2 * strlen(newcopy) + 3, stmt->lineno))) + mallocedval = quote_postgres(newcopy, stmt->lineno); + if (!mallocedval) return false; - strcpy(mallocedval, "'"); - tmp = quote_postgres(newcopy, stmt->lineno); - if (!tmp) - return false; - - strcat(mallocedval, tmp); - free(tmp); - - strcat(mallocedval, "'"); - free(newcopy); tobeinserted = mallocedval; @@ -1127,18 +1109,16 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction) if (strcmp(transaction, "commit") == 0 || strcmp(transaction, "rollback") == 0) { - struct prepared_statement *this; - con->committed = true; /* deallocate all prepared statements */ - while(prep_stmts != NULL) { + while(prep_stmts != NULL) + { bool b = ECPGdeallocate(lineno, prep_stmts->name); if (!b) return false; } - } return true; @@ -1415,7 +1395,7 @@ ECPGdeallocate(int lineno, char *name) prev->next = this->next; else prep_stmts = this->next; - + free(this); return true; } diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile index 9e08e7a6940..1873d13ce97 100644 --- a/src/interfaces/ecpg/preproc/Makefile +++ b/src/interfaces/ecpg/preproc/Makefile @@ -3,7 +3,7 @@ include $(SRCDIR)/Makefile.global MAJOR_VERSION=2 MINOR_VERSION=6 -PATCHLEVEL=11 +PATCHLEVEL=12 CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \ -DMINOR_VERSION=$(MINOR_VERSION) -DPATCHLEVEL=$(PATCHLEVEL) \ diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index a2ac1149de2..2ba33e05d0e 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -1,5 +1,7 @@ /* Copyright comment */ %{ +#include + #include "postgres.h" #include "access/htup.h" #include "catalog/catname.h" @@ -14,7 +16,7 @@ #endif #define STRUCT_DEPTH 128 -#define EMPTY make1_str("") +#define EMPTY make_str("") /* * Variables containing simple states. @@ -400,7 +402,40 @@ check_indicator(struct ECPGtype *var) } static char * -make1_str(const char *str) +cat2_str(char *str1, char *str2) +{ + char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 2); + + strcpy(res_str, str1); + strcat(res_str, " "); + strcat(res_str, str2); + free(str1); + free(str2); + return(res_str); +} + +static char * +cat_str(int count, ...) +{ + va_list args; + int i; + char *res_str; + + va_start(args, count); + + res_str = va_arg(args, char *); + + /* now add all other strings */ + for (i = 1; i < count; i++) + res_str = cat2_str(res_str, va_arg(args, char *)); + + va_end(args); + + return(res_str); +} + +static char * +make_str(const char *str) { char * res_str = (char *)mm_alloc(strlen(str) + 1); @@ -421,123 +456,19 @@ make2_str(char *str1, char *str2) } static char * -cat2_str(char *str1, char *str2) +make3_str(char *str1, char *str2, char *str3) { - char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 2); + char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) +strlen(str3) + 1); strcpy(res_str, str1); - strcat(res_str, " "); strcat(res_str, str2); + strcat(res_str, str3); free(str1); free(str2); + free(str3); return(res_str); } -static char * -make3_str(char *str1, char *str2, char * str3) -{ - char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + 1); - - strcpy(res_str, str1); - strcat(res_str, str2); - strcat(res_str, str3); - free(str1); - free(str2); - free(str3); - return(res_str); -} - -static char * -cat3_str(char *str1, char *str2, char * str3) -{ - char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + 3); - - strcpy(res_str, str1); - strcat(res_str, " "); - strcat(res_str, str2); - strcat(res_str, " "); - strcat(res_str, str3); - free(str1); - free(str2); - free(str3); - return(res_str); -} - -static char * -make4_str(char *str1, char *str2, char *str3, char *str4) -{ - char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + 1); - - strcpy(res_str, str1); - strcat(res_str, str2); - strcat(res_str, str3); - strcat(res_str, str4); - free(str1); - free(str2); - free(str3); - free(str4); - return(res_str); -} - -static char * -cat4_str(char *str1, char *str2, char *str3, char *str4) -{ - char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + 4); - - strcpy(res_str, str1); - strcat(res_str, " "); - strcat(res_str, str2); - strcat(res_str, " "); - strcat(res_str, str3); - strcat(res_str, " "); - strcat(res_str, str4); - free(str1); - free(str2); - free(str3); - free(str4); - return(res_str); -} - -static char * -make5_str(char *str1, char *str2, char *str3, char *str4, char *str5) -{ - char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 1); - - strcpy(res_str, str1); - strcat(res_str, str2); - strcat(res_str, str3); - strcat(res_str, str4); - strcat(res_str, str5); - free(str1); - free(str2); - free(str3); - free(str4); - free(str5); - return(res_str); -} - -static char * -cat5_str(char *str1, char *str2, char *str3, char *str4, char *str5) -{ - char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 5); - - strcpy(res_str, str1); - strcat(res_str, " "); - strcat(res_str, str2); - strcat(res_str, " "); - strcat(res_str, str3); - strcat(res_str, " "); - strcat(res_str, str4); - strcat(res_str, " "); - strcat(res_str, str5); - free(str1); - free(str2); - free(str3); - free(str4); - free(str5); - return(res_str); -} - static char * make_name(void) { @@ -795,18 +726,17 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim %right UMINUS %left '.' %left '[' ']' -%nonassoc TYPECAST +%left TYPECAST %left UNION INTERSECT EXCEPT %type Iconst Fconst Sconst TransactionStmt CreateStmt UserId %type CreateAsElement OptCreateAs CreateAsList CreateAsStmt %type OptInherit key_reference key_action comment_text -%type key_match ColLabel SpecialRuleRelation -%type ColId ColQualifier columnDef ColQualList +%type key_match ColLabel SpecialRuleRelation ColId columnDef %type ColConstraint ColConstraintElem NumericOnly FloatOnly %type OptTableElementList OptTableElement TableConstraint %type ConstraintElem key_actions ColPrimaryKey -%type target_list target_el update_target_list +%type target_list target_el update_target_list ColConstraintList %type update_target_el opt_id relation_name database_name %type access_method attr_name class index_name name func_name %type file_name AexprConst ParamNo TypeId com_expr @@ -825,7 +755,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim %type table_list join_outer where_clause relation_expr sub_type %type opt_column_list insert_rest InsertStmt OptimizableStmt %type columnList DeleteStmt LockStmt UpdateStmt CursorStmt -%type NotifyStmt columnElem copy_dirn UnlistenStmt +%type NotifyStmt columnElem copy_dirn UnlistenStmt copy_null %type copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary %type opt_with_copy FetchStmt opt_direction fetch_how_many opt_portal_name %type ClosePortalStmt DropStmt VacuumStmt opt_verbose @@ -1081,13 +1011,13 @@ CreateUserStmt: CREATE USER UserId user_createdb_clause user_createuser_clause user_group_clause user_valid_clause { - $$ = cat2_str(cat5_str(make1_str("create user"), $3, $4, $5, $6), $7); + $$ = cat_str(6, make_str("create user"), $3, $4, $5, $6, $7); } | CREATE USER UserId WITH sysid_clause user_passwd_clause user_createdb_clause user_createuser_clause user_group_clause user_valid_clause { - $$ = cat5_str(cat5_str(make1_str("create user"), $3, make1_str("with"), $5, $6), $7, $8, $9, $10); + $$ = cat_str(9, make_str("create user"), $3, make_str("with"), $5, $6, $7, $8, $9, $10); } ; @@ -1101,13 +1031,13 @@ CreateUserStmt: CREATE USER UserId AlterUserStmt: ALTER USER UserId user_createdb_clause user_createuser_clause user_group_clause user_valid_clause { - $$ = cat2_str(cat5_str(make1_str("alter user"), $3, $4, $5, $6), $7); + $$ = cat_str(6, make_str("alter user"), $3, $4, $5, $6, $7); } |ALTER USER UserId WITH sysid_clause user_passwd_clause user_createdb_clause user_createuser_clause user_group_clause user_valid_clause { - $$ = cat5_str(cat5_str(make1_str("alter user"), $3, make1_str("with"), $5, $6), $7, $8, $9, $10); + $$ = cat_str(9, make_str("alter user"), $3, make_str("with"), $5, $6, $7, $8, $9, $10); } ; @@ -1120,43 +1050,43 @@ AlterUserStmt: ALTER USER UserId user_createdb_clause DropUserStmt: DROP USER UserId { - $$ = cat2_str(make1_str("drop user"), $3); + $$ = cat2_str(make_str("drop user"), $3); } ; -user_passwd_clause: PASSWORD UserId { $$ = cat2_str(make1_str("password") , $2); } +user_passwd_clause: PASSWORD UserId { $$ = cat2_str(make_str("password") , $2); } | /*EMPTY*/ { $$ = EMPTY; } ; -sysid_clause: SYSID Iconst { $$ = cat2_str(make1_str("sysid"), $2); } +sysid_clause: SYSID Iconst { $$ = cat2_str(make_str("sysid"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ; user_createdb_clause: CREATEDB { - $$ = make1_str("createdb"); + $$ = make_str("createdb"); } | NOCREATEDB { - $$ = make1_str("nocreatedb"); + $$ = make_str("nocreatedb"); } | /*EMPTY*/ { $$ = EMPTY; } ; user_createuser_clause: CREATEUSER { - $$ = make1_str("createuser"); + $$ = make_str("createuser"); } | NOCREATEUSER { - $$ = make1_str("nocreateuser"); + $$ = make_str("nocreateuser"); } | /*EMPTY*/ { $$ = NULL; } ; user_group_list: user_group_list ',' UserId { - $$ = cat3_str($1, make1_str(","), $3); + $$ = cat_str(3, $1, make_str(","), $3); } | UserId { @@ -1170,12 +1100,12 @@ user_group_clause: IN GROUP user_group_list * so an warning message is probably fairer */ mmerror(ET_WARN, "IN GROUP is not implemented"); - $$ = cat2_str(make1_str("in group"), $3); + $$ = cat2_str(make_str("in group"), $3); } | /*EMPTY*/ { $$ = EMPTY; } ; -user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make1_str("valid until"), $3); } +user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make_str("valid until"), $3); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -1190,81 +1120,81 @@ user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make1_str("valid until" VariableSetStmt: SET ColId TO var_value { - $$ = cat4_str(make1_str("set"), $2, make1_str("to"), $4); + $$ = cat_str(4, make_str("set"), $2, make_str("to"), $4); } | SET ColId '=' var_value { - $$ = cat4_str(make1_str("set"), $2, make1_str("="), $4); + $$ = cat_str(4, make_str("set"), $2, make_str("="), $4); } | SET TIME ZONE zone_value { - $$ = cat2_str(make1_str("set time zone"), $4); + $$ = cat2_str(make_str("set time zone"), $4); } | SET TRANSACTION ISOLATION LEVEL opt_level { - $$ = cat2_str(make1_str("set transaction isolation level"), $5); + $$ = cat2_str(make_str("set transaction isolation level"), $5); } | SET NAMES encoding { #ifdef MULTIBYTE - $$ = cat2_str(make1_str("set names"), $3); + $$ = cat2_str(make_str("set names"), $3); #else mmerror(ET_ERROR, "SET NAMES is not supported"); #endif } ; -opt_level: READ COMMITTED { $$ = make1_str("read committed"); } - | SERIALIZABLE { $$ = make1_str("serializable"); } +opt_level: READ COMMITTED { $$ = make_str("read committed"); } + | SERIALIZABLE { $$ = make_str("serializable"); } ; var_value: Sconst { $$ = $1; } - | DEFAULT { $$ = make1_str("default"); } + | DEFAULT { $$ = make_str("default"); } ; zone_value: Sconst { $$ = $1; } - | DEFAULT { $$ = make1_str("default"); } - | LOCAL { $$ = make1_str("local"); } + | DEFAULT { $$ = make_str("default"); } + | LOCAL { $$ = make_str("local"); } ; VariableShowStmt: SHOW ColId { - $$ = cat2_str(make1_str("show"), $2); + $$ = cat2_str(make_str("show"), $2); } | SHOW TIME ZONE { - $$ = make1_str("show time zone"); + $$ = make_str("show time zone"); } | SHOW TRANSACTION ISOLATION LEVEL { - $$ = make1_str("show transaction isolation level"); + $$ = make_str("show transaction isolation level"); } ; VariableResetStmt: RESET ColId { - $$ = cat2_str(make1_str("reset"), $2); + $$ = cat2_str(make_str("reset"), $2); } | RESET TIME ZONE { - $$ = make1_str("reset time zone"); + $$ = make_str("reset time zone"); } | RESET TRANSACTION ISOLATION LEVEL { - $$ = make1_str("reset transaction isolation level"); + $$ = make_str("reset transaction isolation level"); } ; ConstraintsSetStmt: SET CONSTRAINTS constraints_set_list constraints_set_mode { - $$ = cat3_str(make1_str("set constraints"), $3, $4); + $$ = cat_str(3, make_str("set constraints"), $3, $4); } ; constraints_set_list: ALL { - $$ = make1_str("all"); + $$ = make_str("all"); } | constraints_set_namelist { @@ -1279,17 +1209,17 @@ constraints_set_namelist: IDENT } | constraints_set_namelist ',' IDENT { - $$ = cat3_str($1, make1_str(","), $3); + $$ = cat_str(3, $1, make_str(","), $3); } ; constraints_set_mode: DEFERRED { - $$ = make1_str("deferred"); + $$ = make_str("deferred"); } | IMMEDIATE { - $$ = make1_str("immediate"); + $$ = make_str("immediate"); } ; @@ -1302,17 +1232,17 @@ constraints_set_mode: DEFERRED AddAttrStmt: ALTER TABLE relation_name opt_inh_star alter_clause { - $$ = cat4_str(make1_str("alter table"), $3, $4, $5); + $$ = cat_str(4, make_str("alter table"), $3, $4, $5); } ; alter_clause: ADD opt_column columnDef { - $$ = cat3_str(make1_str("add"), $2, $3); + $$ = cat_str(3, make_str("add"), $2, $3); } | ADD '(' OptTableElementList ')' { - $$ = make3_str(make1_str("add("), $3, make1_str(")")); + $$ = cat_str(2, make_str("add("), $3, make_str(")")); } | DROP opt_column ColId { mmerror(ET_ERROR, "ALTER TABLE/DROP COLUMN not yet implemented"); } @@ -1333,7 +1263,7 @@ alter_clause: ADD opt_column columnDef ClosePortalStmt: CLOSE opt_id { - $$ = cat2_str(make1_str("close"), $2); + $$ = cat2_str(make_str("close"), $2); } ; @@ -1349,16 +1279,16 @@ opt_id: ColId { $$ = $1; } * *****************************************************************************/ -CopyStmt: COPY opt_binary relation_name opt_with_copy copy_dirn copy_file_name copy_delimiter +CopyStmt: COPY opt_binary relation_name opt_with_copy copy_dirn copy_file_name copy_delimiter copy_null { - $$ = cat3_str(cat5_str(make1_str("copy"), $2, $3, $4, $5), $6, $7); + $$ = cat_str(8, make_str("copy"), $2, $3, $4, $5, $6, $7, $8); } ; copy_dirn: TO - { $$ = make1_str("to"); } + { $$ = make_str("to"); } | FROM - { $$ = make1_str("from"); } + { $$ = make_str("from"); } ; /* @@ -1367,27 +1297,32 @@ copy_dirn: TO * stdout. We silently correct the "typo". - AY 9/94 */ copy_file_name: Sconst { $$ = $1; } - | STDIN { $$ = make1_str("stdin"); } - | STDOUT { $$ = make1_str("stdout"); } + | STDIN { $$ = make_str("stdin"); } + | STDOUT { $$ = make_str("stdout"); } ; -opt_binary: BINARY { $$ = make1_str("binary"); } +opt_binary: BINARY { $$ = make_str("binary"); } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_with_copy: WITH OIDS { $$ = make1_str("with oids"); } +opt_with_copy: WITH OIDS { $$ = make_str("with oids"); } | /*EMPTY*/ { $$ = EMPTY; } ; /* * the default copy delimiter is tab but the user can configure it */ -copy_delimiter: opt_using DELIMITERS Sconst { $$ = cat3_str($1, make1_str("delimiters"), $3); } +copy_delimiter: opt_using DELIMITERS Sconst { $$ = cat_str(3, $1, make_str("delimiters"), $3); } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_using: USING { $$ = make1_str("using"); } +opt_using: USING { $$ = make_str("using"); } | /* EMPTY */ { $$ = EMPTY; } + ; + +copy_null: WITH NULL_P AS Sconst { $$ = cat2_str(make_str("with null as"), $4); } + | /* EMPTY */ { $$ = EMPTY; } + ; /***************************************************************************** * @@ -1399,7 +1334,7 @@ opt_using: USING { $$ = make1_str("using"); } CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')' OptInherit { - $$ = cat3_str(cat4_str(make1_str("create"), $2, make1_str("table"), $4), make3_str(make1_str("("), $6, make1_str(")")), $8); + $$ = cat_str(8, make_str("create"), $2, make_str("table"), $4, make_str("("), $6, make_str(")"), $8); } ; @@ -1407,23 +1342,23 @@ OptTemp: OptTempType { $$ = $1; } | OptTempScope OptTempType { $$ = cat2_str($1,$2); } ; -OptTempType: TEMP { $$ = make1_str("temp"); } - | TEMPORARY { $$ = make1_str("temporary"); } +OptTempType: TEMP { $$ = make_str("temp"); } + | TEMPORARY { $$ = make_str("temporary"); } | /* EMPTY */ { $$ = EMPTY; } ; OptTempScope: GLOBAL { mmerror(ET_ERROR, "GLOBAL TEMPORARY TABLE is not currently supported"); - $$ = make1_str("global"); + $$ = make_str("global"); } - | LOCAL { $$ = make1_str("local"); } + | LOCAL { $$ = make_str("local"); } ; OptTableElementList: OptTableElementList ',' OptTableElement { - $$ = cat3_str($1, make1_str(","), $3); + $$ = cat_str(3, $1, make_str(","), $3); } | OptTableElement { @@ -1436,27 +1371,23 @@ OptTableElement: columnDef { $$ = $1; } | TableConstraint { $$ = $1; } ; -columnDef: ColId Typename ColQualifier +columnDef: ColId Typename ColConstraintList { - $$ = cat3_str($1, $2, $3); + $$ = cat_str(3, $1, $2, $3); } | ColId SERIAL ColPrimaryKey { - $$ = make3_str($1, make1_str(" serial "), $3); + $$ = cat_str(3, $1, make_str(" serial "), $3); } ; -ColQualifier: ColQualList { $$ = $1; } - | /*EMPTY*/ { $$ = EMPTY; } - ; - -ColQualList: ColQualList ColConstraint { $$ = cat2_str($1,$2); } - | ColConstraint { $$ = $1; } +ColConstraintList: ColConstraintList ColConstraint { $$ = cat2_str($1,$2); } + | /* EMPTY */ { $$ = EMPTY; } ; ColPrimaryKey: PRIMARY KEY { - $$ = make1_str("primary key"); + $$ = make_str("primary key"); } | /*EMPTY*/ { @@ -1467,7 +1398,7 @@ ColPrimaryKey: PRIMARY KEY ColConstraint: CONSTRAINT name ColConstraintElem { - $$ = cat3_str(make1_str("constraint"), $2, $3); + $$ = cat_str(3, make_str("constraint"), $2, $3); } | ColConstraintElem { $$ = $1; } @@ -1491,31 +1422,31 @@ ColConstraint: */ ColConstraintElem: CHECK '(' a_expr ')' { - $$ = make3_str(make1_str("check("), $3, make1_str(")")); + $$ = cat_str(3, make_str("check("), $3, make_str(")")); } | DEFAULT NULL_P { - $$ = make1_str("default null"); + $$ = make_str("default null"); } | DEFAULT b_expr { - $$ = cat2_str(make1_str("default"), $2); + $$ = cat2_str(make_str("default"), $2); } | NOT NULL_P { - $$ = make1_str("not null"); + $$ = make_str("not null"); } | UNIQUE { - $$ = make1_str("unique"); + $$ = make_str("unique"); } | PRIMARY KEY { - $$ = make1_str("primary key"); + $$ = make_str("primary key"); } | REFERENCES ColId opt_column_list key_match key_actions { - $$ = cat5_str(make1_str("references"), $2, $3, $4, $5); + $$ = cat_str(5, make_str("references"), $2, $3, $4, $5); } ; @@ -1525,7 +1456,7 @@ ColConstraintElem: CHECK '(' a_expr ')' */ TableConstraint: CONSTRAINT name ConstraintElem { - $$ = cat3_str(make1_str("constraint"), $2, $3); + $$ = cat_str(3, make_str("constraint"), $2, $3); } | ConstraintElem { $$ = $1; } @@ -1533,30 +1464,30 @@ TableConstraint: CONSTRAINT name ConstraintElem ConstraintElem: CHECK '(' a_expr ')' { - $$ = make3_str(make1_str("check("), $3, make1_str(")")); + $$ = cat_str(3, make_str("check("), $3, make_str(")")); } | UNIQUE '(' columnList ')' { - $$ = make3_str(make1_str("unique("), $3, make1_str(")")); + $$ = cat_str(3, make_str("unique("), $3, make_str(")")); } | PRIMARY KEY '(' columnList ')' { - $$ = make3_str(make1_str("primary key("), $4, make1_str(")")); + $$ = cat_str(3, make_str("primary key("), $4, make_str(")")); } | FOREIGN KEY '(' columnList ')' REFERENCES ColId opt_column_list key_match key_actions { - $$ = cat3_str(cat5_str(make1_str("foreign key("), $4, make1_str(") references"), $7, $8), $9, $10); + $$ = cat_str(7, make_str("foreign key("), $4, make_str(") references"), $7, $8, $9, $10); } ; key_match: MATCH FULL { - $$ = make1_str("match full"); + $$ = make_str("match full"); } | MATCH PARTIAL { mmerror(ET_WARN, "FOREIGN KEY match type PARTIAL not implemented yet"); - $$ = make1_str("match partial"); + $$ = make_str("match partial"); } | /*EMPTY*/ { @@ -1570,18 +1501,18 @@ key_actions: key_action key_action { $$ = cat2_str($1, $2); } | /*EMPTY*/ { $$ = EMPTY; } ; -key_action: ON DELETE key_reference { $$ = cat2_str(make1_str("on delete"), $3); } - | ON UPDATE key_reference { $$ = cat2_str(make1_str("on update"), $3); } +key_action: ON DELETE key_reference { $$ = cat2_str(make_str("on delete"), $3); } + | ON UPDATE key_reference { $$ = cat2_str(make_str("on update"), $3); } ; -key_reference: NO ACTION { $$ = make1_str("no action"); } - | RESTRICT { $$ = make1_str("restrict"); } - | CASCADE { $$ = make1_str("cascade"); } - | SET DEFAULT { $$ = make1_str("set default"); } - | SET NULL_P { $$ = make1_str("set null"); } +key_reference: NO ACTION { $$ = make_str("no action"); } + | RESTRICT { $$ = make_str("restrict"); } + | CASCADE { $$ = make_str("cascade"); } + | SET DEFAULT { $$ = make_str("set default"); } + | SET NULL_P { $$ = make_str("set null"); } ; -OptInherit: INHERITS '(' relation_name_list ')' { $$ = make3_str(make1_str("inherits ("), $3, make1_str(")")); } +OptInherit: INHERITS '(' relation_name_list ')' { $$ = cat_str(3, make_str("inherits ("), $3, make_str(")")); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -1595,15 +1526,15 @@ CreateAsStmt: CREATE OptTemp TABLE relation_name OptCreateAs AS SelectStmt if (FoundInto == 1) mmerror(ET_ERROR, "CREATE TABLE/AS SELECT may not specify INTO"); - $$ = cat5_str(cat3_str(make1_str("create"), $2, make1_str("table")), $4, $5, make1_str("as"), $7); + $$ = cat_str(7, make_str("create"), $2, make_str("table"), $4, $5, make_str("as"), $7); } ; -OptCreateAs: '(' CreateAsList ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); } +OptCreateAs: '(' CreateAsList ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } | /*EMPTY*/ { $$ = EMPTY; } ; -CreateAsList: CreateAsList ',' CreateAsElement { $$ = cat3_str($1, make1_str(","), $3); } +CreateAsList: CreateAsList ',' CreateAsElement { $$ = cat_str(3, $1, make_str(","), $3); } | CreateAsElement { $$ = $1; } ; @@ -1619,7 +1550,7 @@ CreateAsElement: ColId { $$ = $1; } CreateSeqStmt: CREATE SEQUENCE relation_name OptSeqList { - $$ = cat3_str(make1_str("create sequence"), $3, $4); + $$ = cat_str(3, make_str("create sequence"), $3, $4); } ; @@ -1630,27 +1561,27 @@ OptSeqList: OptSeqList OptSeqElem OptSeqElem: CACHE IntegerOnly { - $$ = cat2_str(make1_str("cache"), $2); + $$ = cat2_str(make_str("cache"), $2); } | CYCLE { - $$ = make1_str("cycle"); + $$ = make_str("cycle"); } | INCREMENT IntegerOnly { - $$ = cat2_str(make1_str("increment"), $2); + $$ = cat2_str(make_str("increment"), $2); } | MAXVALUE IntegerOnly { - $$ = cat2_str(make1_str("maxvalue"), $2); + $$ = cat2_str(make_str("maxvalue"), $2); } | MINVALUE IntegerOnly { - $$ = cat2_str(make1_str("minvalue"), $2); + $$ = cat2_str(make_str("minvalue"), $2); } | START IntegerOnly { - $$ = cat2_str(make1_str("start"), $2); + $$ = cat2_str(make_str("start"), $2); } ; @@ -1663,7 +1594,7 @@ FloatOnly: Fconst } | '-' Fconst { - $$ = cat2_str(make1_str("-"), $2); + $$ = cat2_str(make_str("-"), $2); } ; @@ -1674,7 +1605,7 @@ IntegerOnly: Iconst } | '-' Iconst { - $$ = cat2_str(make1_str("-"), $2); + $$ = cat2_str(make_str("-"), $2); } ; @@ -1689,16 +1620,16 @@ IntegerOnly: Iconst CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE Sconst HANDLER def_name LANCOMPILER Sconst { - $$ = cat4_str(cat5_str(make1_str("create"), $2, make1_str("precedural language"), $5, make1_str("handler")), $7, make1_str("langcompiler"), $9); + $$ = cat_str(8, make_str("create"), $2, make_str("precedural language"), $5, make_str("handler"), $7, make_str("langcompiler"), $9); } ; -PLangTrusted: TRUSTED { $$ = make1_str("trusted"); } +PLangTrusted: TRUSTED { $$ = make_str("trusted"); } | { $$ = EMPTY; } DropPLangStmt: DROP PROCEDURAL LANGUAGE Sconst { - $$ = cat2_str(make1_str("drop procedural language"), $4); + $$ = cat2_str(make_str("drop procedural language"), $4); } ; @@ -1714,7 +1645,7 @@ CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON relation_name TriggerForSpec EXECUTE PROCEDURE name '(' TriggerFuncArgs ')' { - $$ = cat2_str(cat5_str(cat5_str(make1_str("create trigger"), $3, $4, $5, make1_str("on")), $7, $8, make1_str("execute procedure"), $11), make3_str(make1_str("("), $13, make1_str(")"))); + $$ = cat_str(12, make_str("create trigger"), $3, $4, $5, make_str("on"), $7, $8, make_str("execute procedure"), $11, make_str("("), $13, make_str(")")); } | CREATE CONSTRAINT TRIGGER name AFTER TriggerOneEvent ON relation_name OptConstrFromTable @@ -1722,12 +1653,12 @@ CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON FOR EACH ROW EXECUTE PROCEDURE name '(' TriggerFuncArgs ')' { - $$ = cat5_str(cat5_str(cat5_str(make1_str("create constraint trigger"), $4, make1_str("after"), $6, make1_str("on")), $8, $9, $10, make1_str("for each row execute procedure")), $16, make1_str("("), $18, make1_str(")")); + $$ = cat_str(13, make_str("create constraint trigger"), $4, make_str("after"), $6, make_str("on"), $8, $9, $10, make_str("for each row execute procedure"), $16, make_str("("), $18, make_str(")")); } ; -TriggerActionTime: BEFORE { $$ = make1_str("before"); } - | AFTER { $$ = make1_str("after"); } +TriggerActionTime: BEFORE { $$ = make_str("before"); } + | AFTER { $$ = make_str("after"); } ; TriggerEvents: TriggerOneEvent @@ -1736,37 +1667,37 @@ TriggerEvents: TriggerOneEvent } | TriggerOneEvent OR TriggerOneEvent { - $$ = cat3_str($1, make1_str("or"), $3); + $$ = cat_str(3, $1, make_str("or"), $3); } | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent { - $$ = cat5_str($1, make1_str("or"), $3, make1_str("or"), $5); + $$ = cat_str(5, $1, make_str("or"), $3, make_str("or"), $5); } ; -TriggerOneEvent: INSERT { $$ = make1_str("insert"); } - | DELETE { $$ = make1_str("delete"); } - | UPDATE { $$ = make1_str("update"); } +TriggerOneEvent: INSERT { $$ = make_str("insert"); } + | DELETE { $$ = make_str("delete"); } + | UPDATE { $$ = make_str("update"); } ; TriggerForSpec: FOR TriggerForOpt TriggerForType { - $$ = cat3_str(make1_str("for"), $2, $3); + $$ = cat_str(3, make_str("for"), $2, $3); } ; -TriggerForOpt: EACH { $$ = make1_str("each"); } +TriggerForOpt: EACH { $$ = make_str("each"); } | /*EMPTY*/ { $$ = EMPTY; } ; -TriggerForType: ROW { $$ = make1_str("row"); } - | STATEMENT { $$ = make1_str("statement"); } +TriggerForType: ROW { $$ = make_str("row"); } + | STATEMENT { $$ = make_str("statement"); } ; TriggerFuncArgs: TriggerFuncArg { $$ = $1; } | TriggerFuncArgs ',' TriggerFuncArg - { $$ = cat3_str($1, make1_str(","), $3); } + { $$ = cat_str(3, $1, make_str(","), $3); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -1789,7 +1720,7 @@ OptConstrFromTable: /* Empty */ } | FROM relation_name { - $$ = cat2_str(make1_str("from"), $2); + $$ = cat2_str(make_str("from"), $2); } ; @@ -1817,27 +1748,27 @@ ConstraintAttributeSpec: /* Empty */ ConstraintDeferrabilitySpec: NOT DEFERRABLE { - $$ = make1_str("not deferrable"); + $$ = make_str("not deferrable"); } | DEFERRABLE { - $$ = make1_str("deferrable"); + $$ = make_str("deferrable"); } ; ConstraintTimeSpec: INITIALLY IMMEDIATE { - $$ = make1_str("initially immediate"); + $$ = make_str("initially immediate"); } | INITIALLY DEFERRED { - $$ = make1_str("initially deferrable"); + $$ = make_str("initially deferrable"); } ; DropTrigStmt: DROP TRIGGER name ON relation_name { - $$ = cat4_str(make1_str("drop trigger"), $3, make1_str("on"), $5); + $$ = cat_str(4, make_str("drop trigger"), $3, make_str("on"), $5); } ; @@ -1850,7 +1781,7 @@ DropTrigStmt: DROP TRIGGER name ON relation_name DefineStmt: CREATE def_type def_rest { - $$ = cat3_str(make1_str("create"), $2, $3); + $$ = cat_str(3, make_str("create"), $2, $3); } ; @@ -1860,26 +1791,26 @@ def_rest: def_name definition } ; -def_type: OPERATOR { $$ = make1_str("operator"); } - | TYPE_P { $$ = make1_str("type"); } - | AGGREGATE { $$ = make1_str("aggregate"); } +def_type: OPERATOR { $$ = make_str("operator"); } + | TYPE_P { $$ = make_str("type"); } + | AGGREGATE { $$ = make_str("aggregate"); } ; -def_name: PROCEDURE { $$ = make1_str("procedure"); } - | JOIN { $$ = make1_str("join"); } +def_name: PROCEDURE { $$ = make_str("procedure"); } + | JOIN { $$ = make_str("join"); } | ColId { $$ = $1; } | all_Op { $$ = $1; } ; -definition: '(' def_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); } +definition: '(' def_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } ; def_list: def_elem { $$ = $1; } - | def_list ',' def_elem { $$ = cat3_str($1, make1_str(","), $3); } + | def_list ',' def_elem { $$ = cat_str(3, $1, make_str(","), $3); } ; def_elem: def_name '=' def_arg { - $$ = cat3_str($1, make1_str("="), $3); + $$ = cat_str(3, $1, make_str("="), $3); } | def_name { @@ -1887,7 +1818,7 @@ def_elem: def_name '=' def_arg { } | DEFAULT '=' def_arg { - $$ = cat2_str(make1_str("default ="), $3); + $$ = cat2_str(make_str("default ="), $3); } ; @@ -1897,7 +1828,7 @@ def_arg: ColId { $$ = $1; } | Sconst { $$ = $1; } | SETOF ColId { - $$ = cat2_str(make1_str("setof"), $2); + $$ = cat2_str(make_str("setof"), $2); } ; @@ -1910,11 +1841,11 @@ def_arg: ColId { $$ = $1; } DropStmt: DROP TABLE relation_name_list { - $$ = cat2_str(make1_str("drop table"), $3); + $$ = cat2_str(make_str("drop table"), $3); } | DROP SEQUENCE relation_name_list { - $$ = cat2_str(make1_str("drop sequence"), $3); + $$ = cat2_str(make_str("drop sequence"), $3); } ; @@ -1926,7 +1857,7 @@ DropStmt: DROP TABLE relation_name_list *****************************************************************************/ TruncateStmt: TRUNCATE TABLE relation_name { - $$ = cat2_str(make1_str("drop table"), $3); + $$ = cat2_str(make_str("drop table"), $3); } ; @@ -1944,36 +1875,36 @@ FetchStmt: FETCH opt_direction fetch_how_many opt_portal_name INTO into_list if (strcmp($2, "relative") == 0 && atol($3) == 0L) mmerror(ET_ERROR, "FETCH/RELATIVE at current position is not supported"); - $$ = cat4_str(make1_str("fetch"), $2, $3, $4); + $$ = cat_str(4, make_str("fetch"), $2, $3, $4); } | MOVE opt_direction fetch_how_many opt_portal_name { - $$ = cat4_str(make1_str("fetch"), $2, $3, $4); + $$ = cat_str(4, make_str("fetch"), $2, $3, $4); } ; -opt_direction: FORWARD { $$ = make1_str("forward"); } - | BACKWARD { $$ = make1_str("backward"); } - | RELATIVE { $$ = make1_str("relative"); } +opt_direction: FORWARD { $$ = make_str("forward"); } + | BACKWARD { $$ = make_str("backward"); } + | RELATIVE { $$ = make_str("relative"); } | ABSOLUTE { mmerror(ET_WARN, "FETCH/ABSOLUTE not supported, backend will use RELATIVE"); - $$ = make1_str("absolute"); + $$ = make_str("absolute"); } | /*EMPTY*/ { $$ = EMPTY; /* default */ } ; fetch_how_many: Iconst { $$ = $1; } - | '-' Iconst { $$ = make2_str(make1_str("-"), $2); } - | ALL { $$ = make1_str("all"); } - | NEXT { $$ = make1_str("next"); } - | PRIOR { $$ = make1_str("prior"); } + | '-' Iconst { $$ = cat2_str(make_str("-"), $2); } + | ALL { $$ = make_str("all"); } + | NEXT { $$ = make_str("next"); } + | PRIOR { $$ = make_str("prior"); } | /*EMPTY*/ { $$ = EMPTY; /*default*/ } ; -opt_portal_name: IN name { $$ = cat2_str(make1_str("in"), $2); } - | FROM name { $$ = cat2_str(make1_str("from"), $2); } -/* | name { $$ = cat2_str(make1_str("in"), $1); */ +opt_portal_name: IN name { $$ = cat2_str(make_str("in"), $2); } + | FROM name { $$ = cat2_str(make_str("from"), $2); } +/* | name { $$ = cat2_str(make_str("in"), $1); */ | /*EMPTY*/ { $$ = EMPTY; } ; @@ -1991,51 +1922,51 @@ opt_portal_name: IN name { $$ = cat2_str(make1_str("in"), $2); } *****************************************************************************/ CommentStmt: COMMENT ON comment_type name IS comment_text { - $$ = cat5_str(make1_str("comment on"), $3, $4, make1_str("is"), $6); + $$ = cat_str(5, make_str("comment on"), $3, $4, make_str("is"), $6); } - | COMMENT ON comment_cl relation_name '.' attr_name IS comment_text + | COMMENT ON comment_cl relation_name '.' attr_name IS comment_text { - $$ = cat3_str(cat5_str(make1_str("comment on"), $3, $4, make1_str("."), $6), make1_str("is"), $8); + $$ = cat_str(7, make_str("comment on"), $3, $4, make_str("."), $6, make_str("is"), $8); } | COMMENT ON comment_ag name aggr_argtype IS comment_text { - cat2_str(cat5_str(make1_str("comment on"), $3, $4, $5, make1_str("is")), $7); + $$ = cat_str(6, make_str("comment on"), $3, $4, $5, make_str("is"), $7); } | COMMENT ON comment_fn func_name func_args IS comment_text { - cat2_str(cat5_str(make1_str("comment on"), $3, $4, $5, make1_str("is")), $7); + $$ = cat_str(6, make_str("comment on"), $3, $4, $5, make_str("is"), $7); } | COMMENT ON comment_op all_Op '(' oper_argtypes ')' IS comment_text { - cat3_str(cat5_str(make1_str("comment on"), $3, $4, make1_str("("), $6), make1_str(") is"), $9); + $$ = cat_str(7, make_str("comment on"), $3, $4, make_str("("), $6, make_str(") is"), $9); } | COMMENT ON comment_tg name ON relation_name IS comment_text { - cat3_str(cat5_str(make1_str("comment on"), $3, $4, make1_str("on"), $6), make1_str("is"), $8); + $$ = cat_str(7, make_str("comment on"), $3, $4, make_str("on"), $6, make_str("is"), $8); } ; -comment_type: DATABASE { $$ = make1_str("database"); } - | INDEX { $$ = make1_str("idnex"); } - | RULE { $$ = make1_str("rule"); } - | SEQUENCE { $$ = make1_str("sequence"); } - | TABLE { $$ = make1_str("table"); } - | TYPE_P { $$ = make1_str("type"); } - | VIEW { $$ = make1_str("view"); } +comment_type: DATABASE { $$ = make_str("database"); } + | INDEX { $$ = make_str("idnex"); } + | RULE { $$ = make_str("rule"); } + | SEQUENCE { $$ = make_str("sequence"); } + | TABLE { $$ = make_str("table"); } + | TYPE_P { $$ = make_str("type"); } + | VIEW { $$ = make_str("view"); } ; -comment_cl: COLUMN { $$ = make1_str("column"); } +comment_cl: COLUMN { $$ = make_str("column"); } -comment_ag: AGGREGATE { $$ = make1_str("aggregate"); } +comment_ag: AGGREGATE { $$ = make_str("aggregate"); } -comment_fn: FUNCTION { $$ = make1_str("function"); } +comment_fn: FUNCTION { $$ = make_str("function"); } -comment_op: OPERATOR { $$ = make1_str("operator"); } +comment_op: OPERATOR { $$ = make_str("operator"); } -comment_tg: TRIGGER { $$ = make1_str("trigger"); } +comment_tg: TRIGGER { $$ = make_str("trigger"); } comment_text: Sconst { $$ = $1; } - | NULL_P { $$ = make1_str("null"); } + | NULL_P { $$ = make_str("null"); } ; /***************************************************************************** @@ -2047,17 +1978,17 @@ comment_text: Sconst { $$ = $1; } GrantStmt: GRANT privileges ON relation_name_list TO grantee opt_with_grant { - $$ = cat2_str(cat5_str(make1_str("grant"), $2, make1_str("on"), $4, make1_str("to")), $6); + $$ = cat_str(7, make_str("grant"), $2, make_str("on"), $4, make_str("to"), $6); } ; privileges: ALL PRIVILEGES { - $$ = make1_str("all privileges"); + $$ = make_str("all privileges"); } | ALL { - $$ = make1_str("all"); + $$ = make_str("all"); } | operation_commalist { @@ -2071,39 +2002,39 @@ operation_commalist: operation } | operation_commalist ',' operation { - $$ = cat3_str($1, make1_str(","), $3); + $$ = cat_str(3, $1, make_str(","), $3); } ; operation: SELECT { - $$ = make1_str("select"); + $$ = make_str("select"); } | INSERT { - $$ = make1_str("insert"); + $$ = make_str("insert"); } | UPDATE { - $$ = make1_str("update"); + $$ = make_str("update"); } | DELETE { - $$ = make1_str("delete"); + $$ = make_str("delete"); } | RULE { - $$ = make1_str("rule"); + $$ = make_str("rule"); } ; grantee: PUBLIC { - $$ = make1_str("public"); + $$ = make_str("public"); } | GROUP ColId { - $$ = cat2_str(make1_str("group"), $2); + $$ = cat2_str(make_str("group"), $2); } | ColId { @@ -2128,7 +2059,7 @@ opt_with_grant: WITH GRANT OPTION RevokeStmt: REVOKE privileges ON relation_name_list FROM grantee { - $$ = cat2_str(cat5_str(make1_str("revoke"), $2, make1_str("on"), $4, make1_str("from")), $6); + $$ = cat_str(7, make_str("revoke"), $2, make_str("on"), $4, make_str("from"), $6); } ; @@ -2149,15 +2080,15 @@ IndexStmt: CREATE index_opt_unique INDEX index_name ON relation_name { /* should check that access_method is valid, etc ... but doesn't */ - $$ = cat5_str(cat5_str(make1_str("create"), $2, make1_str("index"), $4, make1_str("on")), $6, $7, make3_str(make1_str("("), $9, make1_str(")")), $11); + $$ = cat_str(11, make_str("create"), $2, make_str("index"), $4, make_str("on"), $6, $7, make_str("("), $9, make_str(")"), $11); } ; -index_opt_unique: UNIQUE { $$ = make1_str("unique"); } +index_opt_unique: UNIQUE { $$ = make_str("unique"); } | /*EMPTY*/ { $$ = EMPTY; } ; -access_method_clause: USING access_method { $$ = cat2_str(make1_str("using"), $2); } +access_method_clause: USING access_method { $$ = cat2_str(make_str("using"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -2165,24 +2096,24 @@ index_params: index_list { $$ = $1; } | func_index { $$ = $1; } ; -index_list: index_list ',' index_elem { $$ = cat3_str($1, make1_str(","), $3); } +index_list: index_list ',' index_elem { $$ = cat_str(3, $1, make_str(","), $3); } | index_elem { $$ = $1; } ; func_index: func_name '(' name_list ')' opt_type opt_class { - $$ = cat4_str($1, make3_str(make1_str("("), $3, ")"), $5, $6); + $$ = cat_str(6, $1, make_str("("), $3, ")", $5, $6); } ; index_elem: attr_name opt_type opt_class { - $$ = cat3_str($1, $2, $3); + $$ = cat_str(3, $1, $2, $3); } ; -opt_type: ':' Typename { $$ = cat2_str(make1_str(":"), $2); } - | FOR Typename { $$ = cat2_str(make1_str("for"), $2); } +opt_type: ':' Typename { $$ = cat2_str(make_str(":"), $2); } + | FOR Typename { $$ = cat2_str(make_str("for"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -2193,7 +2124,7 @@ opt_type: ':' Typename { $$ = cat2_str(make1_str(":"), $2); } * | WITH class { $$ = $2; } */ opt_class: class { $$ = $1; } - | USING class { $$ = cat2_str(make1_str("using"), $2); } + | USING class { $$ = cat2_str(make_str("using"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -2206,7 +2137,7 @@ opt_class: class { $$ = $1; } ExtendStmt: EXTEND INDEX index_name where_clause { - $$ = cat3_str(make1_str("extend index"), $3, $4); + $$ = cat_str(3, make_str("extend index"), $3, $4); } ; @@ -2220,7 +2151,7 @@ ExtendStmt: EXTEND INDEX index_name where_clause /* NOT USED RecipeStmt: EXECUTE RECIPE recipe_name { - $$ = cat2_str(make1_str("execute recipe"), $3); + $$ = cat2_str(make_str("execute recipe"), $3); } ; */ @@ -2243,24 +2174,24 @@ RecipeStmt: EXECUTE RECIPE recipe_name ProcedureStmt: CREATE FUNCTION func_name func_args RETURNS func_return opt_with AS func_as LANGUAGE Sconst { - $$ = cat2_str(cat5_str(cat5_str(make1_str("create function"), $3, $4, make1_str("returns"), $6), $7, make1_str("as"), $9, make1_str("language")), $11); + $$ = cat_str(10, make_str("create function"), $3, $4, make_str("returns"), $6, $7, make_str("as"), $9, make_str("language"), $11); } -opt_with: WITH definition { $$ = cat2_str(make1_str("with"), $2); } +opt_with: WITH definition { $$ = cat2_str(make_str("with"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ; -func_args: '(' func_args_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); } - | '(' ')' { $$ = make1_str("()"); } +func_args: '(' func_args_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } + | '(' ')' { $$ = make_str("()"); } ; func_args_list: TypeId { $$ = $1; } | func_args_list ',' TypeId - { $$ = cat3_str($1, make1_str(","), $3); } + { $$ = cat_str(3, $1, make_str(","), $3); } ; func_as: Sconst { $$ = $1; } - | Sconst ',' Sconst { $$ = cat3_str($1, make1_str(","), $3); } + | Sconst ',' Sconst { $$ = cat_str(3, $1, make_str(","), $3); } func_return: set_opt TypeId { @@ -2268,7 +2199,7 @@ func_return: set_opt TypeId } ; -set_opt: SETOF { $$ = make1_str("setof"); } +set_opt: SETOF { $$ = make_str("setof"); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -2292,38 +2223,38 @@ set_opt: SETOF { $$ = make1_str("setof"); } RemoveStmt: DROP remove_type name { - $$ = cat3_str(make1_str("drop"), $2, $3); + $$ = cat_str(3, make_str("drop"), $2, $3); } ; -remove_type: TYPE_P { $$ = make1_str("type"); } - | INDEX { $$ = make1_str("index"); } - | RULE { $$ = make1_str("rule"); } - | VIEW { $$ = make1_str("view"); } +remove_type: TYPE_P { $$ = make_str("type"); } + | INDEX { $$ = make_str("index"); } + | RULE { $$ = make_str("rule"); } + | VIEW { $$ = make_str("view"); } ; RemoveAggrStmt: DROP AGGREGATE name aggr_argtype { - $$ = cat3_str(make1_str("drop aggregate"), $3, $4); + $$ = cat_str(3, make_str("drop aggregate"), $3, $4); } ; aggr_argtype: name { $$ = $1; } - | '*' { $$ = make1_str("*"); } + | '*' { $$ = make_str("*"); } ; RemoveFuncStmt: DROP FUNCTION func_name func_args { - $$ = cat3_str(make1_str("drop function"), $3, $4); + $$ = cat_str(3, make_str("drop function"), $3, $4); } ; RemoveOperStmt: DROP OPERATOR all_Op '(' oper_argtypes ')' { - $$ = cat3_str(make1_str("drop operator"), $3, make3_str(make1_str("("), $5, make1_str(")"))); + $$ = cat_str(5, make_str("drop operator"), $3, make_str("("), $5, make_str(")")); } ; @@ -2332,11 +2263,11 @@ oper_argtypes: name mmerror(ET_ERROR, "parser: argument type missing (use NONE for unary operators)"); } | name ',' name - { $$ = cat3_str($1, make1_str(","), $3); } + { $$ = cat_str(3, $1, make_str(","), $3); } | NONE ',' name /* left unary */ - { $$ = cat2_str(make1_str("none,"), $3); } + { $$ = cat2_str(make_str("none,"), $3); } | name ',' NONE /* right unary */ - { $$ = cat2_str($1, make1_str(", none")); } + { $$ = cat2_str($1, make_str(", none")); } ; @@ -2351,7 +2282,7 @@ oper_argtypes: name RenameStmt: ALTER TABLE relation_name opt_inh_star RENAME opt_column opt_name TO name { - $$ = cat4_str(cat5_str(make1_str("alter table"), $3, $4, make1_str("rename"), $6), $7, make1_str("to"), $9); + $$ = cat_str(8, make_str("alter table"), $3, $4, make_str("rename"), $6, $7, make_str("to"), $9); } ; @@ -2359,7 +2290,7 @@ opt_name: name { $$ = $1; } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_column: COLUMN { $$ = make1_str("colmunn"); } +opt_column: COLUMN { $$ = make_str("colmunn"); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -2378,22 +2309,22 @@ RuleStmt: CREATE RULE name AS ON event TO event_object where_clause DO opt_instead RuleActionList { - $$ = cat2_str(cat5_str(cat5_str(make1_str("create rule"), $3, make1_str("as on"), $7, make1_str("to")), $9, $10, make1_str("do"), $12), $13); + $$ = cat_str(10, make_str("create rule"), $3, make_str("as on"), $7, make_str("to"), $9, $10, make_str("do"), $12, $13); } ; -RuleActionList: NOTHING { $$ = make1_str("nothing"); } +RuleActionList: NOTHING { $$ = make_str("nothing"); } | SelectStmt { $$ = $1; } | RuleActionStmt { $$ = $1; } - | '[' RuleActionMulti ']' { $$ = cat3_str(make1_str("["), $2, make1_str("]")); } - | '(' RuleActionMulti ')' { $$ = cat3_str(make1_str("("), $2, make1_str(")")); } + | '[' RuleActionMulti ']' { $$ = cat_str(3, make_str("["), $2, make_str("]")); } + | '(' RuleActionMulti ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } ; /* the thrashing around here is to discard "empty" statements... */ RuleActionMulti: RuleActionMulti ';' RuleActionStmtOrEmpty - { $$ = cat3_str($1, make1_str(";"), $3); } + { $$ = cat_str(3, $1, make_str(";"), $3); } | RuleActionStmtOrEmpty - { $$ = cat2_str($1, make1_str(";")); } + { $$ = cat2_str($1, make_str(";")); } ; RuleActionStmt: InsertStmt @@ -2407,7 +2338,7 @@ RuleActionStmtOrEmpty: RuleActionStmt { $$ = $1; } event_object: relation_name '.' attr_name { - $$ = make3_str($1, make1_str("."), $3); + $$ = make3_str($1, make_str("."), $3); } | relation_name { @@ -2416,13 +2347,13 @@ event_object: relation_name '.' attr_name ; /* change me to select, update, etc. some day */ -event: SELECT { $$ = make1_str("select"); } - | UPDATE { $$ = make1_str("update"); } - | DELETE { $$ = make1_str("delete"); } - | INSERT { $$ = make1_str("insert"); } +event: SELECT { $$ = make_str("select"); } + | UPDATE { $$ = make_str("update"); } + | DELETE { $$ = make_str("delete"); } + | INSERT { $$ = make_str("insert"); } ; -opt_instead: INSTEAD { $$ = make1_str("instead"); } +opt_instead: INSTEAD { $$ = make_str("instead"); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -2437,23 +2368,23 @@ opt_instead: INSTEAD { $$ = make1_str("instead"); } NotifyStmt: NOTIFY relation_name { - $$ = cat2_str(make1_str("notify"), $2); + $$ = cat2_str(make_str("notify"), $2); } ; ListenStmt: LISTEN relation_name { - $$ = cat2_str(make1_str("listen"), $2); + $$ = cat2_str(make_str("listen"), $2); } ; UnlistenStmt: UNLISTEN relation_name { - $$ = cat2_str(make1_str("unlisten"), $2); + $$ = cat2_str(make_str("unlisten"), $2); } | UNLISTEN '*' { - $$ = make1_str("unlisten *"); + $$ = make_str("unlisten *"); } ; @@ -2469,11 +2400,11 @@ UnlistenStmt: UNLISTEN relation_name * (END) * *****************************************************************************/ -TransactionStmt: ABORT_TRANS opt_trans { $$ = make1_str("rollback"); } - | BEGIN_TRANS opt_trans { $$ = make1_str("begin transaction"); } - | COMMIT opt_trans { $$ = make1_str("commit"); } - | END_TRANS opt_trans { $$ = make1_str("commit"); } - | ROLLBACK opt_trans { $$ = make1_str("rollback"); } +TransactionStmt: ABORT_TRANS opt_trans { $$ = make_str("rollback"); } + | BEGIN_TRANS opt_trans { $$ = make_str("begin transaction"); } + | COMMIT opt_trans { $$ = make_str("commit"); } + | END_TRANS opt_trans { $$ = make_str("commit"); } + | ROLLBACK opt_trans { $$ = make_str("rollback"); } opt_trans: WORK { $$ = ""; } | TRANSACTION { $$ = ""; } @@ -2489,7 +2420,7 @@ opt_trans: WORK { $$ = ""; } ViewStmt: CREATE VIEW name AS SelectStmt { - $$ = cat4_str(make1_str("create view"), $3, make1_str("as"), $5); + $$ = cat_str(4, make_str("create view"), $3, make_str("as"), $5); } ; @@ -2497,13 +2428,13 @@ ViewStmt: CREATE VIEW name AS SelectStmt /***************************************************************************** * * QUERY: - * load make1_str("filename") + * load make_str("filename") * *****************************************************************************/ LoadStmt: LOAD file_name { - $$ = cat2_str(make1_str("load"), $2); + $$ = cat2_str(make_str("load"), $2); } ; @@ -2523,29 +2454,29 @@ CreatedbStmt: CREATE DATABASE database_name WITH opt_database1 opt_database2 if (strlen($6) != 0) mmerror(ET_ERROR, "WITH ENCODING is not supported"); #endif - $$ = cat5_str(make1_str("create database"), $3, make1_str("with"), $5, $6); + $$ = cat_str(5, make_str("create database"), $3, make_str("with"), $5, $6); } | CREATE DATABASE database_name { - $$ = cat2_str(make1_str("create database"), $3); + $$ = cat2_str(make_str("create database"), $3); } ; -opt_database1: LOCATION '=' location { $$ = cat2_str(make1_str("location ="), $3); } +opt_database1: LOCATION '=' location { $$ = cat2_str(make_str("location ="), $3); } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_database2: ENCODING '=' encoding { $$ = cat2_str(make1_str("encoding ="), $3); } +opt_database2: ENCODING '=' encoding { $$ = cat2_str(make_str("encoding ="), $3); } | /*EMPTY*/ { $$ = NULL; } ; location: Sconst { $$ = $1; } - | DEFAULT { $$ = make1_str("default"); } + | DEFAULT { $$ = make_str("default"); } | /*EMPTY*/ { $$ = EMPTY; } ; encoding: Sconst { $$ = $1; } - | DEFAULT { $$ = make1_str("default"); } + | DEFAULT { $$ = make_str("default"); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -2558,7 +2489,7 @@ encoding: Sconst { $$ = $1; } DropdbStmt: DROP DATABASE database_name { - $$ = cat2_str(make1_str("drop database"), $3); + $$ = cat2_str(make_str("drop database"), $3); } ; @@ -2572,7 +2503,7 @@ DropdbStmt: DROP DATABASE database_name ClusterStmt: CLUSTER index_name ON relation_name { - $$ = cat4_str(make1_str("cluster"), $2, make1_str("on"), $4); + $$ = cat_str(4, make_str("cluster"), $2, make_str("on"), $4); } ; @@ -2586,32 +2517,32 @@ ClusterStmt: CLUSTER index_name ON relation_name VacuumStmt: VACUUM opt_verbose opt_analyze { - $$ = cat3_str(make1_str("vacuum"), $2, $3); + $$ = cat_str(3, make_str("vacuum"), $2, $3); } | VACUUM opt_verbose opt_analyze relation_name opt_va_list { if ( strlen($5) > 0 && strlen($4) == 0 ) mmerror(ET_ERROR, "parser: syntax error at or near \"(\""); - $$ = cat5_str(make1_str("vacuum"), $2, $3, $4, $5); + $$ = cat_str(5, make_str("vacuum"), $2, $3, $4, $5); } ; -opt_verbose: VERBOSE { $$ = make1_str("verbose"); } +opt_verbose: VERBOSE { $$ = make_str("verbose"); } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_analyze: ANALYZE { $$ = make1_str("analyse"); } +opt_analyze: ANALYZE { $$ = make_str("analyse"); } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_va_list: '(' va_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); } +opt_va_list: '(' va_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } | /*EMPTY*/ { $$ = EMPTY; } ; va_list: name { $$=$1; } | va_list ',' name - { $$=cat3_str($1, make1_str(","), $3); } + { $$=cat_str(3, $1, make_str(","), $3); } ; @@ -2624,7 +2555,7 @@ va_list: name ExplainStmt: EXPLAIN opt_verbose OptimizableStmt { - $$ = cat3_str(make1_str("explain"), $2, $3); + $$ = cat_str(3, make_str("explain"), $2, $3); } ; @@ -2663,17 +2594,17 @@ OptimizableStmt: SelectStmt * the same statements without any shift/reduce conflicts */ InsertStmt: INSERT INTO relation_name insert_rest { - $$ = cat3_str(make1_str("insert into"), $3, $4); + $$ = cat_str(3, make_str("insert into"), $3, $4); } ; insert_rest: VALUES '(' target_list ')' { - $$ = make3_str(make1_str("values("), $3, make1_str(")")); + $$ = cat_str(3, make_str("values("), $3, make_str(")")); } | DEFAULT VALUES { - $$ = make1_str("default values"); + $$ = make_str("default values"); } | SelectStmt { @@ -2681,21 +2612,21 @@ insert_rest: VALUES '(' target_list ')' } | '(' columnList ')' VALUES '(' target_list ')' { - $$ = make5_str(make1_str("("), $2, make1_str(") values ("), $6, make1_str(")")); + $$ = cat_str(5, make_str("("), $2, make_str(") values ("), $6, make_str(")")); } | '(' columnList ')' SelectStmt { - $$ = make4_str(make1_str("("), $2, make1_str(")"), $4); + $$ = cat_str(4, make_str("("), $2, make_str(")"), $4); } ; -opt_column_list: '(' columnList ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); } +opt_column_list: '(' columnList ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } | /*EMPTY*/ { $$ = EMPTY; } ; columnList: columnList ',' columnElem - { $$ = cat3_str($1, make1_str(","), $3); } + { $$ = cat_str(3, $1, make_str(","), $3); } | columnElem { $$ = $1; } ; @@ -2717,28 +2648,28 @@ columnElem: ColId opt_indirection DeleteStmt: DELETE FROM relation_name where_clause { - $$ = cat3_str(make1_str("delete from"), $3, $4); + $$ = cat_str(3, make_str("delete from"), $3, $4); } ; LockStmt: LOCK_P opt_table relation_name opt_lock { - $$ = cat4_str(make1_str("lock"), $2, $3, $4); + $$ = cat_str(4, make_str("lock"), $2, $3, $4); } ; -opt_lock: IN lock_type MODE { $$ = cat3_str(make1_str("in"), $2, make1_str("mode")); } +opt_lock: IN lock_type MODE { $$ = cat_str(3, make_str("in"), $2, make_str("mode")); } | /*EMPTY*/ { $$ = EMPTY;} ; -lock_type: SHARE ROW EXCLUSIVE { $$ = make1_str("share row exclusive"); } - | ROW opt_lmode { $$ = cat2_str(make1_str("row"), $2);} - | ACCESS opt_lmode { $$ = cat2_str(make1_str("access"), $2);} +lock_type: SHARE ROW EXCLUSIVE { $$ = make_str("share row exclusive"); } + | ROW opt_lmode { $$ = cat2_str(make_str("row"), $2);} + | ACCESS opt_lmode { $$ = cat2_str(make_str("access"), $2);} | opt_lmode { $$ = $1; } ; -opt_lmode: SHARE { $$ = make1_str("share"); } - | EXCLUSIVE { $$ = make1_str("exclusive"); } +opt_lmode: SHARE { $$ = make_str("share"); } + | EXCLUSIVE { $$ = make_str("exclusive"); } ; /***************************************************************************** @@ -2753,7 +2684,7 @@ UpdateStmt: UPDATE relation_name from_clause where_clause { - $$ = cat2_str(cat5_str(make1_str("update"), $2, make1_str("set"), $4, $5), $6); + $$ = cat_str(6, make_str("update"), $2, make_str("set"), $4, $5, $6); } ; @@ -2786,21 +2717,21 @@ CursorStmt: DECLARE name opt_cursor CURSOR FOR this->next = cur; this->name = $2; this->connection = connection; - this->command = cat5_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for"), $7); + this->command = cat_str(5, make_str("declare"), mm_strdup($2), $3, make_str("cursor for"), $7); this->argsinsert = argsinsert; this->argsresult = argsresult; argsinsert = argsresult = NULL; cur = this; - $$ = cat3_str(make1_str("/*"), mm_strdup(this->command), make1_str("*/")); + $$ = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/")); } ; -opt_cursor: BINARY { $$ = make1_str("binary"); } - | INSENSITIVE { $$ = make1_str("insensitive"); } - | SCROLL { $$ = make1_str("scroll"); } - | INSENSITIVE SCROLL { $$ = make1_str("insensitive scroll"); } +opt_cursor: BINARY { $$ = make_str("binary"); } + | INSENSITIVE { $$ = make_str("insensitive"); } + | SCROLL { $$ = make_str("scroll"); } + | INSENSITIVE SCROLL { $$ = make_str("insensitive scroll"); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -2823,7 +2754,7 @@ SelectStmt: select_clause sort_clause for_update_clause opt_select_limit mmerror(ET_ERROR, "FOR UPDATE is not allowed in this context"); ForUpdateNotAllowed = 0; - $$ = cat4_str($1, $2, $3, $4); + $$ = cat_str(4, $1, $2, $3, $4); } /* This rule parses Select statements including UNION INTERSECT and EXCEPT. @@ -2835,7 +2766,7 @@ SelectStmt: select_clause sort_clause for_update_clause opt_select_limit */ select_clause: '(' select_clause ')' { - $$ = make3_str(make1_str("("), $2, make1_str(")")); + $$ = cat_str(3, make_str("("), $2, make_str(")")); } | SubSelect { @@ -2844,17 +2775,17 @@ select_clause: '(' select_clause ')' } | select_clause EXCEPT select_clause { - $$ = cat3_str($1, make1_str("except"), $3); + $$ = cat_str(3, $1, make_str("except"), $3); ForUpdateNotAllowed = 1; } | select_clause UNION opt_all select_clause { - $$ = cat4_str($1, make1_str("union"), $3, $4); + $$ = cat_str(4, $1, make_str("union"), $3, $4); ForUpdateNotAllowed = 1; } | select_clause INTERSECT opt_all select_clause { - $$ = cat3_str($1, make1_str("intersect"), $3); + $$ = cat_str(3, $1, make_str("intersect"), $3); ForUpdateNotAllowed = 1; } ; @@ -2865,37 +2796,37 @@ SubSelect: SELECT opt_unique target_list { if (strlen($7) > 0 || strlen($8) > 0) ForUpdateNotAllowed = 1; - $$ = cat4_str(cat5_str(make1_str("select"), $2, $3, $4, $5), $6, $7, $8); + $$ = cat_str(8, make_str("select"), $2, $3, $4, $5, $6, $7, $8); } ; result: INTO OptTemp opt_table relation_name { FoundInto = 1; - $$= cat4_str(make1_str("into"), $2, $3, $4); + $$= cat_str(4, make_str("into"), $2, $3, $4); } | INTO into_list { $$ = EMPTY; } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_table: TABLE { $$ = make1_str("table"); } +opt_table: TABLE { $$ = make_str("table"); } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_all: ALL { $$ = make1_str("all"); } +opt_all: ALL { $$ = make_str("all"); } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_unique: DISTINCT { $$ = make1_str("distinct"); } - | DISTINCT ON ColId { $$ = cat2_str(make1_str("distinct on"), $3); } - | ALL { $$ = make1_str("all"); } +opt_unique: DISTINCT { $$ = make_str("distinct"); } + | DISTINCT ON ColId { $$ = cat2_str(make_str("distinct on"), $3); } + | ALL { $$ = make_str("all"); } | /*EMPTY*/ { $$ = EMPTY; } ; -sort_clause: ORDER BY sortby_list { $$ = cat2_str(make1_str("order by"), $3); } +sort_clause: ORDER BY sortby_list { $$ = cat2_str(make_str("order by"), $3); } | /*EMPTY*/ { $$ = EMPTY; } ; sortby_list: sortby { $$ = $1; } - | sortby_list ',' sortby { $$ = cat3_str($1, make1_str(","), $3); } + | sortby_list ',' sortby { $$ = cat_str(3, $1, make_str(","), $3); } ; sortby: a_expr OptUseOp @@ -2904,28 +2835,28 @@ sortby: a_expr OptUseOp } ; -OptUseOp: USING all_Op { $$ = cat2_str(make1_str("using"), $2); } - | ASC { $$ = make1_str("asc"); } - | DESC { $$ = make1_str("desc"); } +OptUseOp: USING all_Op { $$ = cat2_str(make_str("using"), $2); } + | ASC { $$ = make_str("asc"); } + | DESC { $$ = make_str("desc"); } | /*EMPTY*/ { $$ = EMPTY; } ; opt_select_limit: LIMIT select_limit_value ',' select_offset_value - { $$ = cat4_str(make1_str("limit"), $2, make1_str(","), $4); } + { $$ = cat_str(4, make_str("limit"), $2, make_str(","), $4); } | LIMIT select_limit_value OFFSET select_offset_value - { $$ = cat4_str(make1_str("limit"), $2, make1_str("offset"), $4); } + { $$ = cat_str(4, make_str("limit"), $2, make_str("offset"), $4); } | LIMIT select_limit_value - { $$ = cat2_str(make1_str("limit"), $2); } + { $$ = cat2_str(make_str("limit"), $2); } | OFFSET select_offset_value LIMIT select_limit_value - { $$ = cat4_str(make1_str("offset"), $2, make1_str("limit"), $4); } + { $$ = cat_str(4, make_str("offset"), $2, make_str("limit"), $4); } | OFFSET select_offset_value - { $$ = cat2_str(make1_str("offset"), $2); } + { $$ = cat2_str(make_str("offset"), $2); } | /* EMPTY */ { $$ = EMPTY; } ; select_limit_value: Iconst { $$ = $1; } - | ALL { $$ = make1_str("all"); } + | ALL { $$ = make_str("all"); } | PARAM { $$ = make_name(); } ; @@ -2940,7 +2871,7 @@ select_offset_value: Iconst { $$ = $1; } * ...however, recursive addattr and rename supported. make special * cases for these. */ -opt_inh_star: '*' { $$ = make1_str("*"); } +opt_inh_star: '*' { $$ = make_str("*"); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -2949,27 +2880,27 @@ relation_name_list: name_list { $$ = $1; }; name_list: name { $$ = $1; } | name_list ',' name - { $$ = cat3_str($1, make1_str(","), $3); } + { $$ = cat_str(3, $1, make_str(","), $3); } ; -group_clause: GROUP BY expr_list { $$ = cat2_str(make1_str("group by"), $3); } +group_clause: GROUP BY expr_list { $$ = cat2_str(make_str("group by"), $3); } | /*EMPTY*/ { $$ = EMPTY; } ; having_clause: HAVING a_expr { - $$ = cat2_str(make1_str("having"), $2); + $$ = cat2_str(make_str("having"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ; for_update_clause: FOR UPDATE update_list { - $$ = make1_str("for update"); + $$ = make_str("for update"); } | FOR READ ONLY { - $$ = make1_str("for read only"); + $$ = make_str("for read only"); } | /* EMPTY */ { @@ -2978,7 +2909,7 @@ for_update_clause: FOR UPDATE update_list ; update_list: OF va_list { - $$ = cat2_str(make1_str("of"), $2); + $$ = cat2_str(make_str("of"), $2); } | /* EMPTY */ { @@ -2996,7 +2927,7 @@ update_list: OF va_list from_clause: FROM from_expr { - $$ = cat2_str(make1_str("from"), $2); + $$ = cat2_str(make_str("from"), $2); } | /* EMPTY */ { @@ -3005,7 +2936,7 @@ from_clause: FROM from_expr from_expr: '(' join_clause_with_union ')' - { $$ = make3_str(make1_str("("), $2, make1_str(")")); } + { $$ = cat_str(3, make_str("("), $2, make_str(")")); } | join_clause { $$ = $1; } | table_list @@ -3013,14 +2944,14 @@ from_expr: '(' join_clause_with_union ')' ; table_list: table_list ',' table_expr - { $$ = make3_str($1, make1_str(","), $3); } + { $$ = cat_str(3, $1, make_str(","), $3); } | table_expr { $$ = $1; } ; table_expr: relation_expr AS ColLabel { - $$ = cat3_str($1, make1_str("as"), $3); + $$ = cat_str(3, $1, make_str("as"), $3); } | relation_expr ColId { @@ -3067,40 +2998,40 @@ join_list: join_list join_expr join_expr: join_type JOIN table_expr join_qual { - $$ = cat4_str($1, make1_str("join"), $3, $4); + $$ = cat_str(4, $1, make_str("join"), $3, $4); } | NATURAL join_type JOIN table_expr { - $$ = cat4_str(make1_str("natural"), $2, make1_str("join"), $4); + $$ = cat_str(4, make_str("natural"), $2, make_str("join"), $4); } | CROSS JOIN table_expr - { $$ = cat2_str(make1_str("cross join"), $3); } + { $$ = cat2_str(make_str("cross join"), $3); } ; /* OUTER is just noise... */ join_type: FULL join_outer { - $$ = cat2_str(make1_str("full"), $2); + $$ = cat2_str(make_str("full"), $2); mmerror(ET_WARN, "FULL OUTER JOIN not yet implemented"); } | LEFT join_outer { - $$ = cat2_str(make1_str("left"), $2); + $$ = cat2_str(make_str("left"), $2); mmerror(ET_WARN, "LEFT OUTER JOIN not yet implemented"); } | RIGHT join_outer { - $$ = cat2_str(make1_str("right"), $2); + $$ = cat2_str(make_str("right"), $2); mmerror(ET_WARN, "RIGHT OUTER JOIN not yet implemented"); } | OUTER_P { - $$ = make1_str("outer"); + $$ = make_str("outer"); mmerror(ET_WARN, "OUTER JOIN not yet implemented"); } | INNER_P { - $$ = make1_str("inner"); + $$ = make_str("inner"); } | /* EMPTY */ { @@ -3108,7 +3039,7 @@ join_type: FULL join_outer } -join_outer: OUTER_P { $$ = make1_str("outer"); } +join_outer: OUTER_P { $$ = make_str("outer"); } | /*EMPTY*/ { $$ = EMPTY; /* no qualifiers */ } ; @@ -3120,11 +3051,11 @@ join_outer: OUTER_P { $$ = make1_str("outer"); } * - thomas 1999-01-07 */ -join_qual: USING '(' using_list ')' { $$ = make3_str(make1_str("using ("), $3, make1_str(")")); } - | ON a_expr { $$ = cat2_str(make1_str("on"), $2); } +join_qual: USING '(' using_list ')' { $$ = cat_str(3, make_str("using ("), $3, make_str(")")); } + | ON a_expr { $$ = cat2_str(make_str("on"), $2); } ; -using_list: using_list ',' using_expr { $$ = make3_str($1, make1_str(","), $3); } +using_list: using_list ',' using_expr { $$ = cat_str(3, $1, make_str(","), $3); } | using_expr { $$ = $1; } ; @@ -3134,7 +3065,7 @@ using_expr: ColId } ; -where_clause: WHERE a_expr { $$ = cat2_str(make1_str("where"), $2); } +where_clause: WHERE a_expr { $$ = cat2_str(make_str("where"), $2); } | /*EMPTY*/ { $$ = EMPTY; /* no qualifiers */ } ; @@ -3146,14 +3077,14 @@ relation_expr: relation_name | relation_name '*' %prec '=' { /* inheritance query */ - $$ = cat2_str($1, make1_str("*")); + $$ = cat2_str($1, make_str("*")); } opt_array_bounds: '[' ']' opt_array_bounds { $$.index1 = 0; $$.index2 = $3.index1; - $$.str = cat2_str(make1_str("[]"), $3.str); + $$.str = cat2_str(make_str("[]"), $3.str); } | '[' Iresult ']' opt_array_bounds { @@ -3162,7 +3093,7 @@ opt_array_bounds: '[' ']' opt_array_bounds sprintf (txt, "%d", $2); $$.index1 = $2; $$.index2 = $4.index1; - $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str); + $$.str = cat_str(4, make_str("["), txt, make_str("]"), $4.str); } | /* EMPTY */ { @@ -3198,7 +3129,7 @@ Typename: SimpleTypename opt_array_bounds } | SETOF SimpleTypename { - $$ = cat2_str(make1_str("setof"), $2); + $$ = cat2_str(make_str("setof"), $2); } ; @@ -3215,39 +3146,39 @@ Generic: generic ; generic: ident { $$ = $1; } - | TYPE_P { $$ = make1_str("type"); } - | SQL_AT { $$ = make1_str("at"); } - | SQL_AUTOCOMMIT { $$ = make1_str("autocommit"); } - | SQL_BOOL { $$ = make1_str("bool"); } - | SQL_BREAK { $$ = make1_str("break"); } - | SQL_CALL { $$ = make1_str("call"); } - | SQL_CONNECT { $$ = make1_str("connect"); } - | SQL_CONNECTION { $$ = make1_str("connection"); } - | SQL_CONTINUE { $$ = make1_str("continue"); } - | SQL_DEALLOCATE { $$ = make1_str("deallocate"); } - | SQL_DISCONNECT { $$ = make1_str("disconnect"); } - | SQL_FOUND { $$ = make1_str("found"); } - | SQL_GO { $$ = make1_str("go"); } - | SQL_GOTO { $$ = make1_str("goto"); } - | SQL_IDENTIFIED { $$ = make1_str("identified"); } - | SQL_INDICATOR { $$ = make1_str("indicator"); } - | SQL_INT { $$ = make1_str("int"); } - | SQL_LONG { $$ = make1_str("long"); } - | SQL_OFF { $$ = make1_str("off"); } - | SQL_OPEN { $$ = make1_str("open"); } - | SQL_PREPARE { $$ = make1_str("prepare"); } - | SQL_RELEASE { $$ = make1_str("release"); } - | SQL_SECTION { $$ = make1_str("section"); } - | SQL_SHORT { $$ = make1_str("short"); } - | SQL_SIGNED { $$ = make1_str("signed"); } - | SQL_SQLERROR { $$ = make1_str("sqlerror"); } - | SQL_SQLPRINT { $$ = make1_str("sqlprint"); } - | SQL_SQLWARNING { $$ = make1_str("sqlwarning"); } - | SQL_STOP { $$ = make1_str("stop"); } - | SQL_STRUCT { $$ = make1_str("struct"); } - | SQL_UNSIGNED { $$ = make1_str("unsigned"); } - | SQL_VAR { $$ = make1_str("var"); } - | SQL_WHENEVER { $$ = make1_str("whenever"); } + | TYPE_P { $$ = make_str("type"); } + | SQL_AT { $$ = make_str("at"); } + | SQL_AUTOCOMMIT { $$ = make_str("autocommit"); } + | SQL_BOOL { $$ = make_str("bool"); } + | SQL_BREAK { $$ = make_str("break"); } + | SQL_CALL { $$ = make_str("call"); } + | SQL_CONNECT { $$ = make_str("connect"); } + | SQL_CONNECTION { $$ = make_str("connection"); } + | SQL_CONTINUE { $$ = make_str("continue"); } + | SQL_DEALLOCATE { $$ = make_str("deallocate"); } + | SQL_DISCONNECT { $$ = make_str("disconnect"); } + | SQL_FOUND { $$ = make_str("found"); } + | SQL_GO { $$ = make_str("go"); } + | SQL_GOTO { $$ = make_str("goto"); } + | SQL_IDENTIFIED { $$ = make_str("identified"); } + | SQL_INDICATOR { $$ = make_str("indicator"); } + | SQL_INT { $$ = make_str("int"); } + | SQL_LONG { $$ = make_str("long"); } + | SQL_OFF { $$ = make_str("off"); } + | SQL_OPEN { $$ = make_str("open"); } + | SQL_PREPARE { $$ = make_str("prepare"); } + | SQL_RELEASE { $$ = make_str("release"); } + | SQL_SECTION { $$ = make_str("section"); } + | SQL_SHORT { $$ = make_str("short"); } + | SQL_SIGNED { $$ = make_str("signed"); } + | SQL_SQLERROR { $$ = make_str("sqlerror"); } + | SQL_SQLPRINT { $$ = make_str("sqlprint"); } + | SQL_SQLWARNING { $$ = make_str("sqlwarning"); } + | SQL_STOP { $$ = make_str("stop"); } + | SQL_STRUCT { $$ = make_str("struct"); } + | SQL_UNSIGNED { $$ = make_str("unsigned"); } + | SQL_VAR { $$ = make_str("var"); } + | SQL_WHENEVER { $$ = make_str("whenever"); } ; /* SQL92 numeric data types @@ -3257,30 +3188,30 @@ generic: ident { $$ = $1; } */ Numeric: FLOAT opt_float { - $$ = cat2_str(make1_str("float"), $2); + $$ = cat2_str(make_str("float"), $2); } | DOUBLE PRECISION { - $$ = make1_str("double precision"); + $$ = make_str("double precision"); } | DECIMAL opt_decimal { - $$ = cat2_str(make1_str("decimal"), $2); + $$ = cat2_str(make_str("decimal"), $2); } | NUMERIC opt_numeric { - $$ = cat2_str(make1_str("numeric"), $2); + $$ = cat2_str(make_str("numeric"), $2); } ; numeric: FLOAT - { $$ = make1_str("float"); } + { $$ = make_str("float"); } | DOUBLE PRECISION - { $$ = make1_str("double precision"); } + { $$ = make_str("double precision"); } | DECIMAL - { $$ = make1_str("decimal"); } + { $$ = make_str("decimal"); } | NUMERIC - { $$ = make1_str("numeric"); } + { $$ = make_str("numeric"); } ; opt_float: '(' Iconst ')' @@ -3289,7 +3220,7 @@ opt_float: '(' Iconst ')' mmerror(ET_ERROR, "precision for FLOAT must be at least 1"); else if (atol($2) >= 16) mmerror(ET_ERROR, "precision for FLOAT must be less than 16"); - $$ = make3_str(make1_str("("), $2, make1_str(")")); + $$ = cat_str(3, make_str("("), $2, make_str(")")); } | /*EMPTY*/ { @@ -3307,7 +3238,7 @@ opt_numeric: '(' Iconst ',' Iconst ')' sprintf(errortext, "NUMERIC scale %s must be between 0 and precision %s", $4, $2); mmerror(ET_ERROR, errortext); } - $$ = cat3_str(make2_str(make1_str("("), $2), make1_str(","), make2_str($4, make1_str(")"))); + $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")")); } | '(' Iconst ')' { @@ -3315,7 +3246,7 @@ opt_numeric: '(' Iconst ',' Iconst ')' sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION); mmerror(ET_ERROR, errortext); } - $$ = make3_str(make1_str("("), $2, make1_str(")")); + $$ = cat_str(3, make_str("("), $2, make_str(")")); } | /*EMPTY*/ { @@ -3333,7 +3264,7 @@ opt_decimal: '(' Iconst ',' Iconst ')' sprintf(errortext, "NUMERIC scale %s must be between 0 and precision %s", $4, $2); mmerror(ET_ERROR, errortext); } - $$ = cat3_str(make2_str(make1_str("("), $2), make1_str(","), make2_str($4, make1_str(")"))); + $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")")); } | '(' Iconst ')' { @@ -3341,7 +3272,7 @@ opt_decimal: '(' Iconst ',' Iconst ')' sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION); mmerror(ET_ERROR, errortext); } - $$ = make3_str(make1_str("("), $2, make1_str(")")); + $$ = cat_str(3, make_str("("), $2, make_str(")")); } | /*EMPTY*/ { @@ -3368,7 +3299,7 @@ Character: character '(' Iconst ')' mmerror(ET_ERROR, errortext); } - $$ = cat2_str($1, make3_str(make1_str("("), $3, make1_str(")"))); + $$ = cat_str(4, $1, make_str("("), $3, make_str(")")); } | character { @@ -3384,23 +3315,23 @@ character: CHARACTER opt_varying opt_charset opt_collate mmerror(ET_WARN, errortext); } - $$ = cat4_str(make1_str("character"), $2, $3, $4); + $$ = cat_str(4, make_str("character"), $2, $3, $4); } - | CHAR opt_varying { $$ = cat2_str(make1_str("char"), $2); } - | VARCHAR { $$ = make1_str("varchar"); } - | NATIONAL CHARACTER opt_varying { $$ = cat2_str(make1_str("national character"), $3); } - | NCHAR opt_varying { $$ = cat2_str(make1_str("nchar"), $2); } + | CHAR opt_varying { $$ = cat2_str(make_str("char"), $2); } + | VARCHAR { $$ = make_str("varchar"); } + | NATIONAL CHARACTER opt_varying { $$ = cat2_str(make_str("national character"), $3); } + | NCHAR opt_varying { $$ = cat2_str(make_str("nchar"), $2); } ; -opt_varying: VARYING { $$ = make1_str("varying"); } +opt_varying: VARYING { $$ = make_str("varying"); } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_charset: CHARACTER SET ColId { $$ = cat2_str(make1_str("character set"), $3); } +opt_charset: CHARACTER SET ColId { $$ = cat2_str(make_str("character set"), $3); } | /*EMPTY*/ { $$ = EMPTY; } ; -opt_collate: COLLATE ColId { $$ = cat2_str(make1_str("collate"), $2); } +opt_collate: COLLATE ColId { $$ = cat2_str(make_str("collate"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -3410,38 +3341,38 @@ Datetime: datetime } | TIMESTAMP opt_timezone { - $$ = cat2_str(make1_str("timestamp"), $2); + $$ = cat2_str(make_str("timestamp"), $2); } | TIME { - $$ = make1_str("time"); + $$ = make_str("time"); } | INTERVAL opt_interval { - $$ = cat2_str(make1_str("interval"), $2); + $$ = cat2_str(make_str("interval"), $2); } ; -datetime: YEAR_P { $$ = make1_str("year"); } - | MONTH_P { $$ = make1_str("month"); } - | DAY_P { $$ = make1_str("day"); } - | HOUR_P { $$ = make1_str("hour"); } - | MINUTE_P { $$ = make1_str("minute"); } - | SECOND_P { $$ = make1_str("second"); } +datetime: YEAR_P { $$ = make_str("year"); } + | MONTH_P { $$ = make_str("month"); } + | DAY_P { $$ = make_str("day"); } + | HOUR_P { $$ = make_str("hour"); } + | MINUTE_P { $$ = make_str("minute"); } + | SECOND_P { $$ = make_str("second"); } ; -opt_timezone: WITH TIME ZONE { $$ = make1_str("with time zone"); } +opt_timezone: WITH TIME ZONE { $$ = make_str("with time zone"); } | /*EMPTY*/ { $$ = EMPTY; } ; opt_interval: datetime { $$ = $1; } - | YEAR_P TO MONTH_P { $$ = make1_str("year to #month"); } - | DAY_P TO HOUR_P { $$ = make1_str("day to hour"); } - | DAY_P TO MINUTE_P { $$ = make1_str("day to minute"); } - | DAY_P TO SECOND_P { $$ = make1_str("day to second"); } - | HOUR_P TO MINUTE_P { $$ = make1_str("hour to minute"); } - | MINUTE_P TO SECOND_P { $$ = make1_str("minute to second"); } - | HOUR_P TO SECOND_P { $$ = make1_str("hour to second"); } + | YEAR_P TO MONTH_P { $$ = make_str("year to #month"); } + | DAY_P TO HOUR_P { $$ = make_str("day to hour"); } + | DAY_P TO MINUTE_P { $$ = make_str("day to minute"); } + | DAY_P TO SECOND_P { $$ = make_str("day to second"); } + | HOUR_P TO MINUTE_P { $$ = make_str("hour to minute"); } + | MINUTE_P TO SECOND_P { $$ = make_str("minute to second"); } + | HOUR_P TO SECOND_P { $$ = make_str("hour to second"); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -3456,7 +3387,7 @@ a_expr_or_null: a_expr { $$ = $1; } | NULL_P { - $$ = make1_str("null"); + $$ = make_str("null"); } ; @@ -3466,40 +3397,40 @@ a_expr_or_null: a_expr */ row_expr: '(' row_descriptor ')' IN '(' SubSelect ')' { - $$ = make5_str(make1_str("("), $2, make1_str(") in ("), $6, make1_str(")")); + $$ = cat_str(5, make_str("("), $2, make_str(") in ("), $6, make_str(")")); } | '(' row_descriptor ')' NOT IN '(' SubSelect ')' { - $$ = make5_str(make1_str("("), $2, make1_str(") not in ("), $7, make1_str(")")); + $$ = cat_str(5, make_str("("), $2, make_str(") not in ("), $7, make_str(")")); } | '(' row_descriptor ')' all_Op sub_type '(' SubSelect ')' { - $$ = make4_str(make5_str(make1_str("("), $2, make1_str(")"), $4, $5), make1_str("("), $7, make1_str(")")); + $$ = cat_str(8, make_str("("), $2, make_str(")"), $4, $5, make_str("("), $7, make_str(")")); } | '(' row_descriptor ')' all_Op '(' SubSelect ')' { - $$ = make3_str(make5_str(make1_str("("), $2, make1_str(")"), $4, make1_str("(")), $6, make1_str(")")); + $$ = cat_str(7, make_str("("), $2, make_str(")"), $4, make_str("("), $6, make_str(")")); } | '(' row_descriptor ')' all_Op '(' row_descriptor ')' { - $$ = cat3_str(make3_str(make1_str("("), $2, make1_str(")")), $4, make3_str(make1_str("("), $6, make1_str(")"))); + $$ = cat_str(7, make_str("("), $2, make_str(")"), $4, make_str("("), $6, make_str(")")); } ; row_descriptor: row_list ',' a_expr { - $$ = cat3_str($1, make1_str(","), $3); + $$ = cat_str(3, $1, make_str(","), $3); } ; -sub_type: ANY { $$ = make1_str("ANY"); } - | ALL { $$ = make1_str("ALL"); } +sub_type: ANY { $$ = make_str("ANY"); } + | ALL { $$ = make_str("ALL"); } ; row_list: row_list ',' a_expr { - $$ = cat3_str($1, make1_str(","), $3); + $$ = cat_str(3, $1, make_str(","), $3); } | a_expr { @@ -3509,16 +3440,16 @@ row_list: row_list ',' a_expr all_Op: Op | MathOp; -MathOp: '+' { $$ = make1_str("+"); } - | '-' { $$ = make1_str("-"); } - | '*' { $$ = make1_str("*"); } - | '%' { $$ = make1_str("%"); } - | '^' { $$ = make1_str("^"); } - | '|' { $$ = make1_str("|"); } - | '/' { $$ = make1_str("/"); } - | '<' { $$ = make1_str("<"); } - | '>' { $$ = make1_str(">"); } - | '=' { $$ = make1_str("="); } +MathOp: '+' { $$ = make_str("+"); } + | '-' { $$ = make_str("-"); } + | '*' { $$ = make_str("*"); } + | '%' { $$ = make_str("%"); } + | '^' { $$ = make_str("^"); } + | '|' { $$ = make_str("|"); } + | '/' { $$ = make_str("/"); } + | '<' { $$ = make_str("<"); } + | '>' { $$ = make_str(">"); } + | '=' { $$ = make_str("="); } ; /* General expressions @@ -3540,7 +3471,15 @@ MathOp: '+' { $$ = make1_str("+"); } a_expr: com_expr { $$ = $1; } | a_expr TYPECAST Typename - { $$ = cat3_str($1, make1_str("::"), $3); } + { $$ = cat_str(3, $1, make_str("::"), $3); } + /* + * Can't collapse this into prior rule by using a_expr_or_null; + * that creates reduce/reduce conflicts. Grumble. + */ + | NULL_P TYPECAST Typename + { + $$ = cat2_str(make_str("null::"), $3); + } /* * These operators must be called out explicitly in order to make use * of yacc/bison's automatic operator-precedence handling. All other @@ -3551,110 +3490,110 @@ a_expr: com_expr * also to b_expr and to the MathOp list above. */ | '-' a_expr %prec UMINUS - { $$ = cat2_str(make1_str("-"), $2); } + { $$ = cat2_str(make_str("-"), $2); } | '%' a_expr - { $$ = cat2_str(make1_str("%"), $2); } + { $$ = cat2_str(make_str("%"), $2); } | '^' a_expr - { $$ = cat2_str(make1_str("^"), $2); } + { $$ = cat2_str(make_str("^"), $2); } | '|' a_expr - { $$ = cat2_str(make1_str("|"), $2); } + { $$ = cat2_str(make_str("|"), $2); } /* not possible in embedded sql | ':' a_expr - { $$ = cat2_str(make1_str(":"), $2); } + { $$ = cat2_str(make_str(":"), $2); } */ | ';' a_expr - { $$ = cat2_str(make1_str(";"), $2); } + { $$ = cat2_str(make_str(";"), $2); } | a_expr '%' - { $$ = cat2_str($1, make1_str("%")); } + { $$ = cat2_str($1, make_str("%")); } | a_expr '^' - { $$ = cat2_str($1, make1_str("^")); } + { $$ = cat2_str($1, make_str("^")); } | a_expr '|' - { $$ = cat2_str($1, make1_str("|")); } + { $$ = cat2_str($1, make_str("|")); } | a_expr '+' a_expr - { $$ = cat3_str($1, make1_str("+"), $3); } + { $$ = cat_str(3, $1, make_str("+"), $3); } | a_expr '-' a_expr - { $$ = cat3_str($1, make1_str("-"), $3); } + { $$ = cat_str(3, $1, make_str("-"), $3); } | a_expr '*' a_expr - { $$ = cat3_str($1, make1_str("*"), $3); } + { $$ = cat_str(3, $1, make_str("*"), $3); } | a_expr '/' a_expr - { $$ = cat3_str($1, make1_str("/"), $3); } + { $$ = cat_str(3, $1, make_str("/"), $3); } | a_expr '%' a_expr - { $$ = cat3_str($1, make1_str("%"), $3); } + { $$ = cat_str(3, $1, make_str("%"), $3); } | a_expr '^' a_expr - { $$ = cat3_str($1, make1_str("^"), $3); } + { $$ = cat_str(3, $1, make_str("^"), $3); } | a_expr '|' a_expr - { $$ = cat3_str($1, make1_str("|"), $3); } + { $$ = cat_str(3, $1, make_str("|"), $3); } | a_expr '<' a_expr - { $$ = cat3_str($1, make1_str("<"), $3); } + { $$ = cat_str(3, $1, make_str("<"), $3); } | a_expr '>' a_expr - { $$ = cat3_str($1, make1_str(">"), $3); } + { $$ = cat_str(3, $1, make_str(">"), $3); } | a_expr '=' NULL_P - { $$ = cat2_str($1, make1_str("= NULL")); } + { $$ = cat2_str($1, make_str("= NULL")); } /* We allow this for standards-broken SQL products, like MS stuff */ | NULL_P '=' a_expr - { $$ = cat2_str(make1_str("= NULL"), $3); } + { $$ = cat2_str(make_str("= NULL"), $3); } | a_expr '=' a_expr - { $$ = cat3_str($1, make1_str("="), $3); } + { $$ = cat_str(3, $1, make_str("="), $3); } | a_expr Op a_expr - { $$ = cat3_str($1, make1_str("="), $3); } + { $$ = cat_str(3, $1, $2, $3); } | Op a_expr { $$ = cat2_str($1, $2); } | a_expr Op { $$ = cat2_str($1, $2); } | a_expr AND a_expr - { $$ = cat3_str($1, make1_str("and"), $3); } + { $$ = cat_str(3, $1, make_str("and"), $3); } | a_expr OR a_expr - { $$ = cat3_str($1, make1_str("or"), $3); } + { $$ = cat_str(3, $1, make_str("or"), $3); } | NOT a_expr - { $$ = cat2_str(make1_str("not"), $2); } + { $$ = cat2_str(make_str("not"), $2); } | a_expr LIKE a_expr - { $$ = cat3_str($1, make1_str("like"), $3); } + { $$ = cat_str(3, $1, make_str("like"), $3); } | a_expr NOT LIKE a_expr - { $$ = cat3_str($1, make1_str("not like"), $4); } + { $$ = cat_str(3, $1, make_str("not like"), $4); } | a_expr ISNULL - { $$ = cat2_str($1, make1_str("isnull")); } + { $$ = cat2_str($1, make_str("isnull")); } | a_expr IS NULL_P - { $$ = cat2_str($1, make1_str("is null")); } + { $$ = cat2_str($1, make_str("is null")); } | a_expr NOTNULL - { $$ = cat2_str($1, make1_str("notnull")); } + { $$ = cat2_str($1, make_str("notnull")); } | a_expr IS NOT NULL_P - { $$ = cat2_str($1, make1_str("is not null")); } + { $$ = cat2_str($1, make_str("is not null")); } /* IS TRUE, IS FALSE, etc used to be function calls * but let's make them expressions to allow the optimizer * a chance to eliminate them if a_expr is a constant string. * - thomas 1997-12-22 */ | a_expr IS TRUE_P - { $$ = cat2_str($1, make1_str("is true")); } + { $$ = cat2_str($1, make_str("is true")); } | a_expr IS NOT FALSE_P - { $$ = cat2_str($1, make1_str("is not false")); } + { $$ = cat2_str($1, make_str("is not false")); } | a_expr IS FALSE_P - { $$ = cat2_str($1, make1_str("is false")); } + { $$ = cat2_str($1, make_str("is false")); } | a_expr IS NOT TRUE_P - { $$ = cat2_str($1, make1_str("is not true")); } + { $$ = cat2_str($1, make_str("is not true")); } | a_expr BETWEEN b_expr AND b_expr { - $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5); + $$ = cat_str(5, $1, make_str("between"), $3, make_str("and"), $5); } | a_expr NOT BETWEEN b_expr AND b_expr { - $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6); + $$ = cat_str(5, $1, make_str("not between"), $4, make_str("and"), $6); } | a_expr IN '(' in_expr ')' { - $$ = make4_str($1, make1_str(" in ("), $4, make1_str(")")); + $$ = cat_str(4, $1, make_str(" in ("), $4, make_str(")")); } | a_expr NOT IN '(' in_expr ')' { - $$ = make4_str($1, make1_str(" not in ("), $5, make1_str(")")); + $$ = cat_str(4, $1, make_str(" not in ("), $5, make_str(")")); } | a_expr all_Op sub_type '(' SubSelect ')' { - $$ = cat4_str($1, $2, $3, make3_str(make1_str("("), $5, make1_str(")"))); + $$ = cat_str(6, $1, $2, $3, make_str("("), $5, make_str(")")); } | row_expr { $$ = $1; } | cinputvariable - { $$ = make1_str("?"); } + { $$ = make_str("?"); } ; /* Restricted expressions @@ -3671,49 +3610,53 @@ b_expr: com_expr } | b_expr TYPECAST Typename { - $$ = cat3_str($1, make1_str("::"), $3); + $$ = cat_str(3, $1, make_str("::"), $3); } + | NULL_P TYPECAST Typename + { + $$ = cat2_str(make_str("null::"), $3); + } | '-' b_expr %prec UMINUS - { $$ = cat2_str(make1_str("-"), $2); } + { $$ = cat2_str(make_str("-"), $2); } | '%' b_expr - { $$ = cat2_str(make1_str("%"), $2); } + { $$ = cat2_str(make_str("%"), $2); } | '^' b_expr - { $$ = cat2_str(make1_str("^"), $2); } + { $$ = cat2_str(make_str("^"), $2); } | '|' b_expr - { $$ = cat2_str(make1_str("|"), $2); } + { $$ = cat2_str(make_str("|"), $2); } /* not possible in embedded sql | ':' b_expr - { $$ = cat2_str(make1_str(":"), $2); } + { $$ = cat2_str(make_str(":"), $2); } */ | ';' b_expr - { $$ = cat2_str(make1_str(";"), $2); } + { $$ = cat2_str(make_str(";"), $2); } | b_expr '%' - { $$ = cat2_str($1, make1_str("%")); } + { $$ = cat2_str($1, make_str("%")); } | b_expr '^' - { $$ = cat2_str($1, make1_str("^")); } + { $$ = cat2_str($1, make_str("^")); } | b_expr '|' - { $$ = cat2_str($1, make1_str("|")); } + { $$ = cat2_str($1, make_str("|")); } | b_expr '+' b_expr - { $$ = cat3_str($1, make1_str("+"), $3); } + { $$ = cat_str(3, $1, make_str("+"), $3); } | b_expr '-' b_expr - { $$ = cat3_str($1, make1_str("-"), $3); } + { $$ = cat_str(3, $1, make_str("-"), $3); } | b_expr '*' b_expr - { $$ = cat3_str($1, make1_str("*"), $3); } + { $$ = cat_str(3, $1, make_str("*"), $3); } | b_expr '/' b_expr - { $$ = cat3_str($1, make1_str("/"), $3); } + { $$ = cat_str(3, $1, make_str("/"), $3); } | b_expr '%' b_expr - { $$ = cat3_str($1, make1_str("%"), $3); } + { $$ = cat_str(3, $1, make_str("%"), $3); } | b_expr '^' b_expr - { $$ = cat3_str($1, make1_str("^"), $3); } + { $$ = cat_str(3, $1, make_str("^"), $3); } | b_expr '|' b_expr - { $$ = cat3_str($1, make1_str("|"), $3); } + { $$ = cat_str(3, $1, make_str("|"), $3); } | b_expr '<' b_expr - { $$ = cat3_str($1, make1_str("<"), $3); } + { $$ = cat_str(3, $1, make_str("<"), $3); } | b_expr '>' b_expr - { $$ = cat3_str($1, make1_str(">"), $3); } + { $$ = cat_str(3, $1, make_str(">"), $3); } | b_expr '=' b_expr - { $$ = cat3_str($1, make1_str("="), $3); } + { $$ = cat_str(3, $1, make_str("="), $3); } | b_expr Op b_expr - { $$ = cat3_str($1, make1_str("="), $3); } + { $$ = cat_str(3, $1, $2, $3); } | Op b_expr { $$ = cat2_str($1, $2); } | b_expr Op @@ -3737,21 +3680,23 @@ com_expr: attr | AexprConst { $$ = $1; } | '(' a_expr_or_null ')' - { $$ = make3_str(make1_str("("), $2, make1_str(")")); } - | CAST '(' a_expr AS Typename ')' - { $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")"))); } + { $$ = cat_str(3, make_str("("), $2, make_str(")")); } + | CAST '(' a_expr_or_null AS Typename ')' + { $$ = cat_str(5, make_str("cast("), $3, make_str("as"), $5, make_str(")")); } | case_expr { $$ = $1; } | func_name '(' ')' - { $$ = cat2_str($1, make1_str("()")); } + { $$ = cat2_str($1, make_str("()")); } | func_name '(' expr_list ')' - { $$ = make4_str($1, make1_str("("), $3, make1_str(")")); } + { $$ = cat_str(4, $1, make_str("("), $3, make_str(")")); } + | func_name '(' DISTINCT expr_list ')' + { $$ = cat_str(4, $1, make_str("( distinct"), $4, make_str(")")); } | func_name '(' '*' ')' - { $$ = cat2_str($1, make1_str("(*)")); } + { $$ = cat2_str($1, make_str("(*)")); } | CURRENT_DATE - { $$ = make1_str("current_date"); } + { $$ = make_str("current_date"); } | CURRENT_TIME - { $$ = make1_str("current_time"); } + { $$ = make_str("current_time"); } | CURRENT_TIME '(' Iconst ')' { if (atol($3) != 0) @@ -3760,10 +3705,10 @@ com_expr: attr mmerror(ET_WARN, errortext); } - $$ = make1_str("current_time"); + $$ = make_str("current_time"); } | CURRENT_TIMESTAMP - { $$ = make1_str("current_timestamp"); } + { $$ = make_str("current_timestamp"); } | CURRENT_TIMESTAMP '(' Iconst ')' { if (atol($3) != 0) @@ -3772,31 +3717,31 @@ com_expr: attr mmerror(ET_WARN, errortext); } - $$ = make1_str("current_timestamp"); + $$ = make_str("current_timestamp"); } | CURRENT_USER - { $$ = make1_str("current_user"); } + { $$ = make_str("current_user"); } | USER - { $$ = make1_str("user"); } + { $$ = make_str("user"); } | EXTRACT '(' extract_list ')' - { $$ = make3_str(make1_str("extract("), $3, make1_str(")")); } + { $$ = cat_str(3, make_str("extract("), $3, make_str(")")); } | POSITION '(' position_list ')' - { $$ = make3_str(make1_str("position("), $3, make1_str(")")); } + { $$ = cat_str(3, make_str("position("), $3, make_str(")")); } | SUBSTRING '(' substr_list ')' - { $$ = make3_str(make1_str("substring("), $3, make1_str(")")); } + { $$ = cat_str(3, make_str("substring("), $3, make_str(")")); } /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */ | TRIM '(' BOTH trim_list ')' - { $$ = make3_str(make1_str("trim(both"), $4, make1_str(")")); } + { $$ = cat_str(3, make_str("trim(both"), $4, make_str(")")); } | TRIM '(' LEADING trim_list ')' - { $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")")); } + { $$ = cat_str(3, make_str("trim(leading"), $4, make_str(")")); } | TRIM '(' TRAILING trim_list ')' - { $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")")); } + { $$ = cat_str(3, make_str("trim(trailing"), $4, make_str(")")); } | TRIM '(' trim_list ')' - { $$ = make3_str(make1_str("trim("), $3, make1_str(")")); } + { $$ = cat_str(3, make_str("trim("), $3, make_str(")")); } | '(' SubSelect ')' - { $$ = make3_str(make1_str("("), $2, make1_str(")")); } + { $$ = cat_str(3, make_str("("), $2, make_str(")")); } | EXISTS '(' SubSelect ')' - { $$ = make3_str(make1_str("exists("), $3, make1_str(")")); } + { $$ = cat_str(3, make_str("exists("), $3, make_str(")")); } ; /* * This used to use ecpg_expr, but since there is no shift/reduce conflict @@ -3804,11 +3749,11 @@ com_expr: attr */ opt_indirection: '[' a_expr ']' opt_indirection { - $$ = cat4_str(make1_str("["), $2, make1_str("]"), $4); + $$ = cat_str(4, make_str("["), $2, make_str("]"), $4); } | '[' a_expr ':' a_expr ']' opt_indirection { - $$ = cat2_str(cat5_str(make1_str("["), $2, make1_str(":"), $4, make1_str("]")), $6); + $$ = cat_str(6, make_str("["), $2, make_str(":"), $4, make_str("]"), $6); } | /* EMPTY */ { $$ = EMPTY; } @@ -3817,43 +3762,43 @@ opt_indirection: '[' a_expr ']' opt_indirection expr_list: a_expr_or_null { $$ = $1; } | expr_list ',' a_expr_or_null - { $$ = cat3_str($1, make1_str(","), $3); } + { $$ = cat_str(3, $1, make_str(","), $3); } | expr_list USING a_expr - { $$ = cat3_str($1, make1_str("using"), $3); } + { $$ = cat_str(3, $1, make_str("using"), $3); } ; extract_list: extract_arg FROM a_expr { - $$ = cat3_str($1, make1_str("from"), $3); + $$ = cat_str(3, $1, make_str("from"), $3); } | /* EMPTY */ { $$ = EMPTY; } | cinputvariable - { $$ = make1_str("?"); } + { $$ = make_str("?"); } ; extract_arg: datetime { $$ = $1; } - | TIMEZONE_HOUR { $$ = make1_str("timezone_hour"); } - | TIMEZONE_MINUTE { $$ = make1_str("timezone_minute"); } + | TIMEZONE_HOUR { $$ = make_str("timezone_hour"); } + | TIMEZONE_MINUTE { $$ = make_str("timezone_minute"); } ; /* position_list uses b_expr not a_expr to avoid conflict with general IN */ position_list: b_expr IN b_expr - { $$ = cat3_str($1, make1_str("in"), $3); } + { $$ = cat_str(3, $1, make_str("in"), $3); } | /* EMPTY */ { $$ = EMPTY; } ; substr_list: expr_list substr_from substr_for { - $$ = cat3_str($1, $2, $3); + $$ = cat_str(3, $1, $2, $3); } | /* EMPTY */ { $$ = EMPTY; } ; substr_from: FROM expr_list - { $$ = cat2_str(make1_str("from"), $2); } + { $$ = cat2_str(make_str("from"), $2); } | /* EMPTY */ { $$ = EMPTY; @@ -3861,15 +3806,15 @@ substr_from: FROM expr_list ; substr_for: FOR expr_list - { $$ = cat2_str(make1_str("for"), $2); } + { $$ = cat2_str(make_str("for"), $2); } | /* EMPTY */ { $$ = EMPTY; } ; trim_list: a_expr FROM expr_list - { $$ = cat3_str($1, make1_str("from"), $3); } + { $$ = cat_str(3, $1, make_str("from"), $3); } | FROM expr_list - { $$ = cat2_str(make1_str("from"), $2); } + { $$ = cat2_str(make_str("from"), $2); } | expr_list { $$ = $1; } ; @@ -3885,7 +3830,7 @@ in_expr: SubSelect in_expr_nodes: a_expr { $$ = $1; } | in_expr_nodes ',' a_expr - { $$ = cat3_str($1, make1_str(","), $3);} + { $$ = cat_str(3, $1, make_str(","), $3);} ; /* Case clause @@ -3904,16 +3849,16 @@ in_expr_nodes: a_expr * - thomas 1998-11-09 */ case_expr: CASE case_arg when_clause_list case_default END_TRANS - { $$ = cat5_str(make1_str("case"), $2, $3, $4, make1_str("end")); } + { $$ = cat_str(5, make_str("case"), $2, $3, $4, make_str("end")); } | NULLIF '(' a_expr ',' a_expr ')' { - $$ = cat5_str(make1_str("nullif("), $3, make1_str(","), $5, make1_str(")")); + $$ = cat_str(5, make_str("nullif("), $3, make_str(","), $5, make_str(")")); mmerror(ET_WARN, "NULLIF() not yet fully implemented"); } | COALESCE '(' expr_list ')' { - $$ = cat3_str(make1_str("coalesce("), $3, make1_str(")")); + $$ = cat_str(3, make_str("coalesce("), $3, make_str(")")); } ; @@ -3925,11 +3870,11 @@ when_clause_list: when_clause_list when_clause when_clause: WHEN a_expr THEN a_expr_or_null { - $$ = cat4_str(make1_str("when"), $2, make1_str("then"), $4); + $$ = cat_str(4, make_str("when"), $2, make_str("then"), $4); } ; -case_default: ELSE a_expr_or_null { $$ = cat2_str(make1_str("else"), $2); } +case_default: ELSE a_expr_or_null { $$ = cat2_str(make_str("else"), $2); } | /*EMPTY*/ { $$ = EMPTY; } ; @@ -3942,20 +3887,20 @@ case_arg: a_expr { attr: relation_name '.' attrs opt_indirection { - $$ = make4_str($1, make1_str("."), $3, $4); + $$ = cat_str(4, $1, make_str("."), $3, $4); } | ParamNo '.' attrs opt_indirection { - $$ = make4_str($1, make1_str("."), $3, $4); + $$ = cat_str(4, $1, make_str("."), $3, $4); } ; attrs: attr_name { $$ = $1; } | attrs '.' attr_name - { $$ = make3_str($1, make1_str("."), $3); } + { $$ = cat_str(3, $1, make_str("."), $3); } | attrs '.' '*' - { $$ = make2_str($1, make1_str(".*")); } + { $$ = make2_str($1, make_str(".*")); } ; @@ -3967,7 +3912,7 @@ attrs: attr_name /* Target lists as found in SELECT ... and INSERT VALUES ( ... ) */ target_list: target_list ',' target_el - { $$ = cat3_str($1, make1_str(","), $3); } + { $$ = cat_str(3, $1, make_str(","), $3); } | target_el { $$ = $1; } ; @@ -3975,7 +3920,7 @@ target_list: target_list ',' target_el /* AS is not optional because shift/red conflict with unary ops */ target_el: a_expr_or_null AS ColLabel { - $$ = cat3_str($1, make1_str("as"), $3); + $$ = cat_str(3, $1, make_str("as"), $3); } | a_expr_or_null { @@ -3983,25 +3928,25 @@ target_el: a_expr_or_null AS ColLabel } | relation_name '.' '*' { - $$ = make2_str($1, make1_str(".*")); + $$ = make2_str($1, make_str(".*")); } | '*' { - $$ = make1_str("*"); + $$ = make_str("*"); } ; /* Target list as found in UPDATE table SET ... */ update_target_list: update_target_list ',' update_target_el - { $$ = cat3_str($1, make1_str(","),$3); } + { $$ = cat_str(3, $1, make_str(","),$3); } | update_target_el { $$ = $1; } - | '*' { $$ = make1_str("*"); } + | '*' { $$ = make_str("*"); } ; update_target_el: ColId opt_indirection '=' a_expr_or_null { - $$ = cat4_str($1, $2, make1_str("="), $4); + $$ = cat_str(4, $1, $2, make_str("="), $4); } ; @@ -4020,7 +3965,7 @@ relation_name: SpecialRuleRelation /* disallow refs to variable system tables */ if (strcmp(LogRelationName, $1) == 0 || strcmp(VariableRelationName, $1) == 0) { - sprintf(errortext, make1_str("%s cannot be accessed by users"),$1); + sprintf(errortext, make_str("%s cannot be accessed by users"),$1); mmerror(ET_ERROR, errortext); } else @@ -4070,11 +4015,11 @@ AexprConst: Iconst { $$ = $1; } | TRUE_P { - $$ = make1_str("true"); + $$ = make_str("true"); } | FALSE_P { - $$ = make1_str("false"); + $$ = make_str("false"); } ; @@ -4118,122 +4063,122 @@ TypeId: ColId */ ColId: ident { $$ = $1; } | datetime { $$ = $1; } - | ABSOLUTE { $$ = make1_str("absolute"); } - | ACCESS { $$ = make1_str("access"); } - | ACTION { $$ = make1_str("action"); } - | AFTER { $$ = make1_str("after"); } - | AGGREGATE { $$ = make1_str("aggregate"); } - | BACKWARD { $$ = make1_str("backward"); } - | BEFORE { $$ = make1_str("before"); } - | CACHE { $$ = make1_str("cache"); } - | COMMENT { $$ = make1_str("comment"); } - | COMMITTED { $$ = make1_str("committed"); } - | CONSTRAINTS { $$ = make1_str("constraints"); } - | CREATEDB { $$ = make1_str("createdb"); } - | CREATEUSER { $$ = make1_str("createuser"); } - | CYCLE { $$ = make1_str("cycle"); } - | DATABASE { $$ = make1_str("database"); } - | DEFERRABLE { $$ = make1_str("deferrable"); } - | DEFERRED { $$ = make1_str("deferred"); } - | DELIMITERS { $$ = make1_str("delimiters"); } - | DOUBLE { $$ = make1_str("double"); } - | EACH { $$ = make1_str("each"); } - | ENCODING { $$ = make1_str("encoding"); } - | EXCLUSIVE { $$ = make1_str("exclusive"); } - | FORWARD { $$ = make1_str("forward"); } - | FUNCTION { $$ = make1_str("function"); } - | HANDLER { $$ = make1_str("handler"); } - | IMMEDIATE { $$ = make1_str("immediate"); } - | INCREMENT { $$ = make1_str("increment"); } - | INDEX { $$ = make1_str("index"); } - | INHERITS { $$ = make1_str("inherits"); } - | INITIALLY { $$ = make1_str("initially"); } - | INSENSITIVE { $$ = make1_str("insensitive"); } - | INSTEAD { $$ = make1_str("instead"); } - | ISNULL { $$ = make1_str("isnull"); } - | ISOLATION { $$ = make1_str("isolation"); } - | KEY { $$ = make1_str("key"); } - | LANGUAGE { $$ = make1_str("language"); } - | LANCOMPILER { $$ = make1_str("lancompiler"); } - | LEVEL { $$ = make1_str("level"); } - | LOCATION { $$ = make1_str("location"); } - | MATCH { $$ = make1_str("match"); } - | MAXVALUE { $$ = make1_str("maxvalue"); } - | MINVALUE { $$ = make1_str("minvalue"); } - | MODE { $$ = make1_str("mode"); } - | NEXT { $$ = make1_str("next"); } - | NOCREATEDB { $$ = make1_str("nocreatedb"); } - | NOCREATEUSER { $$ = make1_str("nocreateuser"); } - | NOTHING { $$ = make1_str("nothing"); } - | NOTNULL { $$ = make1_str("notnull"); } - | OF { $$ = make1_str("of"); } - | OIDS { $$ = make1_str("oids"); } - | ONLY { $$ = make1_str("only"); } - | OPERATOR { $$ = make1_str("operator"); } - | OPTION { $$ = make1_str("option"); } - | PASSWORD { $$ = make1_str("password"); } - | PENDANT { $$ = make1_str("pendant"); } - | PRIOR { $$ = make1_str("prior"); } - | PRIVILEGES { $$ = make1_str("privileges"); } - | PROCEDURAL { $$ = make1_str("procedural"); } - | READ { $$ = make1_str("read"); } - | RELATIVE { $$ = make1_str("relative"); } - | RENAME { $$ = make1_str("rename"); } - | RESTRICT { $$ = make1_str("restrict"); } - | RETURNS { $$ = make1_str("returns"); } - | ROW { $$ = make1_str("row"); } - | RULE { $$ = make1_str("rule"); } - | SCROLL { $$ = make1_str("scroll"); } - | SEQUENCE { $$ = make1_str("sequence"); } - | SERIAL { $$ = make1_str("serial"); } - | SERIALIZABLE { $$ = make1_str("serializable"); } - | SHARE { $$ = make1_str("share"); } - | START { $$ = make1_str("start"); } - | STATEMENT { $$ = make1_str("statement"); } - | STDIN { $$ = make1_str("stdin"); } - | STDOUT { $$ = make1_str("stdout"); } - | SYSID { $$ = make1_str("sysid"); } - | TIME { $$ = make1_str("time"); } - | TIMESTAMP { $$ = make1_str("timestamp"); } - | TIMEZONE_HOUR { $$ = make1_str("timezone_hour"); } - | TIMEZONE_MINUTE { $$ = make1_str("timezone_minute"); } - | TRIGGER { $$ = make1_str("trigger"); } - | TRUNCATE { $$ = make1_str("truncate"); } - | TRUSTED { $$ = make1_str("trusted"); } - | TYPE_P { $$ = make1_str("type"); } - | VALID { $$ = make1_str("valid"); } - | VERSION { $$ = make1_str("version"); } - | ZONE { $$ = make1_str("zone"); } - | SQL_AT { $$ = make1_str("at"); } - | SQL_BOOL { $$ = make1_str("bool"); } - | SQL_BREAK { $$ = make1_str("break"); } - | SQL_CALL { $$ = make1_str("call"); } - | SQL_CONNECT { $$ = make1_str("connect"); } - | SQL_CONTINUE { $$ = make1_str("continue"); } - | SQL_DEALLOCATE { $$ = make1_str("deallocate"); } - | SQL_DISCONNECT { $$ = make1_str("disconnect"); } - | SQL_FOUND { $$ = make1_str("found"); } - | SQL_GO { $$ = make1_str("go"); } - | SQL_GOTO { $$ = make1_str("goto"); } - | SQL_IDENTIFIED { $$ = make1_str("identified"); } - | SQL_INDICATOR { $$ = make1_str("indicator"); } - | SQL_INT { $$ = make1_str("int"); } - | SQL_LONG { $$ = make1_str("long"); } - | SQL_OFF { $$ = make1_str("off"); } - | SQL_OPEN { $$ = make1_str("open"); } - | SQL_PREPARE { $$ = make1_str("prepare"); } - | SQL_RELEASE { $$ = make1_str("release"); } - | SQL_SECTION { $$ = make1_str("section"); } - | SQL_SHORT { $$ = make1_str("short"); } - | SQL_SIGNED { $$ = make1_str("signed"); } - | SQL_SQLERROR { $$ = make1_str("sqlerror"); } - | SQL_SQLPRINT { $$ = make1_str("sqlprint"); } - | SQL_SQLWARNING { $$ = make1_str("sqlwarning"); } - | SQL_STOP { $$ = make1_str("stop"); } - | SQL_STRUCT { $$ = make1_str("struct"); } - | SQL_UNSIGNED { $$ = make1_str("unsigned"); } - | SQL_VAR { $$ = make1_str("var"); } - | SQL_WHENEVER { $$ = make1_str("whenever"); } + | ABSOLUTE { $$ = make_str("absolute"); } + | ACCESS { $$ = make_str("access"); } + | ACTION { $$ = make_str("action"); } + | AFTER { $$ = make_str("after"); } + | AGGREGATE { $$ = make_str("aggregate"); } + | BACKWARD { $$ = make_str("backward"); } + | BEFORE { $$ = make_str("before"); } + | CACHE { $$ = make_str("cache"); } + | COMMENT { $$ = make_str("comment"); } + | COMMITTED { $$ = make_str("committed"); } + | CONSTRAINTS { $$ = make_str("constraints"); } + | CREATEDB { $$ = make_str("createdb"); } + | CREATEUSER { $$ = make_str("createuser"); } + | CYCLE { $$ = make_str("cycle"); } + | DATABASE { $$ = make_str("database"); } + | DEFERRABLE { $$ = make_str("deferrable"); } + | DEFERRED { $$ = make_str("deferred"); } + | DELIMITERS { $$ = make_str("delimiters"); } + | DOUBLE { $$ = make_str("double"); } + | EACH { $$ = make_str("each"); } + | ENCODING { $$ = make_str("encoding"); } + | EXCLUSIVE { $$ = make_str("exclusive"); } + | FORWARD { $$ = make_str("forward"); } + | FUNCTION { $$ = make_str("function"); } + | HANDLER { $$ = make_str("handler"); } + | IMMEDIATE { $$ = make_str("immediate"); } + | INCREMENT { $$ = make_str("increment"); } + | INDEX { $$ = make_str("index"); } + | INHERITS { $$ = make_str("inherits"); } + | INITIALLY { $$ = make_str("initially"); } + | INSENSITIVE { $$ = make_str("insensitive"); } + | INSTEAD { $$ = make_str("instead"); } + | ISNULL { $$ = make_str("isnull"); } + | ISOLATION { $$ = make_str("isolation"); } + | KEY { $$ = make_str("key"); } + | LANGUAGE { $$ = make_str("language"); } + | LANCOMPILER { $$ = make_str("lancompiler"); } + | LEVEL { $$ = make_str("level"); } + | LOCATION { $$ = make_str("location"); } + | MATCH { $$ = make_str("match"); } + | MAXVALUE { $$ = make_str("maxvalue"); } + | MINVALUE { $$ = make_str("minvalue"); } + | MODE { $$ = make_str("mode"); } + | NEXT { $$ = make_str("next"); } + | NOCREATEDB { $$ = make_str("nocreatedb"); } + | NOCREATEUSER { $$ = make_str("nocreateuser"); } + | NOTHING { $$ = make_str("nothing"); } + | NOTNULL { $$ = make_str("notnull"); } + | OF { $$ = make_str("of"); } + | OIDS { $$ = make_str("oids"); } + | ONLY { $$ = make_str("only"); } + | OPERATOR { $$ = make_str("operator"); } + | OPTION { $$ = make_str("option"); } + | PASSWORD { $$ = make_str("password"); } + | PENDANT { $$ = make_str("pendant"); } + | PRIOR { $$ = make_str("prior"); } + | PRIVILEGES { $$ = make_str("privileges"); } + | PROCEDURAL { $$ = make_str("procedural"); } + | READ { $$ = make_str("read"); } + | RELATIVE { $$ = make_str("relative"); } + | RENAME { $$ = make_str("rename"); } + | RESTRICT { $$ = make_str("restrict"); } + | RETURNS { $$ = make_str("returns"); } + | ROW { $$ = make_str("row"); } + | RULE { $$ = make_str("rule"); } + | SCROLL { $$ = make_str("scroll"); } + | SEQUENCE { $$ = make_str("sequence"); } + | SERIAL { $$ = make_str("serial"); } + | SERIALIZABLE { $$ = make_str("serializable"); } + | SHARE { $$ = make_str("share"); } + | START { $$ = make_str("start"); } + | STATEMENT { $$ = make_str("statement"); } + | STDIN { $$ = make_str("stdin"); } + | STDOUT { $$ = make_str("stdout"); } + | SYSID { $$ = make_str("sysid"); } + | TIME { $$ = make_str("time"); } + | TIMESTAMP { $$ = make_str("timestamp"); } + | TIMEZONE_HOUR { $$ = make_str("timezone_hour"); } + | TIMEZONE_MINUTE { $$ = make_str("timezone_minute"); } + | TRIGGER { $$ = make_str("trigger"); } + | TRUNCATE { $$ = make_str("truncate"); } + | TRUSTED { $$ = make_str("trusted"); } + | TYPE_P { $$ = make_str("type"); } + | VALID { $$ = make_str("valid"); } + | VERSION { $$ = make_str("version"); } + | ZONE { $$ = make_str("zone"); } + | SQL_AT { $$ = make_str("at"); } + | SQL_BOOL { $$ = make_str("bool"); } + | SQL_BREAK { $$ = make_str("break"); } + | SQL_CALL { $$ = make_str("call"); } + | SQL_CONNECT { $$ = make_str("connect"); } + | SQL_CONTINUE { $$ = make_str("continue"); } + | SQL_DEALLOCATE { $$ = make_str("deallocate"); } + | SQL_DISCONNECT { $$ = make_str("disconnect"); } + | SQL_FOUND { $$ = make_str("found"); } + | SQL_GO { $$ = make_str("go"); } + | SQL_GOTO { $$ = make_str("goto"); } + | SQL_IDENTIFIED { $$ = make_str("identified"); } + | SQL_INDICATOR { $$ = make_str("indicator"); } + | SQL_INT { $$ = make_str("int"); } + | SQL_LONG { $$ = make_str("long"); } + | SQL_OFF { $$ = make_str("off"); } + | SQL_OPEN { $$ = make_str("open"); } + | SQL_PREPARE { $$ = make_str("prepare"); } + | SQL_RELEASE { $$ = make_str("release"); } + | SQL_SECTION { $$ = make_str("section"); } + | SQL_SHORT { $$ = make_str("short"); } + | SQL_SIGNED { $$ = make_str("signed"); } + | SQL_SQLERROR { $$ = make_str("sqlerror"); } + | SQL_SQLPRINT { $$ = make_str("sqlprint"); } + | SQL_SQLWARNING { $$ = make_str("sqlwarning"); } + | SQL_STOP { $$ = make_str("stop"); } + | SQL_STRUCT { $$ = make_str("struct"); } + | SQL_UNSIGNED { $$ = make_str("unsigned"); } + | SQL_VAR { $$ = make_str("var"); } + | SQL_WHENEVER { $$ = make_str("whenever"); } ; /* Column label * Allowed labels in "AS" clauses. @@ -4246,56 +4191,56 @@ ColId: ident { $$ = $1; } * when used as a full identifier. - thomas 1997-11-06 */ ColLabel: ColId { $$ = $1; } - | ABORT_TRANS { $$ = make1_str("abort"); } - | ANALYZE { $$ = make1_str("analyze"); } - | BINARY { $$ = make1_str("binary"); } - | CASE { $$ = make1_str("case"); } - | CLUSTER { $$ = make1_str("cluster"); } - | COALESCE { $$ = make1_str("coalesce"); } - | CONSTRAINT { $$ = make1_str("constraint"); } - | COPY { $$ = make1_str("copy"); } - | CURRENT { $$ = make1_str("current"); } - | DO { $$ = make1_str("do"); } - | ELSE { $$ = make1_str("else"); } - | END_TRANS { $$ = make1_str("end"); } - | EXPLAIN { $$ = make1_str("explain"); } - | EXTEND { $$ = make1_str("extend"); } - | FALSE_P { $$ = make1_str("false"); } - | FOREIGN { $$ = make1_str("foreign"); } - | GROUP { $$ = make1_str("group"); } - | LISTEN { $$ = make1_str("listen"); } - | LOAD { $$ = make1_str("load"); } - | LOCK_P { $$ = make1_str("lock"); } - | MOVE { $$ = make1_str("move"); } - | NEW { $$ = make1_str("new"); } - | NONE { $$ = make1_str("none"); } - | NULLIF { $$ = make1_str("nullif"); } - | ORDER { $$ = make1_str("order"); } - | POSITION { $$ = make1_str("position"); } - | PRECISION { $$ = make1_str("precision"); } - | RESET { $$ = make1_str("reset"); } - | SETOF { $$ = make1_str("setof"); } - | SHOW { $$ = make1_str("show"); } - | TABLE { $$ = make1_str("table"); } - | THEN { $$ = make1_str("then"); } - | TRANSACTION { $$ = make1_str("transaction"); } - | TRUE_P { $$ = make1_str("true"); } - | VACUUM { $$ = make1_str("vacuum"); } - | VERBOSE { $$ = make1_str("verbose"); } - | WHEN { $$ = make1_str("when"); } + | ABORT_TRANS { $$ = make_str("abort"); } + | ANALYZE { $$ = make_str("analyze"); } + | BINARY { $$ = make_str("binary"); } + | CASE { $$ = make_str("case"); } + | CLUSTER { $$ = make_str("cluster"); } + | COALESCE { $$ = make_str("coalesce"); } + | CONSTRAINT { $$ = make_str("constraint"); } + | COPY { $$ = make_str("copy"); } + | CURRENT { $$ = make_str("current"); } + | DO { $$ = make_str("do"); } + | ELSE { $$ = make_str("else"); } + | END_TRANS { $$ = make_str("end"); } + | EXPLAIN { $$ = make_str("explain"); } + | EXTEND { $$ = make_str("extend"); } + | FALSE_P { $$ = make_str("false"); } + | FOREIGN { $$ = make_str("foreign"); } + | GROUP { $$ = make_str("group"); } + | LISTEN { $$ = make_str("listen"); } + | LOAD { $$ = make_str("load"); } + | LOCK_P { $$ = make_str("lock"); } + | MOVE { $$ = make_str("move"); } + | NEW { $$ = make_str("new"); } + | NONE { $$ = make_str("none"); } + | NULLIF { $$ = make_str("nullif"); } + | ORDER { $$ = make_str("order"); } + | POSITION { $$ = make_str("position"); } + | PRECISION { $$ = make_str("precision"); } + | RESET { $$ = make_str("reset"); } + | SETOF { $$ = make_str("setof"); } + | SHOW { $$ = make_str("show"); } + | TABLE { $$ = make_str("table"); } + | THEN { $$ = make_str("then"); } + | TRANSACTION { $$ = make_str("transaction"); } + | TRUE_P { $$ = make_str("true"); } + | VACUUM { $$ = make_str("vacuum"); } + | VERBOSE { $$ = make_str("verbose"); } + | WHEN { $$ = make_str("when"); } ; SpecialRuleRelation: CURRENT { if (QueryIsRule) - $$ = make1_str("current"); + $$ = make_str("current"); else mmerror(ET_ERROR, "CURRENT used in non-rule query"); } | NEW { if (QueryIsRule) - $$ = make1_str("new"); + $$ = make_str("new"); else mmerror(ET_ERROR, "NEW used in non-rule query"); } @@ -4310,16 +4255,16 @@ SpecialRuleRelation: CURRENT */ ECPGConnect: SQL_CONNECT TO connection_target opt_connection_name opt_user { - $$ = make5_str($3, make1_str(","), $5, make1_str(","), $4); + $$ = cat_str(5, $3, make_str(","), $5, make_str(","), $4); } | SQL_CONNECT TO DEFAULT { - $$ = make1_str("NULL,NULL,NULL,\"DEFAULT\""); + $$ = make_str("NULL,NULL,NULL,\"DEFAULT\""); } /* also allow ORACLE syntax */ | SQL_CONNECT ora_user { - $$ = make3_str(make1_str("NULL,"), $2, make1_str(",NULL")); + $$ = cat_str(3, make_str("NULL,"), $2, make_str(",NULL")); } connection_target: database_name opt_server opt_port @@ -4331,7 +4276,7 @@ connection_target: database_name opt_server opt_port mmerror(ET_ERROR, errortext); } - $$ = make5_str(make1_str("\""), $1, $2, $3, make1_str("\"")); + $$ = make3_str(make_str("\""), make3_str($1, $2, $3), make_str("\"")); } | db_prefix server opt_port '/' database_name opt_options { @@ -4354,7 +4299,7 @@ connection_target: database_name opt_server opt_port mmerror(ET_ERROR, errortext); } - $$ = make4_str(make5_str(make1_str("\""), $1, $2, $3, make1_str("/")), $5, $6, make1_str("\"")); + $$ = make2_str(make3_str(make_str("\""), $1, $2), make3_str(make3_str($3, make_str("/"), $5), $6, make_str("\""))); } | char_variable { @@ -4382,7 +4327,7 @@ db_prefix: ident cvariable mmerror(ET_ERROR, errortext); } - $$ = make3_str($1, make1_str(":"), $2); + $$ = make3_str( $1, make_str(":"), $2); } server: Op server_name @@ -4400,41 +4345,41 @@ opt_server: server { $$ = $1; } | /* empty */ { $$ = EMPTY; } server_name: ColId { $$ = $1; } - | ColId '.' server_name { $$ = make3_str($1, make1_str("."), $3); } + | ColId '.' server_name { $$ = make3_str($1, make_str("."), $3); } -opt_port: ':' Iconst { $$ = make2_str(make1_str(":"), $2); } +opt_port: ':' Iconst { $$ = make2_str(make_str(":"), $2); } | /* empty */ { $$ = EMPTY; } opt_connection_name: AS connection_target { $$ = $2; } - | /* empty */ { $$ = make1_str("NULL"); } + | /* empty */ { $$ = make_str("NULL"); } opt_user: USER ora_user { $$ = $2; } - | /* empty */ { $$ = make1_str("NULL,NULL"); } + | /* empty */ { $$ = make_str("NULL,NULL"); } ora_user: user_name { - $$ = make2_str($1, make1_str(",NULL")); + $$ = cat2_str($1, make_str(", NULL")); } | user_name '/' user_name { - $$ = make3_str($1, make1_str(","), $3); + $$ = cat_str(3, $1, make_str(","), $3); } | user_name SQL_IDENTIFIED BY user_name { - $$ = make3_str($1, make1_str(","), $4); + $$ = cat_str(3, $1, make_str(","), $4); } | user_name USING user_name { - $$ = make3_str($1, make1_str(","), $3); + $$ = cat_str(3, $1, make_str(","), $3); } user_name: UserId { if ($1[0] == '\"') $$ = $1; else - $$ = make3_str(make1_str("\""), $1, make1_str("\"")); + $$ = make3_str(make_str("\""), $1, make_str("\"")); } | char_variable { $$ = $1; } - | SCONST { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); } + | SCONST { $$ = make3_str(make_str("\""), $1, make_str("\"")); } char_variable: cvariable { /* check if we have a char variable */ @@ -4452,7 +4397,7 @@ char_variable: cvariable $$ = $1; break; case ECPGt_varchar: - $$ = make2_str($1, make1_str(".arr")); + $$ = make2_str($1, make_str(".arr")); break; default: mmerror(ET_ERROR, "invalid datatype"); @@ -4471,7 +4416,7 @@ opt_options: Op ColId mmerror(ET_ERROR, errortext); } - $$ = make2_str(make1_str("?"), $2); + $$ = make2_str(make_str("?"), $2); } | /* empty */ { $$ = EMPTY; } @@ -4500,7 +4445,7 @@ ECPGCursorStmt: DECLARE name opt_cursor CURSOR FOR ident this->next = cur; this->name = $2; this->connection = connection; - this->command = cat4_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for ?")); + this->command = cat_str(4, make_str("declare"), mm_strdup($2), $3, make_str("cursor for ?")); this->argsresult = NULL; thisquery->type = &ecpg_query; @@ -4514,7 +4459,7 @@ ECPGCursorStmt: DECLARE name opt_cursor CURSOR FOR ident cur = this; - $$ = cat3_str(make1_str("/*"), mm_strdup(this->command), make1_str("*/")); + $$ = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/")); } ; @@ -4522,7 +4467,7 @@ ECPGCursorStmt: DECLARE name opt_cursor CURSOR FOR ident * the exec sql deallocate prepare command to deallocate a previously * prepared statement */ -ECPGDeallocate: SQL_DEALLOCATE SQL_PREPARE ident { $$ = make3_str(make1_str("ECPGdeallocate(__LINE__, \""), $3, make1_str("\");")); } +ECPGDeallocate: SQL_DEALLOCATE SQL_PREPARE ident { $$ = cat_str(3, make_str("ECPGdeallocate(__LINE__, \""), $3, make_str("\");")); } /* * variable declaration inside the exec sql declare block @@ -4564,15 +4509,15 @@ declaration: storage_clause } variable_list ';' { - $$ = cat4_str($1, $3.type_str, $5, make1_str(";\n")); + $$ = cat_str(4, $1, $3.type_str, $5, make_str(";\n")); } -storage_clause : S_EXTERN { $$ = make1_str("extern"); } - | S_STATIC { $$ = make1_str("static"); } - | S_SIGNED { $$ = make1_str("signed"); } - | S_CONST { $$ = make1_str("const"); } - | S_REGISTER { $$ = make1_str("register"); } - | S_AUTO { $$ = make1_str("auto"); } +storage_clause : S_EXTERN { $$ = make_str("extern"); } + | S_STATIC { $$ = make_str("static"); } + | S_SIGNED { $$ = make_str("signed"); } + | S_CONST { $$ = make_str("const"); } + | S_REGISTER { $$ = make_str("register"); } + | S_AUTO { $$ = make_str("auto"); } | /* empty */ { $$ = EMPTY; } type: simple_type @@ -4624,23 +4569,23 @@ type: simple_type enum_type: s_enum '{' c_list '}' { - $$ = cat4_str($1, make1_str("{"), $3, make1_str("}")); + $$ = cat_str(4, $1, make_str("{"), $3, make_str("}")); } -s_enum: S_ENUM opt_symbol { $$ = cat2_str(make1_str("enum"), $2); } +s_enum: S_ENUM opt_symbol { $$ = cat2_str(make_str("enum"), $2); } struct_type: s_struct '{' variable_declarations '}' { ECPGfree_struct_member(struct_member_list[struct_level]); free(actual_storage[struct_level--]); - $$ = cat4_str($1, make1_str("{"), $3, make1_str("}")); + $$ = cat_str(4, $1, make_str("{"), $3, make_str("}")); } union_type: s_union '{' variable_declarations '}' { ECPGfree_struct_member(struct_member_list[struct_level]); free(actual_storage[struct_level--]); - $$ = cat4_str($1, make1_str("{"), $3, make1_str("}")); + $$ = cat_str(4, $1, make_str("{"), $3, make_str("}")); } s_struct : S_STRUCT opt_symbol @@ -4648,7 +4593,7 @@ s_struct : S_STRUCT opt_symbol struct_member_list[struct_level++] = NULL; if (struct_level >= STRUCT_DEPTH) mmerror(ET_ERROR, "Too many levels in nested structure definition"); - $$ = cat2_str(make1_str("struct"), $2); + $$ = cat2_str(make_str("struct"), $2); } s_union : S_UNION opt_symbol @@ -4656,7 +4601,7 @@ s_union : S_UNION opt_symbol struct_member_list[struct_level++] = NULL; if (struct_level >= STRUCT_DEPTH) mmerror(ET_ERROR, "Too many levels in nested structure definition"); - $$ = cat2_str(make1_str("union"), $2); + $$ = cat2_str(make_str("union"), $2); } opt_symbol: /* empty */ { $$ = EMPTY; } @@ -4682,7 +4627,7 @@ variable_list: variable } | variable_list ',' variable { - $$ = cat3_str($1, make1_str(","), $3); + $$ = cat_str(3, $1, make_str(","), $3); } variable: opt_pointer symbol opt_array_bounds opt_initializer @@ -4703,7 +4648,7 @@ variable: opt_pointer symbol opt_array_bounds opt_initializer else type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum), dimension); - $$ = make4_str($1, mm_strdup($2), $3.str, $4); + $$ = cat_str(4, $1, mm_strdup($2), $3.str, $4); break; case ECPGt_varchar: if (dimension == -1) @@ -4728,9 +4673,9 @@ variable: opt_pointer symbol opt_array_bounds opt_initializer mmerror(ET_ERROR, "pointer to varchar are not implemented"); if (dimension == 0) - $$ = make4_str(make5_str(mm_strdup(actual_storage[struct_level]), make1_str(" struct varchar_"), mm_strdup($2), make1_str(" { int len; char arr["), mm_strdup(ascii_len)), make1_str("]; } *"), mm_strdup($2), $4); + $$ = cat_str(7, mm_strdup(actual_storage[struct_level]), make2_str(make_str(" struct varchar_"), mm_strdup($2)), make_str(" { int len; char arr["), mm_strdup(ascii_len), make_str("]; } *"), mm_strdup($2), $4); else - $$ = make5_str(make5_str(mm_strdup(actual_storage[struct_level]), make1_str(" struct varchar_"), mm_strdup($2), make1_str(" { int len; char arr["), mm_strdup(ascii_len)), make1_str("]; } "), mm_strdup($2), mm_strdup(dim), $4); + $$ = cat_str(8, mm_strdup(actual_storage[struct_level]), make2_str(make_str(" struct varchar_"), mm_strdup($2)), make_str(" { int len; char arr["), mm_strdup(ascii_len), make_str("]; } "), mm_strdup($2), mm_strdup(dim), $4); break; case ECPGt_char: @@ -4740,7 +4685,7 @@ variable: opt_pointer symbol opt_array_bounds opt_initializer else type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension); - $$ = make4_str($1, mm_strdup($2), $3.str, $4); + $$ = cat_str(4, $1, mm_strdup($2), $3.str, $4); break; default: if (dimension < 0) @@ -4748,7 +4693,7 @@ variable: opt_pointer symbol opt_array_bounds opt_initializer else type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, 1), dimension); - $$ = make4_str($1, mm_strdup($2), $3.str, $4); + $$ = cat_str(4, $1, mm_strdup($2), $3.str, $4); break; } @@ -4761,10 +4706,10 @@ variable: opt_pointer symbol opt_array_bounds opt_initializer } opt_initializer: /* empty */ { $$ = EMPTY; } - | '=' c_term { $$ = make2_str(make1_str("="), $2); } + | '=' c_term { $$ = cat2_str(make_str("="), $2); } opt_pointer: /* empty */ { $$ = EMPTY; } - | '*' { $$ = make1_str("*"); } + | '*' { $$ = make_str("*"); } /* * As long as the prepare statement is not supported by the backend, we will @@ -4773,7 +4718,7 @@ opt_pointer: /* empty */ { $$ = EMPTY; } ECPGDeclare: DECLARE STATEMENT ident { /* this is only supported for compatibility */ - $$ = cat3_str(make1_str("/* declare statement"), $3, make1_str("*/")); + $$ = cat_str(3, make_str("/* declare statement"), $3, make_str("*/")); } /* * the exec sql disconnect statement: disconnect from the given database @@ -4781,12 +4726,12 @@ ECPGDeclare: DECLARE STATEMENT ident ECPGDisconnect: SQL_DISCONNECT dis_name { $$ = $2; } dis_name: connection_object { $$ = $1; } - | CURRENT { $$ = make1_str("CURRENT"); } - | ALL { $$ = make1_str("ALL"); } - | /* empty */ { $$ = make1_str("CURRENT"); } + | CURRENT { $$ = make_str("CURRENT"); } + | ALL { $$ = make_str("ALL"); } + | /* empty */ { $$ = make_str("CURRENT"); } connection_object: connection_target { $$ = $1; } - | DEFAULT { $$ = make1_str("DEFAULT"); } + | DEFAULT { $$ = make_str("DEFAULT"); } /* * execute a given string as sql command @@ -4802,7 +4747,7 @@ ECPGExecute : EXECUTE IMMEDIATE execstring add_variable(&argsinsert, thisquery, &no_indicator); - $$ = make1_str("?"); + $$ = make_str("?"); } | EXECUTE ident { @@ -4817,11 +4762,11 @@ ECPGExecute : EXECUTE IMMEDIATE execstring add_variable(&argsinsert, thisquery, &no_indicator); } ecpg_using { - $$ = make1_str("?"); + $$ = make_str("?"); } execstring: char_variable | - CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }; + CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }; /* * the exec sql free command to deallocate a previously @@ -4850,7 +4795,7 @@ variablelist: cinputvariable | cinputvariable ',' variablelist */ ECPGPrepare: SQL_PREPARE ident FROM execstring { - $$ = make4_str(make1_str("\""), $2, make1_str("\", "), $4); + $$ = cat2_str(make3_str(make_str("\""), $2, make_str("\",")), $4); } /* @@ -4880,8 +4825,8 @@ ECPGSetAutocommit: SET SQL_AUTOCOMMIT to_equal on_off $$ = $4; } -on_off: ON { $$ = make1_str("on"); } - | SQL_OFF { $$ = make1_str("off"); } +on_off: ON { $$ = make_str("on"); } + | SQL_OFF { $$ = make_str("off"); } to_equal: TO | '='; @@ -4936,20 +4881,20 @@ ECPGTypedef: TYPE_P symbol IS ctype opt_type_array_bounds opt_reference types = this; - $$ = cat5_str(cat3_str(make1_str("/* exec sql type"), mm_strdup($2), make1_str("is")), mm_strdup($4.type_str), mm_strdup($5.str), $6, make1_str("*/")); + $$ = cat_str(7, make_str("/* exec sql type"), mm_strdup($2), make_str("is"), mm_strdup($4.type_str), mm_strdup($5.str), $6, make_str("*/")); } opt_type_array_bounds: '[' ']' opt_type_array_bounds { $$.index1 = 0; $$.index2 = $3.index1; - $$.str = cat2_str(make1_str("[]"), $3.str); + $$.str = cat2_str(make_str("[]"), $3.str); } | '(' ')' opt_type_array_bounds { $$.index1 = 0; $$.index2 = $3.index1; - $$.str = cat2_str(make1_str("[]"), $3.str); + $$.str = cat2_str(make_str("[]"), $3.str); } | '[' Iresult ']' opt_type_array_bounds { @@ -4958,7 +4903,7 @@ opt_type_array_bounds: '[' ']' opt_type_array_bounds sprintf (txt, "%d", $2); $$.index1 = $2; $$.index2 = $4.index1; - $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str); + $$.str = cat_str(4, make_str("["), txt, make_str("]"), $4.str); } | '(' Iresult ')' opt_type_array_bounds { @@ -4967,7 +4912,7 @@ opt_type_array_bounds: '[' ']' opt_type_array_bounds sprintf (txt, "%d", $2); $$.index1 = $2; $$.index2 = $4.index1; - $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str); + $$.str = cat_str(4, make_str("["), txt, make_str("]"), $4.str); } | /* EMPTY */ { @@ -4977,89 +4922,89 @@ opt_type_array_bounds: '[' ']' opt_type_array_bounds } ; -opt_reference: SQL_REFERENCE { $$ = make1_str("reference"); } +opt_reference: SQL_REFERENCE { $$ = make_str("reference"); } | /* empty */ { $$ = EMPTY; } ctype: CHAR { - $$.type_str = make1_str("char"); + $$.type_str = make_str("char"); $$.type_enum = ECPGt_char; $$.type_index = -1; $$.type_dimension = -1; } | VARCHAR { - $$.type_str = make1_str("varchar"); + $$.type_str = make_str("varchar"); $$.type_enum = ECPGt_varchar; $$.type_index = -1; $$.type_dimension = -1; } | FLOAT { - $$.type_str = make1_str("float"); + $$.type_str = make_str("float"); $$.type_enum = ECPGt_float; $$.type_index = -1; $$.type_dimension = -1; } | DOUBLE { - $$.type_str = make1_str("double"); + $$.type_str = make_str("double"); $$.type_enum = ECPGt_double; $$.type_index = -1; $$.type_dimension = -1; } | opt_signed SQL_INT { - $$.type_str = make1_str("int"); + $$.type_str = make_str("int"); $$.type_enum = ECPGt_int; $$.type_index = -1; $$.type_dimension = -1; } | SQL_ENUM { - $$.type_str = make1_str("int"); + $$.type_str = make_str("int"); $$.type_enum = ECPGt_int; $$.type_index = -1; $$.type_dimension = -1; } | opt_signed SQL_SHORT { - $$.type_str = make1_str("short"); + $$.type_str = make_str("short"); $$.type_enum = ECPGt_short; $$.type_index = -1; $$.type_dimension = -1; } | opt_signed SQL_LONG { - $$.type_str = make1_str("long"); + $$.type_str = make_str("long"); $$.type_enum = ECPGt_long; $$.type_index = -1; $$.type_dimension = -1; } | SQL_BOOL { - $$.type_str = make1_str("bool"); + $$.type_str = make_str("bool"); $$.type_enum = ECPGt_bool; $$.type_index = -1; $$.type_dimension = -1; } | SQL_UNSIGNED SQL_INT { - $$.type_str = make1_str("unsigned int"); + $$.type_str = make_str("unsigned int"); $$.type_enum = ECPGt_unsigned_int; $$.type_index = -1; $$.type_dimension = -1; } | SQL_UNSIGNED SQL_SHORT { - $$.type_str = make1_str("unsigned short"); + $$.type_str = make_str("unsigned short"); $$.type_enum = ECPGt_unsigned_short; $$.type_index = -1; $$.type_dimension = -1; } | SQL_UNSIGNED SQL_LONG { - $$.type_str = make1_str("unsigned long"); + $$.type_str = make_str("unsigned long"); $$.type_enum = ECPGt_unsigned_long; $$.type_index = -1; $$.type_dimension = -1; @@ -5072,7 +5017,7 @@ ctype: CHAR } '{' sql_variable_declarations '}' { ECPGfree_struct_member(struct_member_list[struct_level--]); - $$.type_str = cat3_str(make1_str("struct {"), $4, make1_str("}")); + $$.type_str = cat_str(3, make_str("struct {"), $4, make_str("}")); $$.type_enum = ECPGt_struct; $$.type_index = -1; $$.type_dimension = -1; @@ -5085,7 +5030,7 @@ ctype: CHAR } '{' sql_variable_declarations '}' { ECPGfree_struct_member(struct_member_list[struct_level--]); - $$.type_str = cat3_str(make1_str("union {"), $4, make1_str("}")); + $$.type_str = cat_str(3, make_str("union {"), $4, make_str("}")); $$.type_enum = ECPGt_union; $$.type_index = -1; $$.type_dimension = -1; @@ -5121,7 +5066,7 @@ sql_declaration: ctype } sql_variable_list ';' { - $$ = cat3_str($1.type_str, $3, make1_str(";")); + $$ = cat_str(3, $1.type_str, $3, make_str(";")); } sql_variable_list: sql_variable @@ -5130,7 +5075,7 @@ sql_variable_list: sql_variable } | sql_variable_list ',' sql_variable { - $$ = make3_str($1, make1_str(","), $3); + $$ = cat_str(3, $1, make_str(","), $3); } sql_variable: opt_pointer symbol opt_array_bounds @@ -5198,7 +5143,7 @@ sql_variable: opt_pointer symbol opt_array_bounds else ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1])); - $$ = cat3_str($1, $2, $3.str); + $$ = cat_str(3, $1, $2, $3.str); } /* @@ -5252,7 +5197,7 @@ ECPGVar: SQL_VAR symbol IS ctype opt_type_array_bounds opt_reference ECPGfree_type(p->type); p->type = type; - $$ = cat5_str(cat3_str(make1_str("/* exec sql var"), mm_strdup($2), make1_str("is")), mm_strdup($4.type_str), mm_strdup($5.str), $6, make1_str("*/")); + $$ = cat_str(7, make_str("/* exec sql var"), mm_strdup($2), make_str("is"), mm_strdup($4.type_str), mm_strdup($5.str), $6, make_str("*/")); } /* @@ -5262,58 +5207,58 @@ ECPGVar: SQL_VAR symbol IS ctype opt_type_array_bounds opt_reference ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action { when_error.code = $3.code; when_error.command = $3.command; - $$ = cat3_str(make1_str("/* exec sql whenever sqlerror "), $3.str, make1_str("; */\n")); + $$ = cat_str(3, make_str("/* exec sql whenever sqlerror "), $3.str, make_str("; */\n")); } | SQL_WHENEVER NOT SQL_FOUND action { when_nf.code = $4.code; when_nf.command = $4.command; - $$ = cat3_str(make1_str("/* exec sql whenever not found "), $4.str, make1_str("; */\n")); + $$ = cat_str(3, make_str("/* exec sql whenever not found "), $4.str, make_str("; */\n")); } | SQL_WHENEVER SQL_SQLWARNING action { when_warn.code = $3.code; when_warn.command = $3.command; - $$ = cat3_str(make1_str("/* exec sql whenever sql_warning "), $3.str, make1_str("; */\n")); + $$ = cat_str(3, make_str("/* exec sql whenever sql_warning "), $3.str, make_str("; */\n")); } action : SQL_CONTINUE { $$.code = W_NOTHING; $$.command = NULL; - $$.str = make1_str("continue"); + $$.str = make_str("continue"); } | SQL_SQLPRINT { $$.code = W_SQLPRINT; $$.command = NULL; - $$.str = make1_str("sqlprint"); + $$.str = make_str("sqlprint"); } | SQL_STOP { $$.code = W_STOP; $$.command = NULL; - $$.str = make1_str("stop"); + $$.str = make_str("stop"); } | SQL_GOTO name { $$.code = W_GOTO; $$.command = strdup($2); - $$.str = cat2_str(make1_str("goto "), $2); + $$.str = cat2_str(make_str("goto "), $2); } | SQL_GO TO name { $$.code = W_GOTO; $$.command = strdup($3); - $$.str = cat2_str(make1_str("goto "), $3); + $$.str = cat2_str(make_str("goto "), $3); } | DO name '(' c_args ')' { $$.code = W_DO; - $$.command = make4_str($2, make1_str("("), $4, make1_str(")")); - $$.str = cat2_str(make1_str("do"), mm_strdup($$.command)); + $$.command = cat_str(4, $2, make_str("("), $4, make_str(")")); + $$.str = cat2_str(make_str("do"), mm_strdup($$.command)); } | DO SQL_BREAK { $$.code = W_BREAK; $$.command = NULL; - $$.str = make1_str("break"); + $$.str = make_str("break"); } | SQL_CALL name '(' c_args ')' { $$.code = W_DO; - $$.command = make4_str($2, make1_str("("), $4, make1_str(")")); - $$.str = cat2_str(make1_str("call"), mm_strdup($$.command)); + $$.command = cat_str(4, $2, make_str("("), $4, make_str(")")); + $$.str = cat2_str(make_str("call"), mm_strdup($$.command)); } /* some other stuff for ecpg */ @@ -5322,98 +5267,98 @@ action : SQL_CONTINUE { ecpg_expr: com_expr { $$ = $1; } | a_expr TYPECAST Typename - { $$ = cat3_str($1, make1_str("::"), $3); } + { $$ = cat_str(3, $1, make_str("::"), $3); } | '-' ecpg_expr %prec UMINUS - { $$ = cat2_str(make1_str("-"), $2); } + { $$ = cat2_str(make_str("-"), $2); } | '%' ecpg_expr - { $$ = cat2_str(make1_str("%"), $2); } + { $$ = cat2_str(make_str("%"), $2); } | '^' ecpg_expr - { $$ = cat2_str(make1_str("^"), $2); } + { $$ = cat2_str(make_str("^"), $2); } | '|' ecpg_expr - { $$ = cat2_str(make1_str("|"), $2); } + { $$ = cat2_str(make_str("|"), $2); } | ';' a_expr - { $$ = cat2_str(make1_str(";"), $2); } + { $$ = cat2_str(make_str(";"), $2); } | a_expr '%' - { $$ = cat2_str($1, make1_str("%")); } + { $$ = cat2_str($1, make_str("%")); } | a_expr '^' - { $$ = cat2_str($1, make1_str("^")); } + { $$ = cat2_str($1, make_str("^")); } | a_expr '|' - { $$ = cat2_str($1, make1_str("|")); } + { $$ = cat2_str($1, make_str("|")); } | a_expr '+' ecpg_expr - { $$ = cat3_str($1, make1_str("+"), $3); } + { $$ = cat_str(3, $1, make_str("+"), $3); } | a_expr '-' ecpg_expr - { $$ = cat3_str($1, make1_str("-"), $3); } + { $$ = cat_str(3, $1, make_str("-"), $3); } | a_expr '*' ecpg_expr - { $$ = cat3_str($1, make1_str("*"), $3); } + { $$ = cat_str(3, $1, make_str("*"), $3); } | a_expr '/' ecpg_expr - { $$ = cat3_str($1, make1_str("/"), $3); } + { $$ = cat_str(3, $1, make_str("/"), $3); } | a_expr '%' ecpg_expr - { $$ = cat3_str($1, make1_str("%"), $3); } + { $$ = cat_str(3, $1, make_str("%"), $3); } | a_expr '^' ecpg_expr - { $$ = cat3_str($1, make1_str("^"), $3); } + { $$ = cat_str(3, $1, make_str("^"), $3); } | a_expr '|' ecpg_expr - { $$ = cat3_str($1, make1_str("|"), $3); } + { $$ = cat_str(3, $1, make_str("|"), $3); } | a_expr '<' ecpg_expr - { $$ = cat3_str($1, make1_str("<"), $3); } + { $$ = cat_str(3, $1, make_str("<"), $3); } | a_expr '>' ecpg_expr - { $$ = cat3_str($1, make1_str(">"), $3); } + { $$ = cat_str(3, $1, make_str(">"), $3); } | a_expr '=' NULL_P - { $$ = cat2_str($1, make1_str("= NULL")); } + { $$ = cat2_str($1, make_str("= NULL")); } | NULL_P '=' ecpg_expr - { $$ = cat2_str(make1_str("= NULL"), $3); } + { $$ = cat2_str(make_str("= NULL"), $3); } | a_expr '=' ecpg_expr - { $$ = cat3_str($1, make1_str("="), $3); } + { $$ = cat_str(3, $1, make_str("="), $3); } | a_expr Op ecpg_expr - { $$ = cat3_str($1, make1_str("="), $3); } + { $$ = cat_str(3, $1, make_str("="), $3); } | Op ecpg_expr { $$ = cat2_str($1, $2); } | a_expr Op { $$ = cat2_str($1, $2); } | a_expr AND ecpg_expr - { $$ = cat3_str($1, make1_str("and"), $3); } + { $$ = cat_str(3, $1, make_str("and"), $3); } | a_expr OR ecpg_expr - { $$ = cat3_str($1, make1_str("or"), $3); } + { $$ = cat_str(3, $1, make_str("or"), $3); } | NOT ecpg_expr - { $$ = cat2_str(make1_str("not"), $2); } + { $$ = cat2_str(make_str("not"), $2); } | a_expr LIKE ecpg_expr - { $$ = cat3_str($1, make1_str("like"), $3); } + { $$ = cat_str(3, $1, make_str("like"), $3); } | a_expr NOT LIKE ecpg_expr - { $$ = cat3_str($1, make1_str("not like"), $4); } + { $$ = cat_str(3, $1, make_str("not like"), $4); } | a_expr ISNULL - { $$ = cat2_str($1, make1_str("isnull")); } + { $$ = cat2_str($1, make_str("isnull")); } | a_expr IS NULL_P - { $$ = cat2_str($1, make1_str("is null")); } + { $$ = cat2_str($1, make_str("is null")); } | a_expr NOTNULL - { $$ = cat2_str($1, make1_str("notnull")); } + { $$ = cat2_str($1, make_str("notnull")); } | a_expr IS NOT NULL_P - { $$ = cat2_str($1, make1_str("is not null")); } + { $$ = cat2_str($1, make_str("is not null")); } | a_expr IS TRUE_P - { $$ = cat2_str($1, make1_str("is true")); } + { $$ = cat2_str($1, make_str("is true")); } | a_expr IS NOT FALSE_P - { $$ = cat2_str($1, make1_str("is not false")); } + { $$ = cat2_str($1, make_str("is not false")); } | a_expr IS FALSE_P - { $$ = cat2_str($1, make1_str("is false")); } + { $$ = cat2_str($1, make_str("is false")); } | a_expr IS NOT TRUE_P - { $$ = cat2_str($1, make1_str("is not true")); } + { $$ = cat2_str($1, make_str("is not true")); } | a_expr BETWEEN b_expr AND b_expr { - $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5); + $$ = cat_str(5, $1, make_str("between"), $3, make_str("and"), $5); } | a_expr NOT BETWEEN b_expr AND b_expr { - $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6); + $$ = cat_str(5, $1, make_str("not between"), $4, make_str("and"), $6); } | a_expr IN '(' in_expr ')' { - $$ = make4_str($1, make1_str(" in ("), $4, make1_str(")")); + $$ = cat_str(4, $1, make_str(" in ("), $4, make_str(")")); } | a_expr NOT IN '(' in_expr ')' { - $$ = make4_str($1, make1_str(" not in ("), $5, make1_str(")")); + $$ = cat_str(4, $1, make_str(" not in ("), $5, make_str(")")); } | a_expr all_Op sub_type '(' SubSelect ')' { - $$ = cat4_str($1, $2, $3, make3_str(make1_str("("), $5, make1_str(")"))); + $$ = cat_str(4, $1, $2, $3, cat_str(3, make_str("("), $5, make_str(")"))); } | row_expr { $$ = $1; } @@ -5439,7 +5384,7 @@ cinputvariable : cvariable indicator { civariableonly : cvariable { add_variable(&argsinsert, find_variable($1), &no_indicator); - $$ = make1_str("?"); + $$ = make_str("?"); } cvariable: CVARIABLE { $$ = $1; } @@ -5450,7 +5395,7 @@ indicator: /* empty */ { $$ = NULL; } | SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; } ident: IDENT { $$ = $1; } - | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }; + | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }; /* * C stuff @@ -5467,63 +5412,63 @@ c_stuff: c_anything { $$ = $1; } } | c_stuff '(' c_stuff ')' { - $$ = cat4_str($1, make1_str("("), $3, make1_str(")")); + $$ = cat_str(4, $1, make_str("("), $3, make_str(")")); } c_list: c_term { $$ = $1; } - | c_term ',' c_list { $$ = make3_str($1, make1_str(","), $3); } + | c_term ',' c_list { $$ = cat_str(3, $1, make_str(","), $3); } c_term: c_stuff { $$ = $1; } - | '{' c_list '}' { $$ = make3_str(make1_str("{"), $2, make1_str("}")); } + | '{' c_list '}' { $$ = cat_str(3, make_str("{"), $2, make_str("}")); } c_thing: c_anything { $$ = $1; } - | '(' { $$ = make1_str("("); } - | ')' { $$ = make1_str(")"); } - | ',' { $$ = make1_str(","); } - | ';' { $$ = make1_str(";"); } + | '(' { $$ = make_str("("); } + | ')' { $$ = make_str(")"); } + | ',' { $$ = make_str(","); } + | ';' { $$ = make_str(";"); } c_anything: IDENT { $$ = $1; } - | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); } + | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); } | Iconst { $$ = $1; } | Fconst { $$ = $1; } - | '*' { $$ = make1_str("*"); } - | '+' { $$ = make1_str("+"); } - | '-' { $$ = make1_str("-"); } - | '/' { $$ = make1_str("/"); } - | '%' { $$ = make1_str("%"); } - | S_AUTO { $$ = make1_str("auto"); } - | S_BOOL { $$ = make1_str("bool"); } - | S_CHAR { $$ = make1_str("char"); } - | S_CONST { $$ = make1_str("const"); } - | S_DOUBLE { $$ = make1_str("double"); } - | S_ENUM { $$ = make1_str("enum"); } - | S_EXTERN { $$ = make1_str("extern"); } - | S_FLOAT { $$ = make1_str("float"); } - | S_INT { $$ = make1_str("int"); } - | S_LONG { $$ = make1_str("long"); } - | S_REGISTER { $$ = make1_str("register"); } - | S_SHORT { $$ = make1_str("short"); } - | S_SIGNED { $$ = make1_str("signed"); } - | S_STATIC { $$ = make1_str("static"); } - | S_STRUCT { $$ = make1_str("struct"); } - | S_UNION { $$ = make1_str("union"); } - | S_UNSIGNED { $$ = make1_str("unsigned"); } - | S_VARCHAR { $$ = make1_str("varchar"); } + | '*' { $$ = make_str("*"); } + | '+' { $$ = make_str("+"); } + | '-' { $$ = make_str("-"); } + | '/' { $$ = make_str("/"); } + | '%' { $$ = make_str("%"); } + | S_AUTO { $$ = make_str("auto"); } + | S_BOOL { $$ = make_str("bool"); } + | S_CHAR { $$ = make_str("char"); } + | S_CONST { $$ = make_str("const"); } + | S_DOUBLE { $$ = make_str("double"); } + | S_ENUM { $$ = make_str("enum"); } + | S_EXTERN { $$ = make_str("extern"); } + | S_FLOAT { $$ = make_str("float"); } + | S_INT { $$ = make_str("int"); } + | S_LONG { $$ = make_str("long"); } + | S_REGISTER { $$ = make_str("register"); } + | S_SHORT { $$ = make_str("short"); } + | S_SIGNED { $$ = make_str("signed"); } + | S_STATIC { $$ = make_str("static"); } + | S_STRUCT { $$ = make_str("struct"); } + | S_UNION { $$ = make_str("union"); } + | S_UNSIGNED { $$ = make_str("unsigned"); } + | S_VARCHAR { $$ = make_str("varchar"); } | S_ANYTHING { $$ = make_name(); } - | '[' { $$ = make1_str("["); } - | ']' { $$ = make1_str("]"); } -/* | '(' { $$ = make1_str("("); } - | ')' { $$ = make1_str(")"); }*/ - | '=' { $$ = make1_str("="); } + | '[' { $$ = make_str("["); } + | ']' { $$ = make_str("]"); } +/* | '(' { $$ = make_str("("); } + | ')' { $$ = make_str(")"); }*/ + | '=' { $$ = make_str("="); } blockstart : '{' { braces_open++; - $$ = make1_str("{"); + $$ = make_str("{"); } blockend : '}' { remove_variables(braces_open--); - $$ = make1_str("}"); + $$ = make_str("}"); } %% diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile index e842c89679a..e183ebc4b9f 100644 --- a/src/interfaces/ecpg/test/Makefile +++ b/src/interfaces/ecpg/test/Makefile @@ -1,6 +1,10 @@ all: test1 test2 test3 test4 perftest -LDFLAGS=-g -I /usr/local/pgsql/include -L/usr/local/pgsql/lib -lecpg -lpq -lcrypt +#LDFLAGS=-g -I /usr/local/pgsql/include -L/usr/local/pgsql/lib -lecpg -lpq -lcrypt +LDFLAGS=-g -I../include -I/usr/include/postgresql -L/usr/lib/postgresql -L../lib -lecpg -lpq -lcrypt + +#ECPG=/usr/local/pgsql/bin/ecpg +ECPG=../preproc/ecpg -I../include .SUFFIXES: .pgc .c @@ -11,7 +15,7 @@ test4: test4.c perftest: perftest.c .pgc.c: - /usr/local/pgsql/bin/ecpg $? + $(ECPG) $? clean: -/bin/rm test1 test2 test3 test4 perftest *.c log diff --git a/src/interfaces/ecpg/test/test2.pgc b/src/interfaces/ecpg/test/test2.pgc index 3dc3603d542..87f5f9c5efc 100644 --- a/src/interfaces/ecpg/test/test2.pgc +++ b/src/interfaces/ecpg/test/test2.pgc @@ -49,8 +49,8 @@ exec sql end declare section; exec sql insert into meskes(name, married, children) values ('Petra', '19900404', 3); exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 33, '19900404', 3); exec sql insert into meskes(name, born, age) values ('Carsten', 19910103, 8); - exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 5); - exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 1); + exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 6); + exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 2); strcpy(msg, "commit"); exec sql commit;