Skip to content

Optimizer fails applying stream-local predicates before merging [CORE2832] #3218

@firebird-automations

Description

@firebird-automations

Submitted by: Nikolay Ponomarenko (pnv82)

There is different number of reading for joined table RDB$RELATION_FIELDS, when "hint" SKIP 0 is added:

SELECT * FROM (
SELECT R.*
FROM RDB$RELATIONS_SEL R
WHERE R.RDB$RELATION_ID < 10
) REL
JOIN RDB$RELATION_FIELDS F ON F.RDB$RELATION_NAME = REL.RDB$RELATION_NAME

SELECT * FROM (
SELECT SKIP 0 R.*
FROM RDB$RELATIONS_SEL R
WHERE R.RDB$RELATION_ID < 10
) REL
JOIN RDB$RELATION_FIELDS F ON F.RDB$RELATION_NAME = REL.RDB$RELATION_NAME

Predicate WHERE R.RDB$RELATION_ID < 10 is applied after merging flows

CREATE OR ALTER PROCEDURE RDB$RELATIONS_SEL
RETURNS (
RDB$RELATION_ID SMALLINT,
RDB$SYSTEM_FLAG SMALLINT,
RDB$DBKEY_LENGTH SMALLINT,
RDB$FORMAT SMALLINT,
RDB$FIELD_ID SMALLINT,
RDB$RELATION_NAME CHAR(31),
RDB$SECURITY_CLASS CHAR(31),
RDB$EXTERNAL_FILE VARCHAR(255),
RDB$OWNER_NAME CHAR(31),
RDB$DEFAULT_CLASS CHAR(31),
RDB$FLAGS SMALLINT,
RDB$RELATION_TYPE SMALLINT)
AS
BEGIN
FOR SELECT RDB$RELATION_ID,
RDB$SYSTEM_FLAG,
RDB$DBKEY_LENGTH,
RDB$FORMAT,
RDB$FIELD_ID,
RDB$RELATION_NAME,
RDB$SECURITY_CLASS,
RDB$EXTERNAL_FILE,
RDB$OWNER_NAME,
RDB$DEFAULT_CLASS,
RDB$FLAGS,
RDB$RELATION_TYPE
FROM RDB$RELATIONS
INTO :RDB$RELATION_ID,
:RDB$SYSTEM_FLAG,
:RDB$DBKEY_LENGTH,
:RDB$FORMAT,
:RDB$FIELD_ID,
:RDB$RELATION_NAME,
:RDB$SECURITY_CLASS,
:RDB$EXTERNAL_FILE,
:RDB$OWNER_NAME,
:RDB$DEFAULT_CLASS,
:RDB$FLAGS,
:RDB$RELATION_TYPE
DO
BEGIN
SUSPEND;
END
END

Commits: 71e4f9a