mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-24 03:23:03 +01:00
Optimizer adjustments for the new built-in functions.
This commit is contained in:
parent
786d4fe4b2
commit
de7d3f7e95
@ -476,8 +476,8 @@ RecordSource* OPT_compile(thread_db* tdbb,
|
|||||||
NodeStack deliverStack;
|
NodeStack deliverStack;
|
||||||
|
|
||||||
if (rse->rse_jointype != blr_inner) {
|
if (rse->rse_jointype != blr_inner) {
|
||||||
// Make list of nodes that can be delivered to a outer-stream.
|
// Make list of nodes that can be delivered to an outer-stream.
|
||||||
// In fact this are all nodes except when a IS NULL (nod_missing)
|
// In fact these are all nodes except when a IS NULL (nod_missing)
|
||||||
// comparision is done.
|
// comparision is done.
|
||||||
// Note! Don't forget that this can be burried inside a expression
|
// Note! Don't forget that this can be burried inside a expression
|
||||||
// such as "CASE WHEN (FieldX IS NULL) THEN 0 ELSE 1 END = 0"
|
// such as "CASE WHEN (FieldX IS NULL) THEN 0 ELSE 1 END = 0"
|
||||||
@ -621,7 +621,7 @@ RecordSource* OPT_compile(thread_db* tdbb,
|
|||||||
// opt_rpt[0..opt_conjuncts_count-1] = all conjunctions
|
// opt_rpt[0..opt_conjuncts_count-1] = all conjunctions
|
||||||
//
|
//
|
||||||
// allowed = booleans that can never evaluate to NULL/Unknown or turn
|
// allowed = booleans that can never evaluate to NULL/Unknown or turn
|
||||||
// NULL/Unkown into a True or False.
|
// NULL/Unknown into a True or False.
|
||||||
SLONG distributed_count = 0;
|
SLONG distributed_count = 0;
|
||||||
NodeStack missingStack;
|
NodeStack missingStack;
|
||||||
if (parent_stack && parent_stack->getCount())
|
if (parent_stack && parent_stack->getCount())
|
||||||
@ -2851,6 +2851,7 @@ static bool expression_possible_unknown(const jrd_nod* node)
|
|||||||
case nod_lowcase:
|
case nod_lowcase:
|
||||||
case nod_substr:
|
case nod_substr:
|
||||||
case nod_trim:
|
case nod_trim:
|
||||||
|
case nod_sys_function:
|
||||||
|
|
||||||
case nod_like:
|
case nod_like:
|
||||||
case nod_between:
|
case nod_between:
|
||||||
@ -3037,6 +3038,7 @@ static bool expression_contains_stream(CompilerScratch* csb,
|
|||||||
case nod_lowcase:
|
case nod_lowcase:
|
||||||
case nod_substr:
|
case nod_substr:
|
||||||
case nod_trim:
|
case nod_trim:
|
||||||
|
case nod_sys_function:
|
||||||
|
|
||||||
case nod_like:
|
case nod_like:
|
||||||
case nod_between:
|
case nod_between:
|
||||||
@ -5987,6 +5989,7 @@ static void get_expression_streams(const jrd_nod* node,
|
|||||||
case nod_lowcase:
|
case nod_lowcase:
|
||||||
case nod_substr:
|
case nod_substr:
|
||||||
case nod_trim:
|
case nod_trim:
|
||||||
|
case nod_sys_function:
|
||||||
|
|
||||||
case nod_like:
|
case nod_like:
|
||||||
case nod_between:
|
case nod_between:
|
||||||
@ -6151,14 +6154,14 @@ static jrd_nod* get_unmapped_node(thread_db* tdbb, jrd_nod* node,
|
|||||||
case nod_lowcase:
|
case nod_lowcase:
|
||||||
case nod_substr:
|
case nod_substr:
|
||||||
case nod_trim:
|
case nod_trim:
|
||||||
|
case nod_sys_function:
|
||||||
{
|
{
|
||||||
// Check all sub-nodes of this node.
|
// Check all sub-nodes of this node.
|
||||||
jrd_nod** ptr = node->nod_arg;
|
jrd_nod** ptr = node->nod_arg;
|
||||||
for (const jrd_nod* const* const end = ptr + node->nod_count;
|
for (const jrd_nod* const* const end = ptr + node->nod_count;
|
||||||
ptr < end; ptr++)
|
ptr < end; ptr++)
|
||||||
{
|
{
|
||||||
if (get_unmapped_node(tdbb, *ptr, map, shellStream,
|
if (!get_unmapped_node(tdbb, *ptr, map, shellStream, false))
|
||||||
false) == NULL)
|
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user