Commit aba78841 authored by Igor Babaev's avatar Igor Babaev

MDEV-25206 Crash with CREATE VIEW .. SELECT with non-existing field

           in ON condition

The fix of the bug MDEV-25002 for 10.4 turned out to be incomplete. It
caused crashes when executing CREATE VIEW, CREATE TABLE .. SELECT,
INSERT .. SELECT statements if their SELECTs contained references to
non-existing fields.
This patch complements the fix for MDEV-25002 in order to avoid such
crashes.

Approved by Oleksandr Byelkin <sanja@mariadb.com>
parent d8dc8537
......@@ -6824,3 +6824,19 @@ Drop table t1;
#
# End of 10.3 tests
#
#
# MDEV-25206: view specification contains unknown column reference
#
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (1),(2);
CREATE TABLE t2 (b int);
INSERT INTO t2 VALUES (2),(3);
CREATE TABLE t3 (c int);
CREATE VIEW v1 AS SELECT * FROM t1 JOIN t2 ON t1.x > t2.b;
ERROR 42S22: Unknown column 't1.x' in 'on clause'
INSERT INTO t3 SELECT * FROM t1 JOIN t2 ON t1.x > t2.b;
ERROR 42S22: Unknown column 't1.x' in 'on clause'
CREATE TABLE t4 AS SELECT * FROM t1 JOIN t2 ON t1.x > t2.b;
ERROR 42S22: Unknown column 't1.x' in 'on clause'
DROP TABLE t1,t2,t3;
# End of 10.4 tests
......@@ -6542,3 +6542,24 @@ Drop table t1;
--echo #
--echo # End of 10.3 tests
--echo #
--echo #
--echo # MDEV-25206: view specification contains unknown column reference
--echo #
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (1),(2);
CREATE TABLE t2 (b int);
INSERT INTO t2 VALUES (2),(3);
CREATE TABLE t3 (c int);
--error ER_BAD_FIELD_ERROR
CREATE VIEW v1 AS SELECT * FROM t1 JOIN t2 ON t1.x > t2.b;
--error ER_BAD_FIELD_ERROR
INSERT INTO t3 SELECT * FROM t1 JOIN t2 ON t1.x > t2.b;
--error ER_BAD_FIELD_ERROR
CREATE TABLE t4 AS SELECT * FROM t1 JOIN t2 ON t1.x > t2.b;
DROP TABLE t1,t2,t3;
--echo # End of 10.4 tests
......@@ -5422,8 +5422,9 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
Name_resolution_context *outer_context= 0;
SELECT_LEX *select= 0;
/* Currently derived tables cannot be correlated */
if (current_sel->master_unit()->first_select()->get_linkage() !=
DERIVED_TABLE_TYPE)
if ((current_sel->master_unit()->first_select()->get_linkage() !=
DERIVED_TABLE_TYPE) &&
current_sel->master_unit()->outer_select())
outer_context= context->outer_context;
/*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment