@@ -37,11 +37,19 @@ struct ECPGtype ecpg_query = {ECPGt_char_variable, 0L, {NULL}};
3737*/
3838char * input_filename =NULL ;
3939
40- static void
40+ void
4141output_line_number ()
4242{
4343if (input_filename)
44- fprintf (yyout," \n #line %d\" %s\"\n " , yylineno, input_filename);
44+ fprintf (yyout," \n #line %d\" %s\"\n " , yylineno +1 , input_filename);
45+ }
46+
47+ static void
48+ output_simple_statement (char *cmd)
49+ {
50+ fputs (cmd, yyout);
51+ output_line_number ();
52+ free (cmd);
4553}
4654
4755/*
@@ -883,10 +891,7 @@ stmt: AddAttrStmt{ output_statement($1, 0); }
883891| RevokeStmt { output_statement($1 ,0 ); }
884892| OptimizableStmt {
885893if (strncmp($1 ," /*" ,sizeof (" /*" )-1 ) ==0 )
886- {
887- fputs ($1 , yyout);
888- free ($1 );
889- }
894+ output_simple_statement ($1 );
890895else
891896output_statement ($1 ,1 );
892897}
@@ -908,14 +913,12 @@ stmt: AddAttrStmt{ output_statement($1, 0); }
908913if (connection)
909914yyerror (" no at option for connect statement.\n " );
910915
911- fprintf (yyout," no_auto_trans = %d;\n " , no_auto_trans);
912- fprintf (yyout," ECPGconnect(__LINE__, %s);" , $1 );
916+ fprintf (yyout," ECPGconnect(__LINE__, %s, %d);" , $1 , no_auto_trans);
913917whenever_action (0 );
914918free ($1 );
915919}
916920| ECPGCursorStmt {
917- fputs ($1 , yyout);
918- free ($1 );
921+ output_simple_statement ($1 );
919922}
920923| ECPGDeallocate {
921924if (connection)
@@ -926,8 +929,7 @@ stmt: AddAttrStmt{ output_statement($1, 0); }
926929free ($1 );
927930}
928931| ECPGDeclare {
929- fputs ($1 , yyout);
930- free ($1 );
932+ output_simple_statement ($1 );
931933}
932934| ECPGDisconnect {
933935if (connection)
@@ -991,23 +993,19 @@ stmt: AddAttrStmt{ output_statement($1, 0); }
991993if (connection)
992994yyerror (" no at option for typedef statement.\n " );
993995
994- fputs ($1 , yyout);
995- free ($1 );
996+ output_simple_statement ($1 );
996997}
997998| ECPGVar {
998999if (connection)
9991000yyerror (" no at option for var statement.\n " );
10001001
1001- fputs ($1 , yyout);
1002- free ($1 );
1002+ output_simple_statement ($1 );
10031003}
10041004| ECPGWhenever {
10051005if (connection)
10061006yyerror (" no at option for whenever statement.\n " );
10071007
1008- fputs ($1 , yyout);
1009- output_line_number ();
1010- free ($1 );
1008+ output_simple_statement ($1 );
10111009}
10121010;
10131011
@@ -3572,6 +3570,10 @@ a_expr: attr opt_indirection
35723570}
35733571| ' -' a_expr %prec UMINUS
35743572{$$ = cat2_str(make1_str(" -" ),$2 ); }
3573+ | ' %' a_expr
3574+ {$$ = cat2_str(make1_str(" %" ),$2 ); }
3575+ | a_expr ' %'
3576+ {$$ = cat2_str($1 , make1_str(" %" )); }
35753577| a_expr ' +' a_expr
35763578{$$ = cat3_str($1 , make1_str(" +" ),$3 ); }
35773579| a_expr ' -' a_expr
@@ -3663,7 +3665,6 @@ a_expr: attr opt_indirection
36633665{
36643666$$ = make1_str(" user" );
36653667 }
3666-
36673668| EXISTS ' (' SubSelect ' )'
36683669{
36693670$$ = make3_str(make1_str(" exists(" ),$3 , make1_str(" )" ));
@@ -3879,6 +3880,10 @@ b_expr: attr opt_indirection
38793880}
38803881| ' -' b_expr %prec UMINUS
38813882{$$ = cat2_str(make1_str(" -" ),$2 ); }
3883+ | ' %' b_expr
3884+ {$$ = cat2_str(make1_str(" %" ),$2 ); }
3885+ | b_expr ' %'
3886+ {$$ = cat2_str($1 , make1_str(" %" )); }
38823887| b_expr ' +' b_expr
38833888{$$ = cat3_str($1 , make1_str(" +" ),$3 ); }
38843889| b_expr ' -' b_expr
@@ -4677,7 +4682,7 @@ ora_user: user_name
46774682{
46784683$$ = make2_str($1 , make1_str(" ,NULL" ));
46794684 }
4680- | user_name ' /' ColId
4685+ | user_name ' /' user_name
46814686{
46824687$$ = make3_str($1 , make1_str(" ," ),$3 );
46834688 }
@@ -5604,6 +5609,10 @@ ecpg_expr: attr opt_indirection
56045609}
56055610| ' -' ecpg_expr %prec UMINUS
56065611{$$ = cat2_str(make1_str(" -" ),$2 ); }
5612+ | ' %' ecpg_expr
5613+ {$$ = cat2_str(make1_str(" %" ),$2 ); }
5614+ | a_expr ' %'
5615+ {$$ = cat2_str($1 , make1_str(" %" )); }
56075616| a_expr ' +' ecpg_expr
56085617{$$ = cat3_str($1 , make1_str(" +" ),$3 ); }
56095618| a_expr ' -' ecpg_expr
@@ -5618,6 +5627,10 @@ ecpg_expr: attr opt_indirection
56185627{$$ = cat3_str($1 , make1_str(" <" ),$3 ); }
56195628| a_expr ' >' ecpg_expr
56205629{$$ = cat3_str($1 , make1_str(" >" ),$3 ); }
5630+ | a_expr ' =' NULL_P
5631+ {$$ = cat2_str($1 , make1_str(" = NULL" )); }
5632+ | NULL_P ' =' a_expr
5633+ {$$ = cat2_str(make1_str(" = NULL" ),$3 ); }
56215634| a_expr ' =' ecpg_expr
56225635{$$ = cat3_str($1 , make1_str(" =" ),$3 ); }
56235636/* | ':' ecpg_expr
@@ -5686,6 +5699,10 @@ ecpg_expr: attr opt_indirection
56865699{
56875700$$ = make1_str(" current_user" );
56885701}
5702+ | USER
5703+ {
5704+ $$ = make1_str(" user" );
5705+ }
56895706| EXISTS ' (' SubSelect ' )'
56905707{
56915708$$ = make3_str(make1_str(" exists(" ),$3 , make1_str(" )" ));
@@ -5758,11 +5775,11 @@ ecpg_expr: attr opt_indirection
57585775}
57595776| a_expr IN ' (' in_expr ' )'
57605777{
5761- $$ = make4_str($1 , make1_str(" in (" ),$4 , make1_str(" )" ));
5778+ $$ = make4_str($1 , make1_str(" in (" ),$4 , make1_str(" )" ));
57625779}
57635780| a_expr NOT IN ' (' not_in_expr ' )'
57645781{
5765- $$ = make4_str($1 , make1_str(" not in (" ),$5 , make1_str(" )" ));
5782+ $$ = make4_str($1 , make1_str(" not in (" ),$5 , make1_str(" )" ));
57665783}
57675784| a_expr Op ' (' SubSelect ' )'
57685785{
@@ -5838,7 +5855,7 @@ ecpg_expr: attr opt_indirection
58385855}
58395856| a_expr Op ALL ' (' SubSelect ' )'
58405857{
5841- $$ =make3_str ($1 ,$2 , make3_str(make1_str(" all (" ),$5 , make1_str(" )" )));
5858+ $$ =cat3_str ($1 ,$2 , make3_str(make1_str(" all (" ),$5 , make1_str(" )" )));
58425859}
58435860| a_expr ' +' ALL ' (' SubSelect ' )'
58445861{
@@ -5878,6 +5895,8 @@ ecpg_expr: attr opt_indirection
58785895{$$ = cat3_str($1 , make1_str(" or" ),$3 ); }
58795896| NOT ecpg_expr
58805897{$$ = cat2_str(make1_str(" not" ),$2 ); }
5898+ | case_expr
5899+ {$$ =$1 ; }
58815900| civariableonly
58825901 {$$ =$1 ; }
58835902;