[MDEV-32034] Second SELECT from view created from INFORMATION_SCHEMA.OPTIMIZER_TRACE gives NULL Created: 2023-08-29  Updated: 2024-02-06

Status: In Review
Project: MariaDB Server
Component/s: Optimizer
Affects Version/s: 10.4, 10.5, 10.6, 10.9, 10.10, 10.11, 11.0, 11.1, 11.2, 11.3
Fix Version/s: 10.4, 10.5, 10.6, 10.11, 11.0, 11.1, 11.2, 11.3

Type: Bug Priority: Major
Reporter: Lena Startseva Assignee: Sergei Petrunia
Resolution: Unresolved Votes: 0
Labels: None

Issue Links:
Relates
relates to MDEV-31933 Make working view-protocol + ps-prot... Stalled

 Description   

After fix enable "view-protocol" for cases marked with MDEV-32034

In case below if the query "select ... from INFORMATION_SCHEMA.OPTIMIZER_TRACE;" repeat twice - both SELECTs give right result, but if create view on this select - second query "select * from v1" gives NULL.
Testcase:

--source include/have_sequence.inc
CREATE TABLE t1(a INT, b INT);
INSERT INTO t1 SELECT seq, seq from seq_1_to_100;
SET optimizer_trace=1;
ANALYZE TABLE t1 PERSISTENT FOR ALL;
EXPLAIN EXTENDED SELECT * from t1 WHERE a between 1 and 5 and b <= 5;
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
create view v1 as select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
select * from v1;
select * from v1;
drop view v1;
drop table t1;

Actual result:

select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JS
[
    [
        {
            "column_name": "a",
            "ranges": 
            ["1 <= a <= 5"],
            "selectivity_from_histogram": 0.0469
        },
        {
            "column_name": "b",
            "ranges": 
            ["NULL < b <= 5"],
            "selectivity_from_histogram": 0.0469
        }
    ]
]
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JS
[
    [
        {
            "column_name": "a",
            "ranges": 
            ["1 <= a <= 5"],
            "selectivity_from_histogram": 0.0469
        },
        {
            "column_name": "b",
            "ranges": 
            ["NULL < b <= 5"],
            "selectivity_from_histogram": 0.0469
        }
    ]
]
create view v1 as select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
select * from v1;
JS
[
    [
        {
            "column_name": "a",
            "ranges": 
            ["1 <= a <= 5"],
            "selectivity_from_histogram": 0.0469
        },
        {
            "column_name": "b",
            "ranges": 
            ["NULL < b <= 5"],
            "selectivity_from_histogram": 0.0469
        }
    ]
]
select * from v1;
JS
NULL

Expected result:

select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JS
[
    [
        {
            "column_name": "a",
            "ranges": 
            ["1 <= a <= 5"],
            "selectivity_from_histogram": 0.0469
        },
        {
            "column_name": "b",
            "ranges": 
            ["NULL < b <= 5"],
            "selectivity_from_histogram": 0.0469
        }
    ]
]
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JS
[
    [
        {
            "column_name": "a",
            "ranges": 
            ["1 <= a <= 5"],
            "selectivity_from_histogram": 0.0469
        },
        {
            "column_name": "b",
            "ranges": 
            ["NULL < b <= 5"],
            "selectivity_from_histogram": 0.0469
        }
    ]
]
create view v1 as select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
select * from v1;
JS
[
    [
        {
            "column_name": "a",
            "ranges": 
            ["1 <= a <= 5"],
            "selectivity_from_histogram": 0.0469
        },
        {
            "column_name": "b",
            "ranges": 
            ["NULL < b <= 5"],
            "selectivity_from_histogram": 0.0469
        }
    ]
]
select * from v1;
JS
[
    [
        {
            "column_name": "a",
            "ranges": 
            ["1 <= a <= 5"],
            "selectivity_from_histogram": 0.0469
        },
        {
            "column_name": "b",
            "ranges": 
            ["NULL < b <= 5"],
            "selectivity_from_histogram": 0.0469
        }
    ]
]



 Comments   
Comment by Lena Startseva [ 2023-08-29 ]

The same behavior if we use view and prepare statement:

--source include/have_sequence.inc
CREATE TABLE t1(a INT, b INT);
INSERT INTO t1 SELECT seq, seq from seq_1_to_100;
SET optimizer_trace=1;
ANALYZE TABLE t1 PERSISTENT FOR ALL;
EXPLAIN EXTENDED SELECT * from t1 WHERE a between 1 and 5 and b <= 5;
create view v1 as select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
prepare stmt from "select * from v1";
execute stmt;
deallocate prepare stmt;
drop view v1;
drop table t1;

Actual result:

execute stmt;
JS
NULL

Comment by Oleg Smirnov [ 2024-02-05 ]

psergei, please review the pull request.

Generated at Thu Feb 08 10:28:19 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.