mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 18:41:56 +01:00
08c7ab404f
column generated using date_format() and if() vcol_info->expr is allocated on expr_arena at parsing stage. Since expr item is allocated on expr_arena all its containee items must be allocated on expr_arena too. Otherwise fix_session_expr() will encounter prematurely freed item. When table is reopened from cache vcol_info contains stale expression. We refresh expression via TABLE::vcol_fix_exprs() but first we must prepare a proper context (Vcol_expr_context) which meets some requirements: 1. As noted above expr update must be done on expr_arena as there may be new items created. It was a bug in fix_session_expr_for_read() and was just not reproduced because of no second refix. Now refix is done for more cases so it does reproduce. Tests affected: vcol.binlog 2. Also name resolution context must be narrowed to the single table. Tested by: vcol.update main.default vcol.vcol_syntax gcol.gcol_bugfixes 3. sql_mode must be clean and not fail expr update. sql_mode such as MODE_NO_BACKSLASH_ESCAPES, MODE_NO_ZERO_IN_DATE, etc must not affect vcol expression update. If the table was created successfully any further evaluation must not fail. Tests affected: main.func_like Reviewed by: Sergei Golubchik <serg@mariadb.org>
164 lines
4.8 KiB
Text
164 lines
4.8 KiB
Text
#
|
|
# test syntax
|
|
#
|
|
set @OLD_SQL_MODE=@@SESSION.SQL_MODE;
|
|
create table t1 (a int, b int generated always as (a+1));
|
|
show create table t1;
|
|
drop table t1;
|
|
create table t1 (a int, b int as (a+1) virtual);
|
|
show create table t1;
|
|
drop table t1;
|
|
create table t1 (a int, b int generated always as (a+1) persistent);
|
|
show create table t1;
|
|
drop table t1;
|
|
|
|
set session sql_mode='ORACLE';
|
|
create table t1 (a int, b int as (a+1));
|
|
show create table t1;
|
|
drop table t1;
|
|
create table t1 (a int, b int generated always as (a+1) virtual);
|
|
show create table t1;
|
|
drop table t1;
|
|
create table t1 (a int, b int as (a+1) persistent);
|
|
show create table t1;
|
|
drop table t1;
|
|
set session sql_mode=@OLD_SQL_MODE;
|
|
|
|
--echo #
|
|
--echo # MDEV-25091 CREATE TABLE: field references qualified by a wrong table name succeed
|
|
--echo #
|
|
create table t2 (x int);
|
|
|
|
--error ER_BAD_FIELD_ERROR
|
|
create table t1 (x int, y int generated always as (t2.x));
|
|
--error ER_BAD_FIELD_ERROR
|
|
create table t1 (x int, y int check (y > t2.x));
|
|
--error ER_BAD_FIELD_ERROR
|
|
create table t1 (x int, y int default t2.x);
|
|
--error ER_BAD_FIELD_ERROR
|
|
create table t1 (x int, check (t2.x > 0));
|
|
|
|
create table t1 (x int);
|
|
--error ER_BAD_FIELD_ERROR
|
|
alter table t1 add column y int generated always as (t2.x);
|
|
--error ER_BAD_FIELD_ERROR
|
|
alter table t1 add column y int check (z > t2.x);
|
|
--error ER_BAD_FIELD_ERROR
|
|
alter table t1 add column y int default t2.x;
|
|
--error ER_BAD_FIELD_ERROR
|
|
alter table t1 add constraint check (t2.x > 0);
|
|
|
|
create or replace table t1 (x int, y int generated always as (t1.x));
|
|
create or replace table t1 (x int, y int check (y > t1.x));
|
|
create or replace table t1 (x int, y int default t1.x);
|
|
create or replace table t1 (x int, check (t1.x > 0));
|
|
|
|
create or replace table t1 (x int, y int generated always as (test.t1.x));
|
|
create or replace table t1 (x int, y int check (y > test.t1.x));
|
|
create or replace table t1 (x int, y int default test.t1.x);
|
|
create or replace table t1 (x int, check (test.t1.x > 0));
|
|
|
|
drop tables t1, t2;
|
|
|
|
--error ER_BAD_FIELD_ERROR
|
|
create table t1 (x int, y int generated always as (test2.t1.x));
|
|
--error ER_BAD_FIELD_ERROR
|
|
create table t1 (x int, y int check (y > test2.t1.x));
|
|
--error ER_BAD_FIELD_ERROR
|
|
create table t1 (x int, y int default test2.t1.x);
|
|
--error ER_BAD_FIELD_ERROR
|
|
create table t1 (x int, check (test2.t1.x > 0));
|
|
|
|
--echo #
|
|
--echo # MDEV-25672 table alias from previous statement interferes later commands
|
|
--echo #
|
|
create table t1 (a int, v_a int generated always as (a));
|
|
update t1 as x set a = 1;
|
|
alter table t1 force;
|
|
drop table t1;
|
|
|
|
create table t1 (
|
|
id int not null auto_increment primary key,
|
|
order_date_time datetime not null,
|
|
order_date date generated always as (convert(order_date_time, date)),
|
|
language_id binary(16) null
|
|
);
|
|
|
|
update t1 as tx set order_date= null;
|
|
alter table t1 modify column language_id binary(16) not null;
|
|
# Cleanup
|
|
drop table t1;
|
|
|
|
--echo #
|
|
--echo # MDEV-24176 Server crashes after insert in the table with virtual column generated using date_format() and if()
|
|
--echo #
|
|
create table t1 (d1 date not null, d2 date not null,
|
|
gd text as (concat(d1,if(d1 <> d2, date_format(d2, 'to %y-%m-%d '), ''))) );
|
|
|
|
insert into t1(d1,d2) values
|
|
('2020-09-01','2020-09-01'),('2020-05-01','2020-09-01');
|
|
select * from t1;
|
|
|
|
drop table t1;
|
|
|
|
--echo # MDEV-25772 (duplicate) and LOCK TABLES case
|
|
create table t1 (d1 datetime , v_d1 tinyint(1) as (d1 < curdate()));
|
|
insert into t1 (d1) values ('2021-09-11 08:38:23'), ('2021-09-01 08:38:23');
|
|
|
|
lock tables t1 write;
|
|
select * from t1 where v_d1=1;
|
|
select * from t1;
|
|
unlock tables;
|
|
|
|
drop table t1;
|
|
|
|
--echo # MDEV-26432 (duplicate)
|
|
create table t1 (v2 int, v1 int as ((user() like 'x'))) ;
|
|
select 1 from t1 where v1=1 ;
|
|
select * from t1;
|
|
|
|
drop table t1;
|
|
|
|
create table t1 (v2 int as ( user () like 'x'));
|
|
select 1 from t1 order by v2 ;
|
|
alter table t1 add i int;
|
|
drop table t1;
|
|
|
|
--echo # MDEV-26437 (duplicate)
|
|
create table v0 (v2 int not null,
|
|
v1 bigint as (case 'x' when current_user() then v2 end));
|
|
|
|
select v2 as v3 from v0 where v1 like 'x' escape 'x';
|
|
insert into v0 (v2) values (-128);
|
|
|
|
drop table v0;
|
|
|
|
create table t1 (vi int as (case 'x' when current_user() then 1 end));
|
|
select 1 from t1 where vi=1;
|
|
show create table t1;
|
|
|
|
drop table t1;
|
|
|
|
create table t1 (vi int as (case 'x' when current_user() then 1 end));
|
|
select 1 from t1 where vi=1;
|
|
select 1 from t1 where vi=1;
|
|
|
|
drop table t1;
|
|
|
|
--echo # MDEV-28092 (duplicate)
|
|
create table t1 (b timestamp, a int as (1 in (dayofmonth (b between 'x' and current_user) = b)));
|
|
insert into t1(b) values ('2022-03-17 14:55:37');
|
|
|
|
select 1 from t1 x natural join t1;
|
|
drop table t1;
|
|
|
|
--echo # MDEV-28089 (duplicate)
|
|
create table t1 (a int , b date as (1 in ('x' ,(database () = 'x' is null) ))) ;
|
|
select b from t1;
|
|
select a from t1 order by 'x' = b;
|
|
drop table t1;
|
|
|
|
create table t1 (a int , b date as (1 in ('x' ,(database ()) ))) ;
|
|
select b from t1;
|
|
select a from t1 order by 'x' = b;
|
|
drop table t1;
|