From 6fb3c3f78fbb2296894424f6e3183d339915eac7 Mon Sep 17 00:00:00 2001 From: Michael Meskes <meskes@postgresql.org> Date: Fri, 15 Oct 1999 19:02:08 +0000 Subject: [PATCH] *** empty log message *** --- src/interfaces/ecpg/ChangeLog | 11 +++ src/interfaces/ecpg/TODO | 7 +- src/interfaces/ecpg/preproc/Makefile | 2 +- src/interfaces/ecpg/preproc/keywords.c | 3 +- src/interfaces/ecpg/preproc/pgc.l | 32 ++++++--- src/interfaces/ecpg/preproc/preproc.y | 99 +++++++++++++++----------- 6 files changed, 99 insertions(+), 55 deletions(-) diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index f0043ed9bd..bd2a6f9e15 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -674,3 +674,14 @@ Thu Oct 7 15:12:58 CEST 1999 - Set ecpg version to 2.6.6 - Set library version to 3.0.4 +Tue Oct 12 07:26:50 CEST 1999 + + - Simplified C part of parser. + +Fri Oct 15 17:05:25 CEST 1999 + + - Synced preproc.y with gram.y. + - Synced pgc.l with scan.l. + - Synced keyword.c. + - Finished C parser changes, so initializers are correctly parsed. + - Set ecpg version to 2.6.7 diff --git a/src/interfaces/ecpg/TODO b/src/interfaces/ecpg/TODO index 36d929ea0b..9e9f94b157 100644 --- a/src/interfaces/ecpg/TODO +++ b/src/interfaces/ecpg/TODO @@ -13,8 +13,13 @@ support for dynamic SQL with unknown number of variables with DESCRIPTORS The line numbering is not exact. +What happens to the output variable during read if there was an +indicator-error? + +Add a semantic check level, e.g. check if a table really exists. + Missing statements: - - exec slq ifdef + - exec sql ifdef - exec sql allocate - exec sql deallocate - SQLSTATE diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile index 337e094419..ac0015cbd2 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=6 +PATCHLEVEL=7 CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \ -DMINOR_VERSION=$(MINOR_VERSION) -DPATCHLEVEL=$(PATCHLEVEL) \ diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c index 3c65d99fb0..398d8c7a3d 100644 --- a/src/interfaces/ecpg/preproc/keywords.c +++ b/src/interfaces/ecpg/preproc/keywords.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.18 1999/10/08 11:05:02 meskes Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.19 1999/10/15 19:02:08 meskes Exp $ * *------------------------------------------------------------------------- */ @@ -61,6 +61,7 @@ static ScanKeyword ScanKeywords[] = { {"coalesce", COALESCE}, {"collate", COLLATE}, {"column", COLUMN}, + {"comment", COMMENT}, {"commit", COMMIT}, {"committed", COMMITTED}, {"constraint", CONSTRAINT}, diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index 80a8547ed6..498fe689e5 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -1,3 +1,4 @@ + /* This is a modified version of src/backend/parser/scan.l */ %{ #include <ctype.h> @@ -90,6 +91,10 @@ xhstop {quote} xhinside [^']* xhcat {quote}{space}*\n{space}*{quote} +/* C version of hex number + */ +xch 0[xX][0-9A-Fa-f]* + /* Extended quote * xqdouble implements SQL92 embedded quote * xqcat allows strings to cross input lines @@ -150,10 +155,10 @@ real (((({digit}*\.{digit}+)|({digit}+\.{digit}*))([Ee][-+]?{digit}+)?)|({digi param \${integer} -comment ("--"|"//").*\n +comment ("--"|"//").* ccomment "//".*\n -space [ \t\n\f] +space [ \t\n\r\f] other . /* some stuff needed for ecpg */ @@ -242,7 +247,6 @@ cppline {space}*#.*(\\{space}*\n)*\n* } <xq>{xqstop} { BEGIN(SQL); - /* yylval.str = mm_strdup(scanstr(literal));*/ yylval.str = mm_strdup(literal); return SCONST; } @@ -319,13 +323,6 @@ cppline {space}*#.*(\\{space}*\n)*\n* if (*endptr != '\0' || errno == ERANGE) { errno = 0; -#if 0 - yylval.dval = strtod(((char *)yytext),&endptr); - if (*endptr != '\0' || errno == ERANGE) - yyerror("ERROR: Bad integer input"); - yyerror("WARNING: Integer input is out of range; promoted to float"); - return FCONST; -#endif yylval.str = mm_strdup((char*)yytext); return SCONST; } @@ -414,6 +411,19 @@ cppline {space}*#.*(\\{space}*\n)*\n* <SQL>{other} { return yytext[0]; } <C>{exec}{space}*{sql} { BEGIN SQL; return SQL_START; } <C>{ccomment} { /* ignore */ } +<C>{xch} { + char* endptr; + + errno = 0; + yylval.ival = strtol((char *)yytext,&endptr,16); + if (*endptr != '\0' || errno == ERANGE) + { + errno = 0; + yylval.str = mm_strdup((char*)yytext); + return SCONST; + } + return ICONST; + } <C>{cppline} { yylval.str = mm_strdup((char*)yytext); return(CPP_LINE); @@ -470,7 +480,7 @@ cppline {space}*#.*(\\{space}*\n)*\n* <C>\[ { return('['); } <C>\] { return(']'); } <C>\= { return('='); } -<C>{other} { return S_ANYTHING; } +<C>{other} { return S_ANYTHING; } <C>{exec}{space}{sql}{space}{define} {BEGIN(def_ident);} <def_ident>{space} {} <def_ident>{identifier} { diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 5f4bd2a364..06895e1979 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -724,7 +724,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim */ %token ABORT_TRANS, ACCESS, AFTER, AGGREGATE, ANALYZE, BACKWARD, BEFORE, BINARY, - CACHE, CLUSTER, COPY, CREATEDB, CREATEUSER, CYCLE, + CACHE, CLUSTER, COMMENT, COPY, CREATEDB, CREATEUSER, CYCLE, DATABASE, DELIMITERS, DO, EACH, ENCODING, EXCLUSIVE, EXPLAIN, EXTEND, FORWARD, FUNCTION, HANDLER, @@ -785,7 +785,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim %type <str> update_target_el opt_id relation_name database_name %type <str> access_method attr_name class index_name name func_name %type <str> file_name AexprConst ParamNo TypeId -%type <str> in_expr_nodes a_expr b_expr TruncateStmt +%type <str> in_expr_nodes a_expr b_expr TruncateStmt CommentStmt %type <str> opt_indirection expr_list extract_list extract_arg %type <str> position_list substr_list substr_from %type <str> trim_list in_expr substr_for attr attrs @@ -839,15 +839,15 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim %type <str> constraints_set_mode %type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen opt_using -%type <str> indicator ECPGExecute ecpg_expr dotext ECPGPrepare -%type <str> storage_clause opt_initializer vartext c_anything blockstart -%type <str> blockend variable_list variable var_anything do_anything +%type <str> indicator ECPGExecute ecpg_expr ECPGPrepare +%type <str> storage_clause opt_initializer c_anything blockstart +%type <str> blockend variable_list variable c_thing c_term %type <str> opt_pointer cvariable ECPGDisconnect dis_name %type <str> stmt symbol opt_symbol ECPGRelease execstring server_name -%type <str> connection_object opt_server opt_port c_thing opt_reference +%type <str> connection_object opt_server opt_port c_stuff opt_reference %type <str> user_name opt_user char_variable ora_user ident -%type <str> db_prefix server opt_options opt_connection_name -%type <str> ECPGSetConnection c_line cpp_line s_enum ECPGTypedef +%type <str> db_prefix server opt_options opt_connection_name c_list +%type <str> ECPGSetConnection cpp_line s_enum ECPGTypedef c_args %type <str> enum_type civariableonly ECPGCursorStmt ECPGDeallocate %type <str> ECPGFree ECPGDeclare ECPGVar sql_variable_declarations %type <str> sql_declaration sql_variable_list sql_variable opt_at @@ -882,6 +882,7 @@ opt_at: SQL_AT connection_target { connection = $2; } stmt: AddAttrStmt { output_statement($1, 0); } | AlterUserStmt { output_statement($1, 0); } | ClosePortalStmt { output_statement($1, 0); } + | CommentStmt { output_statement($1, 0); } | CopyStmt { output_statement($1, 0); } | CreateStmt { output_statement($1, 0); } | CreateAsStmt { output_statement($1, 0); } @@ -1892,7 +1893,23 @@ opt_portal_name: IN name { $$ = cat2_str(make1_str("in"), $2); } | /*EMPTY*/ { $$ = make1_str(""); } ; - +/***************************************************************************** + * + * QUERY: + * comment on [ table <relname> | column <relname>.<attribu + * is 'text' + * + *****************************************************************************/ +CommentStmt: COMMENT ON COLUMN relation_name '.' attr_name IS Sconst + { + cat2_str(cat5_str(make1_str("comment on column"), $4, make1_str(","), $6, make1_str("is")), $8); + } + | COMMENT ON TABLE relation_name IS Sconst + { + cat4_str(make1_str("comment on table"), $4, make1_str("is"), $6); + } + ; + /***************************************************************************** * * QUERY: @@ -4195,6 +4212,7 @@ ColId: ident { $$ = $1; } | 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"); } @@ -4265,6 +4283,7 @@ ColId: ident { $$ = $1; } | 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"); } @@ -4673,8 +4692,7 @@ type: simple_type { $$.type_str = $1; $$.type_enum = ECPGt_int; - - $$.type_dimension = -1; + $$.type_dimension = -1; $$.type_index = -1; } | symbol @@ -4689,7 +4707,7 @@ type: simple_type struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list); } -enum_type: s_enum '{' c_line '}' +enum_type: s_enum '{' c_list '}' { $$ = cat4_str($1, make1_str("{"), $3, make1_str("}")); } @@ -4828,7 +4846,7 @@ variable: opt_pointer symbol opt_array_bounds opt_initializer } opt_initializer: /* empty */ { $$ = make1_str(""); } - | '=' vartext { $$ = make2_str(make1_str("="), $2); } + | '=' c_term { $$ = make2_str(make1_str("="), $2); } opt_pointer: /* empty */ { $$ = make1_str(""); } | '*' { $$ = make1_str("*"); } @@ -5367,7 +5385,7 @@ action : SQL_CONTINUE { $<action>$.command = strdup($3); $<action>$.str = cat2_str(make1_str("goto "), $3); } - | DO name '(' dotext ')' { + | DO name '(' c_args ')' { $<action>$.code = W_DO; $<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")")); $<action>$.str = cat2_str(make1_str("do"), mm_strdup($<action>$.command)); @@ -5377,7 +5395,7 @@ action : SQL_CONTINUE { $<action>$.command = NULL; $<action>$.str = make1_str("break"); } - | SQL_CALL name '(' dotext ')' { + | SQL_CALL name '(' c_args ')' { $<action>$.code = W_DO; $<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")")); $<action>$.str = cat2_str(make1_str("call"), mm_strdup($<action>$.command)); @@ -5726,11 +5744,8 @@ into_list : coutputvariable | into_list ',' coutputvariable; ecpgstart: SQL_START { reset_variables();} -dotext: /* empty */ { $$ = make1_str(""); } - | dotext do_anything { $$ = make2_str($1, $2); } - -vartext: var_anything { $$ = $1; } - | vartext var_anything { $$ = make2_str($1, $2); } +c_args: /* empty */ { $$ = make1_str(""); } + | c_list { $$ = $1; } coutputvariable : cvariable indicator { add_variable(&argsresult, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2)); @@ -5754,6 +5769,7 @@ indicator: /* empty */ { $$ = NULL; } ident: IDENT { $$ = $1; } | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }; + /* * C stuff */ @@ -5762,13 +5778,27 @@ symbol: IDENT { $$ = $1; } cpp_line: CPP_LINE { $$ = $1; } -c_line: c_anything { $$ = $1; } - | c_line c_anything - { - $$ = make2_str($1, $2); - } +c_stuff: c_anything { $$ = $1; } + | c_stuff c_anything + { + $$ = cat2_str($1, $2); + } + | c_stuff '(' c_stuff ')' + { + $$ = cat4_str($1, make1_str("("), $3, make1_str(")")); + } -c_thing: c_anything | ';' { $$ = make1_str(";"); } +c_list: c_term { $$ = $1; } + | c_term ',' c_list { $$ = make3_str($1, make1_str(","), $3); } + +c_term: c_stuff { $$ = $1; } + | '{' c_list '}' { $$ = make3_str(make1_str("{"), $2, make1_str("}")); } + +c_thing: c_anything { $$ = $1; } + | '(' { $$ = make1_str("("); } + | ')' { $$ = make1_str(")"); } + | ',' { $$ = make1_str(","); } + | ';' { $$ = make1_str(";"); } c_anything: IDENT { $$ = $1; } | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); } @@ -5800,22 +5830,9 @@ c_anything: IDENT { $$ = $1; } | S_ANYTHING { $$ = make_name(); } | '[' { $$ = make1_str("["); } | ']' { $$ = make1_str("]"); } - | '(' { $$ = make1_str("("); } - | ')' { $$ = make1_str(")"); } +/* | '(' { $$ = make1_str("("); } + | ')' { $$ = make1_str(")"); }*/ | '=' { $$ = make1_str("="); } - | ',' { $$ = make1_str(","); } - -do_anything: IDENT { $$ = $1; } - | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\""));} - | Iconst { $$ = $1; } - | Fconst { $$ = $1; } - | ',' { $$ = make1_str(","); } - -var_anything: IDENT { $$ = $1; } - | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); } - | Iconst { $$ = $1; } - | Fconst { $$ = $1; } - | '{' c_line '}' { $$ = make3_str(make1_str("{"), $2, make1_str("}")); } blockstart : '{' { braces_open++;