dirty fix for flex problem

master
Boris Glavic 2019-12-01 17:34:00 -06:00
parent ff5d7728e6
commit d713192ca8
6 changed files with 69 additions and 60 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
*.o
*.so
*.a
*.so.*

View File

@ -53,6 +53,8 @@ endif
$(srcdir)/pgc.c: pgc.l $(srcdir)/pgc.c: pgc.l
ifdef FLEX ifdef FLEX
$(FLEX) $(FLEXFLAGS) -o'$@' $< $(FLEX) $(FLEXFLAGS) -o'$@' $<
sed -i 's/int yylineno/yy_size_t yylineno/g' pgc.c
sed -i 's/int yyleng/yy_size_t yyleng/g' pgc.c
else else
@$(missing) flex $< $@ @$(missing) flex $< $@
endif endif

View File

@ -36,9 +36,12 @@ extern char *yytext,
*token_start; *token_start;
#ifdef YYDEBUG #ifdef YYDEBUG
extern int yydebug; extern int yydebug;
#endif #endif
extern int yylineno, #ifndef yy_size_t
typedef size_t yy_size_t;
#endif
extern yy_size_t yylineno,
yyleng; yyleng;
extern FILE *yyin, extern FILE *yyin,
*yyout; *yyout;

View File

@ -97,7 +97,7 @@ hashline_number(void)
{ {
char *line = mm_alloc(strlen("\n#line %d \"%s\"\n") + sizeof(int) * CHAR_BIT * 10 / 3 + strlen(input_filename)); char *line = mm_alloc(strlen("\n#line %d \"%s\"\n") + sizeof(int) * CHAR_BIT * 10 / 3 + strlen(input_filename));
sprintf(line, "\n#line %d \"%s\"\n", yylineno, input_filename); sprintf(line, "\n#line %lu \"%s\"\n", yylineno, input_filename);
return line; return line;
} }
@ -195,8 +195,8 @@ output_escaped_str(char *str, bool quoted)
else if (str[i] == '\\') else if (str[i] == '\\')
{ {
int j = i; int j = i;
/* check whether this is a continuation line /* check whether this is a continuation line
* if it is, do not output anything because newlines are escaped anyway */ * if it is, do not output anything because newlines are escaped anyway */
/* accept blanks after the '\' as some other compilers do too */ /* accept blanks after the '\' as some other compilers do too */

View File

@ -52,8 +52,8 @@ static bool isinformixdefine(void);
char *token_start; char *token_start;
int state_before; int state_before;
struct _yy_buffer struct _yy_buffer
{ {
YY_BUFFER_STATE buffer; YY_BUFFER_STATE buffer;
long lineno; long lineno;
char *filename; char *filename;
@ -65,7 +65,7 @@ static char *old;
#define MAX_NESTED_IF 128 #define MAX_NESTED_IF 128
static short preproc_tos; static short preproc_tos;
static short ifcond; static short ifcond;
static struct _if_value static struct _if_value
{ {
short condition; short condition;
short else_branch; short else_branch;
@ -80,7 +80,7 @@ static struct _if_value
%option yylineno %option yylineno
%x C SQL incl def def_ident undef %x C SQL incl def def_ident undef
/* /*
* OK, here is a short description of lex/flex rules behavior. * OK, here is a short description of lex/flex rules behavior.
@ -473,7 +473,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
/* throw back all but the initial "$" */ /* throw back all but the initial "$" */
yyless(1); yyless(1);
/* and treat it as {other} */ /* and treat it as {other} */
return yytext[0]; return yytext[0];
} }
<SQL>{dolqdelim} { <SQL>{dolqdelim} {
token_start = yytext; token_start = yytext;
@ -675,7 +675,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
} }
<SQL>{identifier} { <SQL>{identifier} {
const ScanKeyword *keyword; const ScanKeyword *keyword;
if (!isdefine()) if (!isdefine())
{ {
/* Is it an SQL/ECPG keyword? */ /* Is it an SQL/ECPG keyword? */
@ -702,7 +702,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
} }
<SQL>{other} { return yytext[0]; } <SQL>{other} { return yytext[0]; }
<C>{exec_sql} { BEGIN(SQL); return SQL_START; } <C>{exec_sql} { BEGIN(SQL); return SQL_START; }
<C>{informix_special} { <C>{informix_special} {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (INFORMIX_MODE) if (INFORMIX_MODE)
{ {
@ -743,7 +743,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
} }
<C>{identifier} { <C>{identifier} {
const ScanKeyword *keyword; const ScanKeyword *keyword;
/* Informix uses SQL defines only in SQL space */ /* Informix uses SQL defines only in SQL space */
/* however, some defines have to be taken care of for compatibility */ /* however, some defines have to be taken care of for compatibility */
if ((!INFORMIX_MODE || !isinformixdefine()) && !isdefine()) if ((!INFORMIX_MODE || !isinformixdefine()) && !isdefine())
@ -854,7 +854,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
yyterminate(); yyterminate();
} }
<C>{exec_sql}{include}{space}* { BEGIN(incl); } <C>{exec_sql}{include}{space}* { BEGIN(incl); }
<C>{informix_special}{include}{space}* { <C>{informix_special}{include}{space}* {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (INFORMIX_MODE) if (INFORMIX_MODE)
{ {
@ -867,7 +867,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
} }
} }
<C,xskip>{exec_sql}{ifdef}{space}* { ifcond = TRUE; BEGIN(xcond); } <C,xskip>{exec_sql}{ifdef}{space}* { ifcond = TRUE; BEGIN(xcond); }
<C,xskip>{informix_special}{ifdef}{space}* { <C,xskip>{informix_special}{ifdef}{space}* {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (INFORMIX_MODE) if (INFORMIX_MODE)
{ {
@ -881,7 +881,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
} }
} }
<C,xskip>{exec_sql}{ifndef}{space}* { ifcond = FALSE; BEGIN(xcond); } <C,xskip>{exec_sql}{ifndef}{space}* { ifcond = FALSE; BEGIN(xcond); }
<C,xskip>{informix_special}{ifndef}{space}* { <C,xskip>{informix_special}{ifndef}{space}* {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (INFORMIX_MODE) if (INFORMIX_MODE)
{ {
@ -905,7 +905,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
ifcond = TRUE; BEGIN(xcond); ifcond = TRUE; BEGIN(xcond);
} }
<C,xskip>{informix_special}{elif}{space}* { <C,xskip>{informix_special}{elif}{space}* {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (INFORMIX_MODE) if (INFORMIX_MODE)
{ {
@ -1004,7 +1004,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
<xcond>{identifier}{space}*";" { <xcond>{identifier}{space}*";" {
if (preproc_tos >= MAX_NESTED_IF-1) if (preproc_tos >= MAX_NESTED_IF-1)
mmerror(PARSE_ERROR, ET_FATAL, "Too many nested 'EXEC SQL IFDEF' conditions"); mmerror(PARSE_ERROR, ET_FATAL, "Too many nested 'EXEC SQL IFDEF' conditions");
else else
{ {
struct _defines *defptr; struct _defines *defptr;
unsigned int i; unsigned int i;
@ -1047,7 +1047,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
<def_ident>{other}|\n { <def_ident>{other}|\n {
mmerror(PARSE_ERROR, ET_FATAL, "Missing identifier in 'EXEC SQL DEFINE' command"); mmerror(PARSE_ERROR, ET_FATAL, "Missing identifier in 'EXEC SQL DEFINE' command");
yyterminate(); yyterminate();
} }
<def>{space}*";" { <def>{space}*";" {
struct _defines *ptr, *this; struct _defines *ptr, *this;
@ -1085,7 +1085,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
<<EOF>> { <<EOF>> {
if (yy_buffer == NULL) if (yy_buffer == NULL)
{ {
if ( preproc_tos > 0 ) if ( preproc_tos > 0 )
{ {
preproc_tos = 0; preproc_tos = 0;
mmerror(PARSE_ERROR, ET_FATAL, "Missing 'EXEC SQL ENDIF;'"); mmerror(PARSE_ERROR, ET_FATAL, "Missing 'EXEC SQL ENDIF;'");
@ -1104,7 +1104,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
ptr->used = NULL; ptr->used = NULL;
break; break;
} }
if (yyin != NULL) if (yyin != NULL)
fclose(yyin); fclose(yyin);
@ -1124,7 +1124,7 @@ cppline {space}*#(.*\\{space})*.*{newline}
if (i != 0) if (i != 0)
output_line_number(); output_line_number();
} }
} }
<INITIAL>{other}|\n { mmerror(PARSE_ERROR, ET_FATAL, "Internal error: unreachable state, please inform pgsql-bugs@postgresql.org"); } <INITIAL>{other}|\n { mmerror(PARSE_ERROR, ET_FATAL, "Internal error: unreachable state, please inform pgsql-bugs@postgresql.org"); }
@ -1157,7 +1157,7 @@ addlit(char *ytext, int yleng)
/* enlarge buffer if needed */ /* enlarge buffer if needed */
if ((literallen+yleng) >= literalalloc) if ((literallen+yleng) >= literalalloc)
{ {
do do
literalalloc *= 2; literalalloc *= 2;
while ((literallen+yleng) >= literalalloc); while ((literallen+yleng) >= literalalloc);
literalbuf = (char *) realloc(literalbuf, literalalloc); literalbuf = (char *) realloc(literalbuf, literalalloc);
@ -1203,7 +1203,7 @@ parse_include(void)
/* /*
* skip the ";" if there is one and trailing whitespace. Note that * skip the ";" if there is one and trailing whitespace. Note that
* yytext contains at least one non-space character plus the ";" * yytext contains at least one non-space character plus the ";"
*/ */
for (i = strlen(yytext)-2; for (i = strlen(yytext)-2;
i > 0 && ecpg_isspace(yytext[i]); i > 0 && ecpg_isspace(yytext[i]);
@ -1214,7 +1214,7 @@ parse_include(void)
i--; i--;
yytext[i+1] = '\0'; yytext[i+1] = '\0';
yyin = NULL; yyin = NULL;
/* If file name is enclosed in '"' remove these and look only in '.' */ /* If file name is enclosed in '"' remove these and look only in '.' */
@ -1224,7 +1224,7 @@ parse_include(void)
{ {
yytext[i] = '\0'; yytext[i] = '\0';
memmove(yytext, yytext+1, strlen(yytext)); memmove(yytext, yytext+1, strlen(yytext));
strncpy(inc_file, yytext, sizeof(inc_file)); strncpy(inc_file, yytext, sizeof(inc_file));
yyin = fopen(inc_file, "r"); yyin = fopen(inc_file, "r");
if (!yyin) if (!yyin)
@ -1235,7 +1235,7 @@ parse_include(void)
yyin = fopen(inc_file, "r"); yyin = fopen(inc_file, "r");
} }
} }
} }
else else
{ {
@ -1244,12 +1244,12 @@ parse_include(void)
yytext[i] = '\0'; yytext[i] = '\0';
memmove(yytext, yytext+1, strlen(yytext)); memmove(yytext, yytext+1, strlen(yytext));
} }
for (ip = include_paths; yyin == NULL && ip != NULL; ip = ip->next) for (ip = include_paths; yyin == NULL && ip != NULL; ip = ip->next)
{ {
if (strlen(ip->path) + strlen(yytext) + 3 > MAXPGPATH) if (strlen(ip->path) + strlen(yytext) + 3 > MAXPGPATH)
{ {
fprintf(stderr, "Error: Path %s/%s is too long in line %d, skipping.\n", ip->path, yytext, yylineno); fprintf(stderr, "Error: Path %s/%s is too long in line %lu, skipping.\n", ip->path, yytext, yylineno);
continue; continue;
} }
snprintf (inc_file, sizeof(inc_file), "%s/%s", ip->path, yytext); snprintf (inc_file, sizeof(inc_file), "%s/%s", ip->path, yytext);
@ -1265,7 +1265,7 @@ parse_include(void)
} }
} }
if (!yyin) if (!yyin)
mmerror(NO_INCLUDE_FILE, ET_FATAL, "Cannot open include file %s in line %d\n", yytext, yylineno); mmerror(NO_INCLUDE_FILE, ET_FATAL, "Cannot open include file %s in line %lu\n", yytext, yylineno);
input_filename = mm_strdup(inc_file); input_filename = mm_strdup(inc_file);
yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE )); yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE ));

View File

@ -60,7 +60,7 @@ mmerror(int error_code, enum errortype type, char * error, ...)
{ {
va_list ap; va_list ap;
fprintf(stderr, "%s:%d: ", input_filename, yylineno); fprintf(stderr, "%s:%lu: ", input_filename, yylineno);
switch(type) switch(type)
{ {
@ -423,7 +423,7 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
CACHE CALLED CASCADE CASCADED CASE CAST CHAIN CHAR_P CACHE CALLED CASCADE CASCADED CASE CAST CHAIN CHAR_P
CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS
CONTENT_P CONVERSION_P COPY COST CREATE CREATEDB CONTENT_P CONVERSION_P COPY COST CREATE CREATEDB
CREATEROLE CREATEUSER CROSS CSV CURRENT_P CURRENT_DATE CURRENT_ROLE CREATEROLE CREATEUSER CROSS CSV CURRENT_P CURRENT_DATE CURRENT_ROLE
CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
@ -480,7 +480,7 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING SUPERUSER_P STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING SUPERUSER_P
SYMMETRIC SYSID SYSTEM_P SYMMETRIC SYSID SYSTEM_P
TABLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN TIME TIMESTAMP TO TABLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN TIME TIMESTAMP TO
TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P TRUNCATE TRUSTED TYPE_P TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P TRUNCATE TRUSTED TYPE_P
UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL
@ -586,7 +586,7 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
%type <str> RemoveOperStmt RenameStmt all_Op opt_trusted opt_lancompiler %type <str> RemoveOperStmt RenameStmt all_Op opt_trusted opt_lancompiler
%type <str> VariableSetStmt var_value zone_value VariableShowStmt %type <str> VariableSetStmt var_value zone_value VariableShowStmt
%type <str> VariableResetStmt AlterTableStmt from_list overlay_list %type <str> VariableResetStmt AlterTableStmt from_list overlay_list
%type <str> relation_name OptTableSpace LockStmt opt_lock %type <str> relation_name OptTableSpace LockStmt opt_lock
%type <str> CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList %type <str> CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList
%type <str> OptSeqElem TriggerForSpec TriggerForOpt TriggerForType %type <str> OptSeqElem TriggerForSpec TriggerForOpt TriggerForType
%type <str> DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt %type <str> DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt
@ -616,7 +616,7 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
%type <str> OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior %type <str> OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior
%type <str> handler_name any_name_list any_name opt_as insert_column_list %type <str> handler_name any_name_list any_name opt_as insert_column_list
%type <str> columnref values_clause AllConstVar prep_type_clause ExecuteStmt %type <str> columnref values_clause AllConstVar prep_type_clause ExecuteStmt
%type <str> insert_column_item DropRuleStmt ctext_expr execute_param_clause %type <str> insert_column_item DropRuleStmt ctext_expr execute_param_clause
%type <str> createfunc_opt_item set_rest alter_rel_cmd %type <str> createfunc_opt_item set_rest alter_rel_cmd
%type <str> CreateFunctionStmt createfunc_opt_list func_table %type <str> CreateFunctionStmt createfunc_opt_list func_table
%type <str> DropUserStmt copy_from copy_opt_list copy_opt_item %type <str> DropUserStmt copy_from copy_opt_list copy_opt_item
@ -647,7 +647,7 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
%type <str> ECPGGetDescriptorHeader ECPGColLabel SetResetClause AlterUserSetStmt %type <str> ECPGGetDescriptorHeader ECPGColLabel SetResetClause AlterUserSetStmt
%type <str> reserved_keyword unreserved_keyword ecpg_interval opt_ecpg_using %type <str> reserved_keyword unreserved_keyword ecpg_interval opt_ecpg_using
%type <str> col_name_keyword precision opt_scale ECPGExecuteImmediateStmt %type <str> col_name_keyword precision opt_scale ECPGExecuteImmediateStmt
%type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst %type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst
%type <str> using_descriptor into_descriptor opt_nulls_order opt_asc_desc %type <str> using_descriptor into_descriptor opt_nulls_order opt_asc_desc
%type <str> prepared_name struct_union_type_with_symbol OptConsTableSpace %type <str> prepared_name struct_union_type_with_symbol OptConsTableSpace
%type <str> ECPGunreserved ECPGunreserved_interval cvariable opt_bit_field %type <str> ECPGunreserved ECPGunreserved_interval cvariable opt_bit_field
@ -665,7 +665,7 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
%type <str> opclass_drop_list opclass_drop DropOpFamilyStmt opt_opfamily %type <str> opclass_drop_list opclass_drop DropOpFamilyStmt opt_opfamily
%type <str> CreateOpFamilyStmt AlterOpFamilyStmt create_as_target %type <str> CreateOpFamilyStmt AlterOpFamilyStmt create_as_target
%type <str> xml_attributes xml_attribute_list document_or_content xml_whitespace_option %type <str> xml_attributes xml_attribute_list document_or_content xml_whitespace_option
%type <str> opt_xml_root_standalone xml_root_version xml_attribute_el %type <str> opt_xml_root_standalone xml_root_version xml_attribute_el
%type <str> where_or_current_clause AlterTSConfigurationStmt AlterTSDictionaryStmt %type <str> where_or_current_clause AlterTSConfigurationStmt AlterTSDictionaryStmt
%type <struct_union> s_struct_union_symbol %type <struct_union> s_struct_union_symbol
@ -787,7 +787,7 @@ stmt: AlterDatabaseStmt { output_statement($1, 0, ECPGst_normal); }
{ {
if (connection) if (connection)
mmerror(PARSE_ERROR, ET_ERROR, "no at option for deallocate statement.\n"); mmerror(PARSE_ERROR, ET_ERROR, "no at option for deallocate statement.\n");
output_deallocate_prepare_statement($1); output_deallocate_prepare_statement($1);
} }
| DeclareCursorStmt { output_simple_statement($1); } | DeclareCursorStmt { output_simple_statement($1); }
@ -819,15 +819,15 @@ stmt: AlterDatabaseStmt { output_statement($1, 0, ECPGst_normal); }
| LoadStmt { output_statement($1, 0, ECPGst_normal); } | LoadStmt { output_statement($1, 0, ECPGst_normal); }
| LockStmt { output_statement($1, 0, ECPGst_normal); } | LockStmt { output_statement($1, 0, ECPGst_normal); }
| NotifyStmt { output_statement($1, 0, ECPGst_normal); } | NotifyStmt { output_statement($1, 0, ECPGst_normal); }
| PrepareStmt { | PrepareStmt {
if ($1.type == NULL || strlen($1.type) == 0) /* use PQprepare without type parameters */ if ($1.type == NULL || strlen($1.type) == 0) /* use PQprepare without type parameters */
output_prepare_statement($1.name, $1.stmt); output_prepare_statement($1.name, $1.stmt);
else /* use PQexec and let backend do its stuff */ else /* use PQexec and let backend do its stuff */
{ {
char *txt = cat_str(5, make_str("prepare"), $1.name, $1.type, make_str("as"), $1.stmt); char *txt = cat_str(5, make_str("prepare"), $1.name, $1.type, make_str("as"), $1.stmt);
output_statement(txt, 0, ECPGst_normal); output_statement(txt, 0, ECPGst_normal);
} }
} }
| ReassignOwnedStmt { output_statement($1, 0, ECPGst_normal); } | ReassignOwnedStmt { output_statement($1, 0, ECPGst_normal); }
| ReindexStmt { output_statement($1, 0, ECPGst_normal); } | ReindexStmt { output_statement($1, 0, ECPGst_normal); }
| RemoveAggrStmt { output_statement($1, 0, ECPGst_normal); } | RemoveAggrStmt { output_statement($1, 0, ECPGst_normal); }
@ -1500,14 +1500,14 @@ CopyStmt: COPY opt_binary qualified_name opt_oids copy_from
mmerror(PARSE_ERROR, ET_ERROR, "copy from stdout not possible.\n"); mmerror(PARSE_ERROR, ET_ERROR, "copy from stdout not possible.\n");
else if (strcmp($5, "from") == 0 && strcmp($6, "stdin") == 0) else if (strcmp($5, "from") == 0 && strcmp($6, "stdin") == 0)
mmerror(PARSE_ERROR, ET_WARNING, "copy from stdin not implemented.\n"); mmerror(PARSE_ERROR, ET_WARNING, "copy from stdin not implemented.\n");
$$ = cat_str(9, make_str("copy"), $2, $3, $4, $5, $6, $7, $8, $9); $$ = cat_str(9, make_str("copy"), $2, $3, $4, $5, $6, $7, $8, $9);
} }
| COPY select_with_parens TO copy_file_name opt_with copy_opt_list | COPY select_with_parens TO copy_file_name opt_with copy_opt_list
{ {
if (strcmp($4, "stdin") == 0) if (strcmp($4, "stdin") == 0)
mmerror(PARSE_ERROR, ET_ERROR, "copy to stdin not possible.\n"); mmerror(PARSE_ERROR, ET_ERROR, "copy to stdin not possible.\n");
$$ = cat_str(6, make_str("copy"), $2, make_str("to"), $4, $5, $6); $$ = cat_str(6, make_str("copy"), $2, make_str("to"), $4, $5, $6);
} }
; ;
@ -2573,12 +2573,12 @@ opt_class: any_name { $$ = $1; }
; ;
opt_asc_desc: ASC { $$ = make_str("asc"); } opt_asc_desc: ASC { $$ = make_str("asc"); }
| DESC { $$ = make_str("desc"); } | DESC { $$ = make_str("desc"); }
| /*EMPTY*/ { $$ = EMPTY; } | /*EMPTY*/ { $$ = EMPTY; }
; ;
opt_nulls_order: NULLS_FIRST { $$ = make_str("nulls first"); } opt_nulls_order: NULLS_FIRST { $$ = make_str("nulls first"); }
| NULLS_LAST { $$ = make_str("nulls last"); } | NULLS_LAST { $$ = make_str("nulls last"); }
| /*EMPTY*/ { $$ = EMPTY; } | /*EMPTY*/ { $$ = EMPTY; }
; ;
@ -3059,12 +3059,12 @@ ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list AS SelectStmt opt_
*/ */
opt_check_option: opt_check_option:
WITH_CHECK OPTION WITH_CHECK OPTION
{ {
mmerror(PARSE_ERROR, ET_ERROR, "WITH CHECK OPTION not implemented"); mmerror(PARSE_ERROR, ET_ERROR, "WITH CHECK OPTION not implemented");
$$ = EMPTY; $$ = EMPTY;
} }
| WITH_CASCADED CHECK OPTION | WITH_CASCADED CHECK OPTION
{ {
mmerror(PARSE_ERROR, ET_ERROR, "WITH CHECK OPTION not implemented"); mmerror(PARSE_ERROR, ET_ERROR, "WITH CHECK OPTION not implemented");
$$ = EMPTY; $$ = EMPTY;
} }
@ -3074,7 +3074,7 @@ opt_check_option:
$$ = EMPTY; $$ = EMPTY;
} }
| /* EMPTY */ | /* EMPTY */
{ $$ = EMPTY; } { $$ = EMPTY; }
; ;
/***************************************************************************** /*****************************************************************************
@ -3377,7 +3377,7 @@ InsertStmt: INSERT INTO qualified_name insert_rest returning_clause
{ $$ = cat_str(4, make_str("insert into"), $3, $4, $5); } { $$ = cat_str(4, make_str("insert into"), $3, $4, $5); }
; ;
insert_rest: insert_rest:
SelectStmt SelectStmt
{ $$ = $1; } { $$ = $1; }
| '(' insert_column_list ')' SelectStmt | '(' insert_column_list ')' SelectStmt
@ -3700,7 +3700,7 @@ for_locking_clause:
| FOR READ ONLY { $$ = make_str("for read only");} | FOR READ ONLY { $$ = make_str("for read only");}
; ;
opt_for_locking_clause: opt_for_locking_clause:
for_locking_clause { $$ = $1; } for_locking_clause { $$ = $1; }
| /* EMPTY */ { $$ = EMPTY; } | /* EMPTY */ { $$ = EMPTY; }
; ;
@ -3959,7 +3959,7 @@ GenericType: type_function_name opt_type_modifiers { $$ = cat2_str($1, $2); }
opt_type_modifiers: '(' expr_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); } opt_type_modifiers: '(' expr_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
| /* EMPTY */ { $$ = EMPTY; } | /* EMPTY */ { $$ = EMPTY; }
; ;
/* SQL92 numeric data types /* SQL92 numeric data types
* Check FLOAT() precision limits assuming IEEE floating types. * Check FLOAT() precision limits assuming IEEE floating types.
* Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30 * Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30
@ -4252,7 +4252,7 @@ a_expr: c_expr
{ $$ = cat_str(4, $1, $2, $3, $4); } { $$ = cat_str(4, $1, $2, $3, $4); }
| a_expr subquery_Op sub_type '(' a_expr ')' %prec Op | a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
{ $$ = cat_str(6, $1, $2, $3, make_str("("), $5, make_str(")")); } { $$ = cat_str(6, $1, $2, $3, make_str("("), $5, make_str(")")); }
| UNIQUE select_with_parens | UNIQUE select_with_parens
{ $$ = cat2_str(make_str("unique"), $2); } { $$ = cat2_str(make_str("unique"), $2); }
| a_expr IS DOCUMENT_P | a_expr IS DOCUMENT_P
{ $$ = cat2_str($1, make_str("is document")); } { $$ = cat2_str($1, make_str("is document")); }
@ -4730,7 +4730,7 @@ update_target_list: '(' inf_col_list ')' '=' '(' inf_val_list ')'
vals = cat_str( 3, vals, ptrv->val, make_str(")") ); vals = cat_str( 3, vals, ptrv->val, make_str(")") );
} }
$$ = cat_str( 3, cols, make_str("="), vals ); $$ = cat_str( 3, cols, make_str("="), vals );
} }
; ;
inf_col_list: ColId opt_indirection inf_col_list: ColId opt_indirection
@ -4875,7 +4875,7 @@ Sconst: SCONST
} }
| DOLCONST | DOLCONST
{ {
$$ = $1; $$ = $1;
} }
; ;
@ -5009,7 +5009,7 @@ connection_target: opt_database_name opt_server opt_port
/* old style: dbname[@server][:port] */ /* old style: dbname[@server][:port] */
if (strlen($2) > 0 && *($2) != '@') if (strlen($2) > 0 && *($2) != '@')
mmerror(PARSE_ERROR, ET_ERROR, "Expected '@', found '%s'", $2); mmerror(PARSE_ERROR, ET_ERROR, "Expected '@', found '%s'", $2);
/* C strings need to be handled differently */ /* C strings need to be handled differently */
if ($1[0] == '\"') if ($1[0] == '\"')
$$ = $1; $$ = $1;
@ -5221,7 +5221,7 @@ ECPGCursorStmt: DECLARE name cursor_options CURSOR opt_hold FOR prepared_name
; ;
ECPGExecuteImmediateStmt: EXECUTE IMMEDIATE execstring ECPGExecuteImmediateStmt: EXECUTE IMMEDIATE execstring
{ {
/* execute immediate means prepare the statement and /* execute immediate means prepare the statement and
* immediately execute it */ * immediately execute it */
$$ = $3; $$ = $3;
@ -5497,7 +5497,7 @@ var_type: simple_type
$$.type_index = this->type->type_index; $$.type_index = this->type->type_index;
if (this->type->type_sizeof && strlen(this->type->type_sizeof) != 0) if (this->type->type_sizeof && strlen(this->type->type_sizeof) != 0)
$$.type_sizeof = this->type->type_sizeof; $$.type_sizeof = this->type->type_sizeof;
else else
$$.type_sizeof = cat_str(3, make_str("sizeof("), mm_strdup(this->name), make_str(")")); $$.type_sizeof = cat_str(3, make_str("sizeof("), mm_strdup(this->name), make_str(")"));
struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list); struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
@ -5728,7 +5728,7 @@ variable: opt_pointer ECPGColLabel opt_array_bounds opt_bit_field opt_initialize
type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length, yylineno); type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length, yylineno);
else else
type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length, yylineno), dimension); type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length, yylineno), dimension);
if (strcmp(dimension, "0") == 0 || abs(atoi(dimension)) == 1) if (strcmp(dimension, "0") == 0 || abs(atoi(dimension)) == 1)
*dim = '\0'; *dim = '\0';
else else
@ -5739,7 +5739,7 @@ variable: opt_pointer ECPGColLabel opt_array_bounds opt_bit_field opt_initialize
/* make sure varchar struct name is unique by adding linenumer of its definition */ /* make sure varchar struct name is unique by adding linenumer of its definition */
vcn = (char *) mm_alloc(strlen($2) + sizeof(int) * CHAR_BIT * 10 / 3); vcn = (char *) mm_alloc(strlen($2) + sizeof(int) * CHAR_BIT * 10 / 3);
sprintf(vcn, "%s_%d", $2, yylineno); sprintf(vcn, "%s_%lu", $2, yylineno);
if (strcmp(dimension, "0") == 0) if (strcmp(dimension, "0") == 0)
$$ = cat_str(7, make2_str(make_str(" struct varchar_"), vcn), make_str(" { int len; char arr["), mm_strdup(length), make_str("]; } *"), mm_strdup($2), $4, $5); $$ = cat_str(7, make2_str(make_str(" struct varchar_"), vcn), make_str(" { int len; char arr["), mm_strdup(length), make_str("]; } *"), mm_strdup($2), $4, $5);
else else
@ -5839,7 +5839,7 @@ execstring: char_variable
{ $$ = make3_str(make_str("\""), $1, make_str("\"")); } { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
; ;
prepared_name: name { prepared_name: name {
if ($1[0] == '\"' && $1[strlen($1)-1] == '\"') /* already quoted? */ if ($1[0] == '\"' && $1[strlen($1)-1] == '\"') /* already quoted? */
$$ = $1; $$ = $1;
else /* not quoted => convert to lowercase */ else /* not quoted => convert to lowercase */