From: Alexander P. <ale...@us...> - 2003-03-01 19:19:26
|
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/jrd In directory sc8-pr-cvs1:/tmp/cvs-serv23880/jrd Modified Files: blr.h blrtable.cpp cmp.cpp exe.cpp ExecuteStatement.cpp nod.h par.cpp Log Message: Fixed EXECUTE STATEMENT to support INTO clause Index: blr.h =================================================================== RCS file: /cvsroot/firebird/firebird2/src/jrd/blr.h,v retrieving revision 1.9 retrieving revision 1.10 diff -b -U3 -r1.9 -r1.10 --- blr.h 15 Jan 2003 11:40:40 -0000 1.9 +++ blr.h 1 Mar 2003 19:19:21 -0000 1.10 @@ -291,5 +291,6 @@ /* This codes reuse BLR code space */ #define blr_post_arg (unsigned char)163 +#define blr_exec_into (unsigned char)164 #endif /* _JRD_BLR_H_ */ Index: blrtable.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/jrd/blrtable.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -b -U3 -r1.12 -r1.13 --- blrtable.cpp 13 Feb 2003 15:33:51 -0000 1.12 +++ blrtable.cpp 1 Mar 2003 19:19:21 -0000 1.13 @@ -91,6 +91,7 @@ PAIR(nod_post, blr_post, 2, 1, STATEMENT, VALUE), PAIR(nod_post, blr_post_arg, 2, 2, STATEMENT, VALUE), PAIR(nod_exec_sql, blr_exec_sql, 1, 1, STATEMENT, VALUE), + PAIR(nod_exec_into, blr_exec_into, 0, 0, STATEMENT, OTHER), PAIR(nod_internal_info, blr_internal_info, 1, 1, VALUE, VALUE), PAIR2(nod_add, blr_add, 2, 2, VALUE, VALUE), PAIR(nod_agg_count, blr_agg_count, 1, 0, VALUE, VALUE), Index: cmp.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/jrd/cmp.cpp,v retrieving revision 1.44 retrieving revision 1.45 diff -b -U3 -r1.44 -r1.45 --- cmp.cpp 27 Feb 2003 16:28:53 -0000 1.44 +++ cmp.cpp 1 Mar 2003 19:19:21 -0000 1.45 @@ -85,6 +85,7 @@ #include "../jrd/mov_proto.h" #include "../jrd/dsc_proto.h" #include "../jrd/dbg_proto.h" /* DBG_supervisor */ +#include "../jrd/ExecuteStatement.h" /* Pick up relation ids */ @@ -4717,6 +4718,10 @@ /* Check for syntax errors in the calculation */ CMP_get_desc(tdbb, csb, node->nod_arg[0], &descriptor_a); } + break; + + case nod_exec_into: + csb->csb_impure += sizeof(class ExecuteStatement); break; default: Index: exe.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/jrd/exe.cpp,v retrieving revision 1.44 retrieving revision 1.45 diff -b -U3 -r1.44 -r1.45 --- exe.cpp 14 Feb 2003 09:26:15 -0000 1.44 +++ exe.cpp 1 Mar 2003 19:19:21 -0000 1.45 @@ -103,6 +103,8 @@ #include "../jrd/vio_proto.h" #include "../jrd/isc_s_proto.h" +#include "../jrd/ExecuteStatement.h" + extern "C" { @@ -176,8 +178,6 @@ #define MAX_CLONES 1000 #endif -#define MAX_CALLBACKS 50 - #define ALL_TRIGS 0 #define PRE_TRIG 1 #define POST_TRIG 2 @@ -2397,6 +2397,31 @@ if (request->req_operation == jrd_req::req_evaluate) request->req_operation = jrd_req::req_return; node = node->nod_parent; + break; + + case nod_exec_into: + { + class ExecuteStatement * impure = + (class ExecuteStatement *) + ((SCHAR *) request + node->nod_impure); + switch (request->req_operation) { + case jrd_req::req_evaluate: + impure->Open(tdbb, node->nod_arg[0], node->nod_count - 2, + node->nod_arg[1] ? false : true); + case jrd_req::req_return: + case jrd_req::req_sync: + if (impure->Fetch(tdbb, &node->nod_arg[2])) { + request->req_operation = jrd_req::req_evaluate; + node = node->nod_arg[1]; + break; + } + request->req_operation = jrd_req::req_return; + default: + // if have active opened request - close it + impure->Close(tdbb); + node = node->nod_parent; + } + } break; case nod_post: Index: ExecuteStatement.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/jrd/ExecuteStatement.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -b -U3 -r1.1 -r1.2 --- ExecuteStatement.cpp 1 Mar 2003 18:27:33 -0000 1.1 +++ ExecuteStatement.cpp 1 Mar 2003 19:19:21 -0000 1.2 @@ -174,15 +174,18 @@ STATUS local[ISC_STATUS_LENGTH], *status = local; memset(local, 0, sizeof(local)); status = local; + tdbb->tdbb_transaction->tra_callback_count++; THREAD_EXIT; if (isc_dsql_fetch(status, &Statement, SQLDA_VERSION1, Sqlda) == 100) { isc_dsql_free_statement(status, &Statement, DSQL_drop); THREAD_ENTER; + tdbb->tdbb_transaction->tra_callback_count--; Statement = 0; return false; } THREAD_ENTER; + tdbb->tdbb_transaction->tra_callback_count--; if (status[0] == 1 && status[1]) { memcpy(tdbb->tdbb_status_vector, status, sizeof(local)); Firebird::status_exception::raise(status[1]); @@ -223,15 +226,18 @@ } if (SingleMode) { + tdbb->tdbb_transaction->tra_callback_count++; THREAD_EXIT; if (isc_dsql_fetch(status, &Statement, SQLDA_VERSION1, Sqlda) == 100) { isc_dsql_free_statement(status, &Statement, DSQL_drop); THREAD_ENTER; + tdbb->tdbb_transaction->tra_callback_count--; Statement = 0; return false; } THREAD_ENTER; + tdbb->tdbb_transaction->tra_callback_count--; if (! (status[0] == 1 && status[1])) { status[0] = gds_arg_gds; status[1] = gds_sing_select_err; @@ -245,10 +251,12 @@ void ExecuteStatement::Close(TDBB tdbb) { if (Statement) { + tdbb->tdbb_transaction->tra_callback_count++; THREAD_EXIT; // for a while don't check for errors while freeing statement isc_dsql_free_statement(0, &Statement, DSQL_drop); THREAD_ENTER; + tdbb->tdbb_transaction->tra_callback_count--; Statement = 0; } delete Sqlda; Index: nod.h =================================================================== RCS file: /cvsroot/firebird/firebird2/src/jrd/nod.h,v retrieving revision 1.6 retrieving revision 1.7 diff -b -U3 -r1.6 -r1.7 --- nod.h 18 Nov 2002 20:27:23 -0000 1.6 +++ nod.h 1 Mar 2003 19:19:21 -0000 1.7 @@ -200,3 +200,7 @@ /* Internal engine info */ NODE(nod_internal_info, internal_info, "INTERNAL INFO") + +/* EXECUTE VARCHAR INTO ...*/ + NODE(nod_exec_into, exec_sql_into, "EXECUTE VARCHAR INTO") + Index: par.cpp =================================================================== RCS file: /cvsroot/firebird/firebird2/src/jrd/par.cpp,v retrieving revision 1.38 retrieving revision 1.39 diff -b -U3 -r1.38 -r1.39 --- par.cpp 28 Feb 2003 12:57:12 -0000 1.38 +++ par.cpp 1 Mar 2003 19:19:21 -0000 1.39 @@ -2375,9 +2375,25 @@ case blr_agg_total_distinct: case blr_agg_average_distinct: case blr_post: - case blr_exec_sql: case blr_internal_info: *arg++ = parse(tdbb, csb, sub_type); + break; + + case blr_exec_sql: + *arg++ = parse(tdbb, csb, sub_type); + break; + + case blr_exec_into: + n = BLR_WORD + 2 /*e_exec_into_count - 1*/ ; + node = PAR_make_node(tdbb, n); + arg = node->nod_arg; + *arg++ = parse(tdbb, csb, VALUE); + if (BLR_BYTE) // singleton + *arg++ = 0; + else + *arg++ = parse(tdbb, csb, STATEMENT); + for (n=2/*e_exec_into_list*/; n<node->nod_count; n++) + *arg++ = parse(tdbb, csb, VALUE); break; case blr_post_arg: |