@@ -724,7 +724,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim
724724*/
725725%token ABORT_TRANS ,ACCESS ,AFTER ,AGGREGATE ,ANALYZE ,
726726BACKWARD ,BEFORE ,BINARY ,
727- CACHE ,CLUSTER ,COPY ,CREATEDB ,CREATEUSER ,CYCLE ,
727+ CACHE ,CLUSTER ,COMMENT , COPY ,CREATEDB ,CREATEUSER ,CYCLE ,
728728DATABASE ,DELIMITERS ,DO ,
729729EACH ,ENCODING ,EXCLUSIVE ,EXPLAIN ,EXTEND ,
730730FORWARD ,FUNCTION ,HANDLER ,
@@ -785,7 +785,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim
785785%type <str> update_target_el opt_id relation_name database_name
786786%type <str> access_method attr_name class index_name name func_name
787787%type <str> file_name AexprConst ParamNo TypeId
788- %type <str> in_expr_nodes a_expr b_expr TruncateStmt
788+ %type <str> in_expr_nodes a_expr b_expr TruncateStmt CommentStmt
789789%type <str> opt_indirection expr_list extract_list extract_arg
790790%type <str> position_list substr_list substr_from
791791%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
839839%type <str> constraints_set_mode
840840
841841%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen opt_using
842- %type <str> indicator ECPGExecute ecpg_expr dotext ECPGPrepare
843- %type <str> storage_clause opt_initializer vartext c_anything blockstart
844- %type <str> blockend variable_list variable var_anything do_anything
842+ %type <str> indicator ECPGExecute ecpg_expr ECPGPrepare
843+ %type <str> storage_clause opt_initializer c_anything blockstart
844+ %type <str> blockend variable_list variable c_thing c_term
845845%type <str> opt_pointer cvariable ECPGDisconnect dis_name
846846%type <str> stmt symbol opt_symbol ECPGRelease execstring server_name
847- %type <str> connection_object opt_server opt_port c_thing opt_reference
847+ %type <str> connection_object opt_server opt_port c_stuff opt_reference
848848%type <str> user_name opt_user char_variable ora_user ident
849- %type <str> db_prefix server opt_options opt_connection_name
850- %type <str> ECPGSetConnection c_line cpp_line s_enum ECPGTypedef
849+ %type <str> db_prefix server opt_options opt_connection_name c_list
850+ %type <str> ECPGSetConnection cpp_line s_enum ECPGTypedef c_args
851851%type <str> enum_type civariableonly ECPGCursorStmt ECPGDeallocate
852852%type <str> ECPGFree ECPGDeclare ECPGVar sql_variable_declarations
853853%type <str> sql_declaration sql_variable_list sql_variable opt_at
@@ -882,6 +882,7 @@ opt_at:SQL_AT connection_target{ connection = $2; }
882882stmt :AddAttrStmt { output_statement($1 ,0 ); }
883883| AlterUserStmt { output_statement($1 ,0 ); }
884884| ClosePortalStmt { output_statement($1 ,0 ); }
885+ | CommentStmt { output_statement($1 ,0 ); }
885886| CopyStmt { output_statement($1 ,0 ); }
886887| CreateStmt { output_statement($1 ,0 ); }
887888| CreateAsStmt { output_statement($1 ,0 ); }
@@ -1892,7 +1893,23 @@ opt_portal_name: IN name{ $$ = cat2_str(make1_str("in"), $2); }
18921893| /* EMPTY*/ {$$ = make1_str(" " ); }
18931894;
18941895
1895-
1896+ /* ****************************************************************************
1897+ *
1898+ * QUERY:
1899+ * comment on [ table <relname> | column <relname>.<attribu
1900+ * is 'text'
1901+ *
1902+ *****************************************************************************/
1903+ CommentStmt :COMMENT ON COLUMN relation_name ' .' attr_name IS Sconst
1904+ {
1905+ cat2_str (cat5_str(make1_str(" comment on column" ), $4, make1_str(" ," ), $6, make1_str(" is" )), $8);
1906+ }
1907+ | COMMENT ON TABLE relation_name IS Sconst
1908+ {
1909+ cat4_str (make1_str(" comment on table" ), $4, make1_str(" is" ), $6);
1910+ }
1911+ ;
1912+
18961913/* ****************************************************************************
18971914 *
18981915 *QUERY:
@@ -4195,6 +4212,7 @@ ColId: ident{ $$ = $1; }
41954212| BACKWARD {$$ = make1_str(" backward" ); }
41964213| BEFORE {$$ = make1_str(" before" ); }
41974214| CACHE {$$ = make1_str(" cache" ); }
4215+ | COMMENT {$$ = make1_str(" comment" ); }
41984216| COMMITTED {$$ = make1_str(" committed" ); }
41994217| CONSTRAINTS {$$ = make1_str(" constraints" ); }
42004218| CREATEDB {$$ = make1_str(" createdb" ); }
@@ -4265,6 +4283,7 @@ ColId: ident{ $$ = $1; }
42654283| TIMEZONE_HOUR {$$ = make1_str(" timezone_hour" ); }
42664284| TIMEZONE_MINUTE {$$ = make1_str(" timezone_minute" ); }
42674285| TRIGGER {$$ = make1_str(" trigger" ); }
4286+ | TRUNCATE {$$ = make1_str(" truncate" ); }
42684287| TRUSTED {$$ = make1_str(" trusted" ); }
42694288| TYPE_P {$$ = make1_str(" type" ); }
42704289| VALID {$$ = make1_str(" valid" ); }
@@ -4673,8 +4692,7 @@ type: simple_type
46734692{
46744693$$ .type_str =$1 ;
46754694$$ .type_enum = ECPGt_int;
4676-
4677- $$ .type_dimension = -1 ;
4695+ $$ .type_dimension = -1 ;
46784696$$ .type_index = -1 ;
46794697}
46804698| symbol
@@ -4689,7 +4707,7 @@ type: simple_type
46894707struct_member_list[struct_level] = ECPGstruct_member_dup(this ->struct_member_list);
46904708}
46914709
4692- enum_type :s_enum ' {' c_line ' }'
4710+ enum_type :s_enum ' {' c_list ' }'
46934711{
46944712$$ = cat4_str($1 , make1_str(" {" ),$3 , make1_str(" }" ));
46954713}
@@ -4828,7 +4846,7 @@ variable: opt_pointer symbol opt_array_bounds opt_initializer
48284846}
48294847
48304848opt_initializer :/* empty*/ {$$ = make1_str(" " ); }
4831- | ' =' vartext {$$ = make2_str(make1_str(" =" ),$2 ); }
4849+ | ' =' c_term {$$ = make2_str(make1_str(" =" ),$2 ); }
48324850
48334851opt_pointer :/* empty*/ {$$ = make1_str(" " ); }
48344852| ' *' {$$ = make1_str(" *" ); }
@@ -5367,7 +5385,7 @@ action : SQL_CONTINUE {
53675385 $<action>$.command = strdup($3 );
53685386$<action>$.str = cat2_str(make1_str(" goto" ),$3 );
53695387}
5370- | DO name ' (' dotext ' )' {
5388+ | DO name ' (' c_args ' )' {
53715389$<action>$.code = W_DO;
53725390$<action>$.command = make4_str($2 , make1_str(" (" ),$4 , make1_str(" )" ));
53735391$<action>$.str = cat2_str(make1_str(" do" ), mm_strdup($<action>$.command ));
@@ -5377,7 +5395,7 @@ action : SQL_CONTINUE {
53775395 $<action>$.command =NULL ;
53785396 $<action>$.str = make1_str(" break" );
53795397}
5380- | SQL_CALL name ' (' dotext ' )' {
5398+ | SQL_CALL name ' (' c_args ' )' {
53815399$<action>$.code = W_DO;
53825400$<action>$.command = make4_str($2 , make1_str(" (" ),$4 , make1_str(" )" ));
53835401$<action>$.str = cat2_str(make1_str(" call" ), mm_strdup($<action>$.command ));
@@ -5726,11 +5744,8 @@ into_list : coutputvariable | into_list ',' coutputvariable;
57265744
57275745ecpgstart :SQL_START { reset_variables();}
57285746
5729- dotext :/* empty*/ {$$ = make1_str(" " ); }
5730- | dotext do_anything {$$ = make2_str($1 ,$2 ); }
5731-
5732- vartext :var_anything {$$ =$1 ; }
5733- | vartext var_anything {$$ = make2_str($1 ,$2 ); }
5747+ c_args :/* empty*/ {$$ = make1_str(" " ); }
5748+ | c_list {$$ =$1 ; }
57345749
57355750coutputvariable :cvariable indicator {
57365751add_variable (&argsresult, find_variable($1 ), ($2 ==NULL ) ? &no_indicator : find_variable($2 ));
@@ -5754,6 +5769,7 @@ indicator: /* empty */{ $$ = NULL; }
57545769
57555770ident :IDENT {$$ =$1 ; }
57565771| CSTRING {$$ = make3_str(make1_str(" \" " ),$1 , make1_str(" \" " )); };
5772+
57575773/*
57585774 * C stuff
57595775*/
@@ -5762,13 +5778,27 @@ symbol: IDENT{ $$ = $1; }
57625778
57635779cpp_line :CPP_LINE {$$ =$1 ; }
57645780
5765- c_line :c_anything {$$ =$1 ; }
5766- | c_line c_anything
5767- {
5768- $$ = make2_str($1 ,$2 );
5769- }
5781+ c_stuff :c_anything {$$ =$1 ; }
5782+ | c_stuff c_anything
5783+ {
5784+ $$ = cat2_str($1 ,$2 );
5785+ }
5786+ | c_stuff ' (' c_stuff ' )'
5787+ {
5788+ $$ = cat4_str($1 , make1_str(" (" ),$3 , make1_str(" )" ));
5789+ }
5790+
5791+ c_list :c_term {$$ =$1 ; }
5792+ | c_term ' ,' c_list {$$ = make3_str($1 , make1_str(" ," ),$3 ); }
5793+
5794+ c_term :c_stuff {$$ =$1 ; }
5795+ | ' {' c_list ' }' {$$ = make3_str(make1_str(" {" ),$2 , make1_str(" }" )); }
57705796
5771- c_thing :c_anything | ' ;' {$$ = make1_str(" ;" ); }
5797+ c_thing :c_anything {$$ =$1 ; }
5798+ | ' (' {$$ = make1_str(" (" ); }
5799+ | ' )' {$$ = make1_str(" )" ); }
5800+ | ' ,' {$$ = make1_str(" ," ); }
5801+ | ' ;' {$$ = make1_str(" ;" ); }
57725802
57735803c_anything :IDENT {$$ =$1 ; }
57745804| CSTRING {$$ = make3_str(make1_str(" \" " ),$1 , make1_str(" \" " )); }
@@ -5800,22 +5830,9 @@ c_anything: IDENT { $$ = $1; }
58005830| S_ANYTHING {$$ = make_name(); }
58015831| ' [' {$$ = make1_str(" [" ); }
58025832| ' ]' {$$ = make1_str(" ]" ); }
5803- | ' (' {$$ = make1_str(" (" ); }
5804- | ' )' {$$ = make1_str(" )" ); }
5833+ /* | '('{ $$ = make1_str("("); }
5834+ | ')'{ $$ = make1_str(")"); }*/
58055835| ' =' {$$ = make1_str(" =" ); }
5806- | ' ,' {$$ = make1_str(" ," ); }
5807-
5808- do_anything :IDENT {$$ =$1 ; }
5809- | CSTRING {$$ = make3_str(make1_str(" \" " ),$1 , make1_str(" \" " ));}
5810- | Iconst {$$ =$1 ; }
5811- | Fconst {$$ =$1 ; }
5812- | ' ,' {$$ = make1_str(" ," ); }
5813-
5814- var_anything :IDENT {$$ =$1 ; }
5815- | CSTRING {$$ = make3_str(make1_str(" \" " ),$1 , make1_str(" \" " )); }
5816- | Iconst {$$ =$1 ; }
5817- | Fconst {$$ =$1 ; }
5818- | ' {' c_line ' }' {$$ = make3_str(make1_str(" {" ),$2 , make1_str(" }" )); }
58195836
58205837blockstart :' {' {
58215838 braces_open++;