From: Alexander P. <ale...@us...> - 2003-03-01 19:19:28
|
Build Version : T1.5.0.2755 Firebird 1.5 Beta 3 (writeBuildNum.sh,v 1.2741 2003/03/01 19:19:23 alexpeshkoff ) Update of /cvsroot/firebird/firebird2/src/dsql In directory sc8-pr-cvs1:/tmp/cvs-serv23880/dsql Modified Files: dsql.cpp gen.cpp node.h parse.y pass1.cpp Log Message: Fixed EXECUTE STATEMENT to support INTO clause Index: dsql.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/dsql/dsql.cpp,v retrieving revision 1.48 retrieving revision 1.49 diff -b -U3 -r1.48 -r1.49 --- dsql.cpp 15 Feb 2003 03:01:50 -0000 1.48 +++ dsql.cpp 1 Mar 2003 19:19:22 -0000 1.49 @@ -924,6 +924,31 @@ } +WHY_DBB GetWhyAttachment (STATUS* status, + class att* jrd_attachment_handle) +{ + DBB database; + + THREAD_EXIT; + THD_MUTEX_LOCK (&databases_mutex); + for (database = databases; database; database = database->dbb_next) + { + if (database->dbb_database_handle->handle.h_dbb == jrd_attachment_handle) + { + break; + } + } + if (! database) { + status[0] = gds_arg_gds; + status[1] = gds_bad_db_handle; + status[2] = gds_arg_end; + } + THD_MUTEX_UNLOCK (&databases_mutex); + THREAD_ENTER; + return database ? database->dbb_database_handle : 0; +} + + /** dsql_fetch Index: gen.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/dsql/gen.cpp,v retrieving revision 1.28 retrieving revision 1.29 diff -b -U3 -r1.28 -r1.29 --- gen.cpp 26 Feb 2003 23:41:00 -0000 1.28 +++ gen.cpp 1 Mar 2003 19:19:22 -0000 1.29 @@ -1014,7 +1014,23 @@ case nod_exec_sql: STUFF(blr_exec_sql); - GEN_expr(request, node->nod_arg[e_exec_vc]); + GEN_expr(request, node->nod_arg[e_exec_sql_stmnt]); + return; + + case nod_exec_into: + STUFF(blr_exec_into); + temp = node->nod_arg[e_exec_into_list]; + STUFF_WORD(temp->nod_count); + GEN_expr(request, node->nod_arg[e_exec_into_stmnt]); + if (node->nod_arg[e_exec_into_block]) { + STUFF(0); // Non-singleton + GEN_statement(request, node->nod_arg[e_exec_into_block]); + } + else + STUFF(1); // Singleton + for (ptr = temp->nod_arg, end = ptr + temp->nod_count; + ptr < end; ptr++) + GEN_expr(request, *ptr); return; case nod_return: Index: node.h =================================================================== RCS file: /cvsroot/firebird/firebird2/src/dsql/node.h,v retrieving revision 1.20 retrieving revision 1.21 diff -b -U3 -r1.20 -r1.21 --- node.h 12 Feb 2003 19:28:10 -0000 1.20 +++ node.h 1 Mar 2003 19:19:22 -0000 1.21 @@ -315,7 +315,7 @@ nod_udf_param, /* there should be a way to signal a param by descriptor! */ nod_limit, /* limit support */ nod_redef_procedure, /* allows silent creation/overwriting of a procedure. */ - nod_exec_sql, /* EXECUTE VARCHAR */ + nod_exec_sql, /* EXECUTE STATEMENT */ nod_internal_info, /* internal engine info */ nod_searched_case, /* searched CASE function */ nod_simple_case, /* simple CASE function */ @@ -328,7 +328,8 @@ nod_for_update, /* FOR UPDATE clause */ nod_user_savepoint, /* Savepoints support */ nod_undo_savepoint, - nod_label /* label support */ + nod_label, /* label support */ + nod_exec_into /* EXECUTE STATEMENT INTO */ } NOD_TYPE; @@ -449,8 +450,13 @@ #define e_pst_argument 1 #define e_pst_count 2 -#define e_exec_vc 0 /* nod_exec_sql */ -#define e_exec_vc_count 1 +#define e_exec_sql_stmnt 0 /* nod_exec_sql */ +#define e_exec_sql_count 1 + +#define e_exec_into_stmnt 0 /* nod_exec_into */ +#define e_exec_into_block 1 +#define e_exec_into_list 2 +#define e_exec_into_count 3 #define e_internal_info 0 /* nod_internal_info */ #define e_internal_info_count 1 Index: parse.y =================================================================== RCS file: /cvsroot/firebird/firebird2/src/dsql/parse.y,v retrieving revision 1.57 retrieving revision 1.58 diff -b -U3 -r1.57 -r1.58 --- parse.y 24 Feb 2003 09:37:52 -0000 1.57 +++ parse.y 1 Mar 2003 19:19:22 -0000 1.58 @@ -1498,6 +1498,8 @@ | singleton_select | update ';' | while + | for_exec_into + | exec_into | SUSPEND ';' { $$ = make_node (nod_return, e_rtn_count, NULL); } | EXIT ';' @@ -1524,7 +1526,7 @@ ; exec_sql : EXECUTE varstate value ';' - { $$ = make_node (nod_exec_sql, e_exec_vc_count, $3); } + { $$ = make_node (nod_exec_sql, e_exec_sql_count, $3); } ; varstate : VARCHAR | STATEMENT ; @@ -1532,6 +1534,16 @@ for_select : FOR select INTO variable_list cursor_def DO proc_block { $$ = make_node (nod_for_select, e_flp_count, $2, make_list ($4), $5, $7, NULL); } + ; + +for_exec_into : FOR EXECUTE varstate value INTO variable_list DO proc_block + { + $$ = make_node (nod_exec_into, e_exec_into_count, $4, $8, make_list($6)); } + ; + +exec_into : EXECUTE varstate value INTO variable_list ';' + { + $$ = make_node (nod_exec_into, e_exec_into_count, $3, 0, make_list($5)); } ; if_then_else : IF '(' search_condition ')' THEN proc_block ELSE proc_block Index: pass1.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/dsql/pass1.cpp,v retrieving revision 1.52 retrieving revision 1.53 diff -b -U3 -r1.52 -r1.53 --- pass1.cpp 23 Feb 2003 01:36:22 -0000 1.52 +++ pass1.cpp 1 Mar 2003 19:19:23 -0000 1.53 @@ -1308,8 +1308,23 @@ case nod_exec_sql: node = MAKE_node(input->nod_type, input->nod_count); - node->nod_arg[e_exec_vc] = PASS1_node(request, - input->nod_arg[e_exec_vc], + node->nod_arg[e_exec_sql_stmnt] = PASS1_node(request, + input->nod_arg[e_exec_sql_stmnt], + proc_flag); + return node; + + case nod_exec_into: + node = MAKE_node(input->nod_type, input->nod_count); + node->nod_arg[e_exec_into_stmnt] = PASS1_node(request, + input->nod_arg[e_exec_into_stmnt], + proc_flag); + node->nod_arg[e_exec_into_block] = input->nod_arg[e_exec_into_block] ? + PASS1_statement(request, + input->nod_arg[e_exec_into_block], + proc_flag) : + 0; + node->nod_arg[e_exec_into_list] = PASS1_node(request, + input->nod_arg[e_exec_into_list], proc_flag); return node; |