8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-23 07:23:04 +01:00

Bugfix CORE-5381: Regression: could not execute query (select from view

with nested view).
This commit is contained in:
Dmitry Yemanov 2016-10-25 16:30:42 +03:00
parent a3baf59a05
commit ff3e7cc9e3

View File

@ -1474,7 +1474,15 @@ static USHORT distribute_equalities(BoolExprNodeStack& org_stack, CompilerScratc
* operation '$'.
*
**************************************/
/*thread_db* tdbb = */JRD_get_thread_data();
// dimitr: Dumb protection against too many injected conjuncts (see CORE-5381).
// Ideally, we need two separate limits here:
// 1) number of injected conjuncts (affects required impure size)
// 2) number of input conjuncts (affects search time inside this routine)
const ULONG threshold = base_count * 2;
if (threshold > MAX_CONJUNCTS)
return 0;
ObjectsArray<ValueExprNodeStack> classes;
ObjectsArray<ValueExprNodeStack>::iterator eq_class;
@ -1565,7 +1573,7 @@ static USHORT distribute_equalities(BoolExprNodeStack& org_stack, CompilerScratc
cmpNode->arg1 = outer.object();
cmpNode->arg2 = inner.object();
if ((base_count + count < MAX_CONJUNCTS) && augment_stack(cmpNode, org_stack))
if (count < threshold && augment_stack(cmpNode, org_stack))
count++;
else
delete cmpNode;
@ -1636,8 +1644,10 @@ static USHORT distribute_equalities(BoolExprNodeStack& org_stack, CompilerScratc
// From the conjuncts X(A,B) and A=C, infer the conjunct X(C,B)
BoolExprNode* newNode = make_inference_node(csb, boolean, arg1, arg2);
if ((base_count + count < MAX_CONJUNCTS) && augment_stack(newNode, org_stack))
if (count < threshold && augment_stack(newNode, org_stack))
++count;
else
delete newNode;
}
}