From: <asf...@us...> - 2010-08-07 02:49:31
|
Revision: 51408 http://firebird.svn.sourceforge.net/firebird/?rev=51408&view=rev Author: asfernandes Date: 2010-08-07 02:49:25 +0000 (Sat, 07 Aug 2010) Log Message: ----------- Correction for CORE-3090 Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2010-08-07 02:44:39 UTC (rev 51407) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2010-08-07 02:49:25 UTC (rev 51408) @@ -4890,6 +4890,8 @@ foundSubSelect = pass1_found_sub_select(query->nod_arg[e_qry_list]); } + int unionContexts = 0; + if (foundSubSelect) { DsqlContextStack::const_iterator baseUnion(statement->req_union_context); @@ -4904,6 +4906,7 @@ ++i) { temp.push(i.object()); + ++unionContexts; } } else @@ -4916,11 +4919,15 @@ // Also add the used contexts into the childs stack. while (temp.hasData() && (temp.object() != baseContext)) { - dsql_ctx* childCtx = temp.object(); + dsql_ctx* childCtx = temp.pop(); - statement->req_dt_context.push(childCtx); - context->ctx_childs_derived_table.push(temp.pop()); + // Do not put the just pushed union contexts in req_dt_context. Otherwise duplicate + // records will appear in RDB$VIEW_RELATIONS. + if (--unionContexts < 0) + statement->req_dt_context.push(childCtx); + context->ctx_childs_derived_table.push(childCtx); + // Collect contexts that will be used for blr_derived_expr generation. // We want all child contexts with minimum ctx_in_outer_join. if (childCtx->ctx_in_outer_join <= minOuterJoin) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2010-10-06 15:39:15
|
Revision: 51635 http://firebird.svn.sourceforge.net/firebird/?rev=51635&view=rev Author: asfernandes Date: 2010-10-06 15:39:08 +0000 (Wed, 06 Oct 2010) Log Message: ----------- Fixed CORE-3164 - Parameterized requests involving blob fields fails when connected using charset UTF8 Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2010-10-06 15:25:50 UTC (rev 51634) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2010-10-06 15:39:08 UTC (rev 51635) @@ -10505,11 +10505,15 @@ } else if (parameter->par_desc.dsc_dtype > dtype_any_text) { + const USHORT toCharSetBPC = METD_get_charset_bpc( + statement, att->att_charset); + // The LIKE & similar parameters must be varchar type // strings - so force this parameter to be varchar // and take a guess at a good length for it. parameter->par_desc.dsc_dtype = dtype_varying; - parameter->par_desc.dsc_length = LIKE_PARAM_LEN + sizeof(USHORT); + parameter->par_desc.dsc_length = LIKE_PARAM_LEN * toCharSetBPC + + sizeof(USHORT); parameter->par_desc.dsc_sub_type = 0; parameter->par_desc.dsc_scale = 0; parameter->par_desc.dsc_ttype() = ttype_dynamic; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2010-11-13 06:34:24
|
Revision: 51906 http://firebird.svn.sourceforge.net/firebird/?rev=51906&view=rev Author: dimitr Date: 2010-11-13 06:34:17 +0000 (Sat, 13 Nov 2010) Log Message: ----------- Backport CORE-2812: Prohibit any improper mixture of explicit and implicit joins. Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2010-11-13 03:17:09 UTC (rev 51905) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2010-11-13 06:34:17 UTC (rev 51906) @@ -6512,6 +6512,12 @@ DEV_BLKCHK(statement, dsql_type_req); DEV_BLKCHK(input, dsql_type_nod); + // Set up an empty context to process the joins + + DsqlContextStack* const base_context = statement->req_context; + DsqlContextStack temp; + statement->req_context = &temp; + dsql_nod* const node = MAKE_node(input->nod_type, input->nod_count); // First process type @@ -6746,6 +6752,15 @@ node->nod_arg[e_join_boolean] = PASS1_node(statement, boolean); + // Merge the newly created contexts with the original ones + + while (temp.hasData()) + { + base_context->push(temp.pop()); + } + + statement->req_context = base_context; + return node; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2011-01-20 04:39:24
|
Revision: 52166 http://firebird.svn.sourceforge.net/firebird/?rev=52166&view=rev Author: dimitr Date: 2011-01-20 04:39:18 +0000 (Thu, 20 Jan 2011) Log Message: ----------- Fixed CORE-3311: Error "data type unknown" while preparing UPDATE/DELETE statements with the parameterized ROWS clause. Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2011-01-20 03:36:37 UTC (rev 52165) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2011-01-20 04:39:18 UTC (rev 52166) @@ -244,6 +244,7 @@ static dsql_nod* pass1_insert(CompiledStatement*, dsql_nod*, bool); static dsql_nod* pass1_join(CompiledStatement*, dsql_nod*); static dsql_nod* pass1_label(CompiledStatement*, dsql_nod*); +static void pass1_limit(CompiledStatement*, dsql_nod*, dsql_nod*); static dsql_nod* pass1_lookup_alias(CompiledStatement*, const dsql_str*, dsql_nod*, bool); static dsql_nod* pass1_make_derived_field(CompiledStatement*, thread_db*, dsql_nod*); static dsql_nod* pass1_merge(CompiledStatement*, dsql_nod*); @@ -4329,8 +4330,7 @@ } if ( (temp = input->nod_arg[e_del_rows]) ) { - rse->nod_arg[e_rse_first] = pass1_node_psql(statement, temp->nod_arg[e_rows_length], false); - rse->nod_arg[e_rse_skip] = pass1_node_psql(statement, temp->nod_arg[e_rows_skip], false); + pass1_limit(statement, temp, rse); } if (input->nod_arg[e_del_return]) @@ -6901,6 +6901,57 @@ /** + pass1_limit + + @brief Process the limit clause (FIRST/SKIP/ROWS) + + + @param statement + @param input + @param output + + **/ +static void pass1_limit(CompiledStatement* statement, dsql_nod* input, dsql_nod* output) +{ + DEV_BLKCHK(statement, dsql_type_req); + DEV_BLKCHK(input, dsql_type_nod); + DEV_BLKCHK(output, dsql_type_nod); + + dsql_nod *first, *skip; + + if (input->nod_type == nod_limit) + { + first = input->nod_arg[e_limit_length]; + skip = input->nod_arg[e_limit_skip]; + } + else if (input->nod_type == nod_rows) + { + first = input->nod_arg[e_rows_length]; + skip = input->nod_arg[e_rows_skip]; + } + else + { + fb_assert(false); + } + + if (first) + { + dsql_nod* const sub = pass1_node_psql(statement, first, false); + output->nod_arg[e_rse_first] = sub; + set_parameter_type(statement, sub, input, false); + } + + if (skip) + { + dsql_nod* const sub = pass1_node_psql(statement, skip, false); + output->nod_arg[e_rse_skip] = sub; + set_parameter_type(statement, sub, input, false); + } +} + + +/** + pass1_lookup_alias @brief Lookup a matching item in the select list. @@ -8051,19 +8102,7 @@ } else if (node || (node = rows) ) { - const int length_index = rows ? e_rows_length : e_limit_length; - const int skip_index = rows ? e_rows_skip : e_limit_skip; - - if (node->nod_arg[length_index]) { - dsql_nod* sub = pass1_node_psql(statement, node->nod_arg[length_index], false); - rse->nod_arg[e_rse_first] = sub; - set_parameter_type(statement, sub, node, false); - } - if (node->nod_arg[skip_index]) { - dsql_nod* sub = pass1_node_psql(statement, node->nod_arg[skip_index], false); - rse->nod_arg[e_rse_skip] = sub; - set_parameter_type(statement, sub, node, false); - } + pass1_limit(statement, node, rse); } // Process boolean, if any @@ -8991,16 +9030,7 @@ if (rows) { - if (rows->nod_arg[e_rows_length]) { - dsql_nod* sub = pass1_node_psql(statement, rows->nod_arg[e_rows_length], false); - union_rse->nod_arg[e_rse_first] = sub; - set_parameter_type(statement, sub, rows, false); - } - if (rows->nod_arg[e_rows_skip]) { - dsql_nod* sub = pass1_node_psql(statement, rows->nod_arg[e_rows_skip], false); - union_rse->nod_arg[e_rse_skip] = sub; - set_parameter_type(statement, sub, rows, false); - } + pass1_limit(statement, rows, union_rse); } // PROJECT on all the select items unless UNION ALL was specified. @@ -9354,8 +9384,7 @@ } if ( (temp = input->nod_arg[e_upd_rows]) ) { - rse->nod_arg[e_rse_first] = pass1_node_psql(statement, temp->nod_arg[e_rows_length], false); - rse->nod_arg[e_rse_skip] = pass1_node_psql(statement, temp->nod_arg[e_rows_skip], false); + pass1_limit(statement, temp, rse); } if (input->nod_arg[e_upd_return]) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2011-01-30 14:31:16
|
Revision: 52231 http://firebird.svn.sourceforge.net/firebird/?rev=52231&view=rev Author: asfernandes Date: 2011-01-30 14:31:10 +0000 (Sun, 30 Jan 2011) Log Message: ----------- Backported fix for CORE-3320 - Some MERGE syntax can crash the server. Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2011-01-30 01:17:41 UTC (rev 52230) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2011-01-30 14:31:10 UTC (rev 52231) @@ -210,6 +210,7 @@ static dsql_par* find_dbkey(const CompiledStatement*, const dsql_nod*); static dsql_par* find_record_version(const CompiledStatement*, const dsql_nod*); static dsql_ctx* get_context(const dsql_nod* node); +static void get_contexts(DsqlContextStack& contexts, const dsql_nod* node); #ifdef NOT_USED_OR_REPLACED static bool get_object_and_field(const dsql_nod* node, const char** obj_name, const char** fld_name, bool do_collation); @@ -2866,16 +2867,7 @@ } -/** - - get_context - - @brief Get the context of a relation or derived table. - - - @param node - - **/ +// Get the context of a relation, procedure or derived table. static dsql_ctx* get_context(const dsql_nod* node) { fb_assert(node->nod_type == nod_relation || node->nod_type == nod_derived_table); @@ -2888,6 +2880,25 @@ } +// Get the contexts of a relation, procedure, derived table or a list of joins. +static void get_contexts(DsqlContextStack& contexts, const dsql_nod* node) +{ + if (node->nod_type == nod_relation) + contexts.push((dsql_ctx*) node->nod_arg[e_rel_context]); + else if (node->nod_type == nod_derived_table) + contexts.push((dsql_ctx*) node->nod_arg[e_derived_table_context]); + else if (node->nod_type == nod_join) + { + get_contexts(contexts, node->nod_arg[e_join_left_rel]); + get_contexts(contexts, node->nod_arg[e_join_rght_rel]); + } + else + { + fb_assert(false); + } +} + + #ifdef NOT_USED_OR_REPLACED /** @@ -7228,6 +7239,9 @@ dsql_nod* modify = NULL; + DsqlContextStack usingCtxs; + get_contexts(usingCtxs, source); + if (input->nod_arg[e_mrg_when]->nod_arg[e_mrg_when_matched]) { // get the assignments of the UPDATE statement @@ -7254,7 +7268,10 @@ modify->nod_arg[e_mdc_context] = (dsql_nod*) context; statement->req_scope_level++; // go to the same level of source and target contexts - statement->req_context->push(get_context(source)); // push the USING context + + for (DsqlContextStack::iterator itr(usingCtxs); itr.hasData(); ++itr) + statement->req_context->push(itr.object()); // push the USING contexts + statement->req_context->push(context); // process old context values for (ptr = org_values.begin(); ptr < org_values.end(); ++ptr) @@ -7299,8 +7316,10 @@ if (input->nod_arg[e_mrg_when]->nod_arg[e_mrg_when_not_matched]) { statement->req_scope_level++; // go to the same level of the source context - statement->req_context->push(get_context(source)); // push the USING context + for (DsqlContextStack::iterator itr(usingCtxs); itr.hasData(); ++itr) + statement->req_context->push(itr.object()); // push the USING contexts + // the INSERT relation should be processed in a higher level than the source context statement->req_scope_level++; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hv...@us...> - 2011-12-05 13:08:41
|
Revision: 53666 http://firebird.svn.sourceforge.net/firebird/?rev=53666&view=rev Author: hvlad Date: 2011-12-05 13:08:34 +0000 (Mon, 05 Dec 2011) Log Message: ----------- Fixed bug CORE-3690 : Wrong warning message for ambiguous query Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2011-12-05 13:06:30 UTC (rev 53665) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2011-12-05 13:08:34 UTC (rev 53666) @@ -2437,7 +2437,7 @@ ERRD_post_warning(Arg::Warning(isc_sqlwarn) << Arg::Num(204) << Arg::Warning(isc_dsql_ambiguous_field_name) << Arg::Str(buffer) << Arg::Str(++p) << - Arg::Gds(isc_random) << Arg::Str(name->str_data)); + Arg::Warning(isc_random) << Arg::Str(name->str_data)); return node; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2012-04-04 11:00:20
|
Revision: 54309 http://firebird.svn.sourceforge.net/firebird/?rev=54309&view=rev Author: dimitr Date: 2012-04-04 11:00:14 +0000 (Wed, 04 Apr 2012) Log Message: ----------- Fixed CORE-3807: Error "Invalid expression in the select list" can be unexpectedly raised if a string literal is used inside a GROUP BY clause in a multi-byte connection. Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2012-04-04 10:59:35 UTC (rev 54308) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2012-04-04 11:00:14 UTC (rev 54309) @@ -3412,8 +3412,11 @@ { return false; } - return !memcmp(node1->nod_desc.dsc_address, node2->nod_desc.dsc_address, - node1->nod_desc.dsc_length); + { // scope for the local vars + const dsql_str* const string1 = (dsql_str*) node1->nod_arg[0]; + const dsql_str* const string2 = (dsql_str*) node2->nod_arg[0]; + return !memcmp(string1->str_data, string2->str_data, string1->str_length); + } case nod_map: { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2012-04-05 09:48:13
|
Revision: 54315 http://firebird.svn.sourceforge.net/firebird/?rev=54315&view=rev Author: dimitr Date: 2012-04-05 09:48:04 +0000 (Thu, 05 Apr 2012) Log Message: ----------- Fixed my yesterday's commit. Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2012-04-05 05:49:25 UTC (rev 54314) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2012-04-05 09:48:04 UTC (rev 54315) @@ -3413,9 +3413,9 @@ return false; } { // scope for the local vars - const dsql_str* const string1 = (dsql_str*) node1->nod_arg[0]; - const dsql_str* const string2 = (dsql_str*) node2->nod_arg[0]; - return !memcmp(string1->str_data, string2->str_data, string1->str_length); + const USHORT len = (node1->nod_desc.dsc_dtype == dtype_text) ? + ((dsql_str*) node1->nod_arg[0])->str_length : node1->nod_desc.dsc_length; + return !memcmp(node1->nod_desc.dsc_address, node2->nod_desc.dsc_address, len); } case nod_map: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2012-04-13 09:09:14
|
Revision: 54376 http://firebird.svn.sourceforge.net/firebird/?rev=54376&view=rev Author: dimitr Date: 2012-04-13 09:09:08 +0000 (Fri, 13 Apr 2012) Log Message: ----------- Additional fix for CORE-3807. Otherwise, _utf8 'A' is considered equal to _win1251 'ABCD' etc. The original code didn't check for charsets/collations but IMHO this was wrong. Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2012-04-13 09:08:35 UTC (rev 54375) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2012-04-13 09:09:08 UTC (rev 54376) @@ -3406,12 +3406,9 @@ return true; case nod_constant: - if (node1->nod_desc.dsc_dtype != node2->nod_desc.dsc_dtype || - node1->nod_desc.dsc_length != node2->nod_desc.dsc_length || - node1->nod_desc.dsc_scale != node2->nod_desc.dsc_scale) - { + if (!DSC_EQUIV(&node1->nod_desc, &node2->nod_desc, true)) return false; - } + { // scope for the local vars const USHORT len = (node1->nod_desc.dsc_dtype == dtype_text) ? ((dsql_str*) node1->nod_arg[0])->str_length : node1->nod_desc.dsc_length; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2012-04-27 16:31:33
|
Revision: 54428 http://firebird.svn.sourceforge.net/firebird/?rev=54428&view=rev Author: dimitr Date: 2012-04-27 16:31:24 +0000 (Fri, 27 Apr 2012) Log Message: ----------- Fixed CORE-3834: Usage of a NATURAL JOIN with a derived table crashes the server. Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2012-04-27 16:30:05 UTC (rev 54427) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2012-04-27 16:31:24 UTC (rev 54428) @@ -6720,7 +6720,7 @@ coalesce->nod_arg[1] = MAKE_list(stack); impJoinLeft->value = MAKE_node(nod_alias, e_alias_count); - impJoinLeft->value->nod_arg[e_alias_value] = coalesce; + impJoinLeft->value->nod_arg[e_alias_value] = PASS1_node(statement, coalesce); impJoinLeft->value->nod_arg[e_alias_alias] = reinterpret_cast<dsql_nod*>(fldName); impJoinLeft->value->nod_arg[e_alias_imp_join] = reinterpret_cast<dsql_nod*>(impJoinLeft); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2012-05-14 15:18:47
|
Revision: 54481 http://firebird.svn.sourceforge.net/firebird/?rev=54481&view=rev Author: asfernandes Date: 2012-05-14 15:18:40 +0000 (Mon, 14 May 2012) Log Message: ----------- Backport fix for CORE-3611 - Wrong data while retrieving from CTEs (or derived tables) with same column names. Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2012-05-13 03:33:49 UTC (rev 54480) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2012-05-14 15:18:40 UTC (rev 54481) @@ -3339,9 +3339,9 @@ { if ((node1->nod_type == nod_derived_field) && (node2->nod_type == nod_derived_field)) { - const USHORT scope_level1 = (USHORT)(U_IPTR)node1->nod_arg[e_derived_field_scope]; - const USHORT scope_level2 = (USHORT)(U_IPTR)node2->nod_arg[e_derived_field_scope]; - if (scope_level1 != scope_level2) + const dsql_ctx* context1 = (dsql_ctx*) node1->nod_arg[e_derived_field_context]; + const dsql_ctx* context2 = (dsql_ctx*) node2->nod_arg[e_derived_field_context]; + if (context1->ctx_context != context2->ctx_context) return false; const dsql_str* alias1 = (dsql_str*) node1->nod_arg[e_derived_field_name]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2013-05-09 01:17:28
|
Revision: 58050 http://sourceforge.net/p/firebird/code/58050 Author: asfernandes Date: 2013-05-09 01:17:24 +0000 (Thu, 09 May 2013) Log Message: ----------- Backported fix for CORE-4083 - Full outer join in derived table with coalesce (iif). Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2013-05-09 00:35:36 UTC (rev 58049) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2013-05-09 01:17:24 UTC (rev 58050) @@ -4909,8 +4909,6 @@ else rse = PASS1_rse(statement, select_expr, NULL); - USHORT minOuterJoin = MAX_USHORT; - // Finish off by cleaning up contexts and put them into req_dt_context // so create view (ddl) can deal with it. // Also add the used contexts into the childs stack. @@ -4922,23 +4920,7 @@ context->ctx_childs_derived_table.push(childCtx); // Collect contexts that will be used for blr_derived_expr generation. - // We want all child contexts with minimum ctx_in_outer_join. - if (childCtx->ctx_in_outer_join <= minOuterJoin) - { - DsqlContextStack contexts; - pass1_expand_contexts(contexts, childCtx); - - for (DsqlContextStack::iterator i(contexts); i.hasData(); ++i) - { - if (i.object()->ctx_in_outer_join < minOuterJoin) - { - minOuterJoin = i.object()->ctx_in_outer_join; - context->ctx_main_derived_contexts.clear(); - } - - context->ctx_main_derived_contexts.push(i.object()); - } - } + pass1_expand_contexts(context->ctx_main_derived_contexts, childCtx); } while (temp.hasData()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2013-05-29 12:13:57
|
Revision: 58110 http://sourceforge.net/p/firebird/code/58110 Author: dimitr Date: 2013-05-29 12:13:55 +0000 (Wed, 29 May 2013) Log Message: ----------- Fixed CORE-4107: Wrong resultset (subquery + derived table + union). Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2013-05-28 20:54:26 UTC (rev 58109) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2013-05-29 12:13:55 UTC (rev 58110) @@ -2234,6 +2234,13 @@ } return aggregate; + case nod_derived_table: + if (!ignore_sub_selects) { + aggregate = aggregate_found2(statement, node->nod_arg[e_derived_table_rse], current_level, + deepest_level, ignore_sub_selects); + } + return aggregate; + case nod_rse: ++*current_level; aggregate |= aggregate_found2(statement, node->nod_arg[e_rse_streams], current_level, @@ -2303,6 +2310,7 @@ case nod_join_left: case nod_join_right: case nod_join_full: + case nod_union: { const dsql_nod* const* ptr = node->nod_arg; for (const dsql_nod* const* const end = ptr + node->nod_count; ptr < end; ++ptr) @@ -3176,6 +3184,7 @@ case nod_join_right: case nod_join_full: case nod_list: + case nod_union: { const dsql_nod* const* ptr = node->nod_arg; for (const dsql_nod* const* const end = ptr + node->nod_count; ptr < end; ptr++) @@ -3208,6 +3217,11 @@ list, inside_own_map, inside_higher_map); break; + case nod_derived_table: + invalid |= invalid_reference(context, node->nod_arg[e_derived_table_rse], + list, inside_own_map, inside_higher_map); + break; + case nod_relation: { const dsql_ctx* lrelation_context = reinterpret_cast<dsql_ctx*>(node->nod_arg[e_rel_context]); @@ -3231,7 +3245,6 @@ case nod_current_role: case nod_internal_info: case nod_dom_value: - case nod_derived_table: case nod_plan_expr: return false; @@ -5711,6 +5724,7 @@ case nod_join_left: case nod_join_right: case nod_join_full: + case nod_union: { const dsql_nod* const* ptr = node->nod_arg; for (const dsql_nod* const* const end = ptr + node->nod_count; ptr < end; ++ptr) @@ -6146,6 +6160,7 @@ case nod_join_left: case nod_join_right: case nod_join_full: + case nod_union: { const dsql_nod* const* ptr = node->nod_arg; for (const dsql_nod* const* const end = ptr + node->nod_count; ptr < end; ++ptr) @@ -10122,6 +10137,7 @@ case nod_join_left: case nod_join_right: case nod_join_full: + case nod_union: { dsql_nod** ptr = field->nod_arg; for (const dsql_nod* const* const end = ptr + field->nod_count; ptr < end; ptr++) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <asf...@us...> - 2013-09-10 14:53:01
|
Revision: 58599 http://sourceforge.net/p/firebird/code/58599 Author: asfernandes Date: 2013-09-10 14:52:59 +0000 (Tue, 10 Sep 2013) Log Message: ----------- Fixed CORE-4204 - Error when compiling the procedure containing the statement if (x = (select ...)). Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2013-09-10 14:37:06 UTC (rev 58598) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2013-09-10 14:52:59 UTC (rev 58599) @@ -916,7 +916,7 @@ { const DsqlContextStack::iterator base(*statement->req_context); node = MAKE_node(input->nod_type, 2); - node->nod_arg[0] = pass1_node_psql(statement, input->nod_arg[0], false); + node->nod_arg[0] = PASS1_node(statement, input->nod_arg[0]); dsql_nod* temp = MAKE_node(nod_via, e_via_count); node->nod_arg[1] = temp; dsql_nod* rse = PASS1_rse(statement, sub2, NULL); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2015-07-09 15:37:35
|
Revision: 61955 http://sourceforge.net/p/firebird/code/61955 Author: dimitr Date: 2015-07-09 15:37:32 +0000 (Thu, 09 Jul 2015) Log Message: ----------- Fixed CORE-4867: Server crash when preparing a query with PLAN clause at some CTE. Modified Paths: -------------- firebird/branches/B2_5_Release/src/dsql/pass1.cpp Modified: firebird/branches/B2_5_Release/src/dsql/pass1.cpp =================================================================== --- firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2015-07-09 00:13:45 UTC (rev 61954) +++ firebird/branches/B2_5_Release/src/dsql/pass1.cpp 2015-07-09 15:37:32 UTC (rev 61955) @@ -3515,6 +3515,73 @@ return node_match(node1->nod_arg[e_derived_table_rse], node2->nod_arg[e_derived_table_rse], ignore_map_cast); } + + case nod_index: + { + node1 = node1->nod_arg[0]; + node2 = node2->nod_arg[0]; + + if (node1->nod_type != nod_list || node2->nod_type != nod_list) + return false; + + if (node1->nod_count != node2->nod_count) + return false; + + for (USHORT i = 0; i < node1->nod_count; i++) + { + const dsql_str* const index1 = (dsql_str*) node1->nod_arg[i]; + const dsql_str* const index2 = (dsql_str*) node2->nod_arg[i]; + + if (index1->str_length != index2->str_length || + strcmp(index1->str_data, index2->str_data)) + { + return false; + } + } + + return true; + } + + case nod_index_order: + { + const dsql_str* index1 = (dsql_str*) node1->nod_arg[0]; + const dsql_str* index2 = (dsql_str*) node2->nod_arg[0]; + + if (index1->str_length != index2->str_length || + strcmp(index1->str_data, index2->str_data)) + { + return false; + } + + if (!node1->nod_arg[1] && !node2->nod_arg[1]) + return true; + + if (!node1->nod_arg[1] || !node2->nod_arg[1]) + return false; + + node1 = node1->nod_arg[1]; + node2 = node2->nod_arg[1]; + + if (node1->nod_type != nod_list || node2->nod_type != nod_list) + return false; + + if (node1->nod_count != node2->nod_count) + return false; + + for (USHORT i = 0; i < node1->nod_count; i++) + { + index1 = (dsql_str*) node1->nod_arg[i]; + index2 = (dsql_str*) node2->nod_arg[i]; + + if (index1->str_length != index2->str_length || + strcmp(index1->str_data, index2->str_data)) + { + return false; + } + } + + return true; + } } // switch const dsql_nod* const* ptr1 = node1->nod_arg; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |