Skip to content

Commit 9de37e0

Browse files
author
Alexey Botchkov
committed
MDEV-19569 Assertion `table_list->table' failed in find_field_in_table_ref.
Disallow subqueries in The PARTITIN BY INTERVAL syntax. Fix various interval types that now fail as they break syntax in the par file.
1 parent 3a62ff7 commit 9de37e0

File tree

4 files changed

+197
-12
lines changed

4 files changed

+197
-12
lines changed

mysql-test/suite/versioning/r/partition.result

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,5 +1145,106 @@ insert into t values (1),(2);
11451145
create trigger tr before insert on t for each row update tcount set c = c + 1;
11461146
insert into t select * from t;
11471147
drop table tcount, t;
1148+
#
1149+
# MDEV-19569 Assertion `table_list->table' failed in find_field_in_table_ref and Assertion `table_ref->table || table_ref->view' in Field_iterator_table_ref::set_field_iterator
1150+
#
1151+
create table t1 (i int);
1152+
create table t2 (i int);
1153+
alter table t1 partition by system_time
1154+
interval (select i from t2) day (partition p1 history, partition pn current);
1155+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'select i from t2) day (partition p1 history, partition pn current)' at line 2
1156+
drop table t1;
1157+
create table t1 (id int) with system versioning
1158+
partition by system_time
1159+
interval (select i from t2) day (partition p1 history, partition pn current);
1160+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'select i from t2) day (partition p1 history, partition pn current)' at line 3
1161+
create table t1 (id int) with system versioning
1162+
partition by system_time
1163+
interval "hello" day (partition p1 history, partition pn current);
1164+
ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'INTERVAL'
1165+
create table t1 (id int) with system versioning
1166+
partition by system_time
1167+
interval 3.893 day (partition p1 history, partition pn current);
1168+
drop table t1, t2;
1169+
create table t1 (id int) with system versioning
1170+
partition by system_time interval "3-11" year_month (partition p1 history, partition pn current);
1171+
show create table t1;
1172+
Table Create Table
1173+
t1 CREATE TABLE `t1` (
1174+
`id` int(11) DEFAULT NULL
1175+
) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
1176+
PARTITION BY SYSTEM_TIME INTERVAL '3-11' YEAR_MONTH
1177+
(PARTITION `p1` HISTORY ENGINE = DEFAULT_ENGINE,
1178+
PARTITION `pn` CURRENT ENGINE = DEFAULT_ENGINE)
1179+
drop table t1;
1180+
create table t1 (id int) with system versioning
1181+
partition by system_time interval "3 11" day_hour (partition p1 history, partition pn current);
1182+
show create table t1;
1183+
Table Create Table
1184+
t1 CREATE TABLE `t1` (
1185+
`id` int(11) DEFAULT NULL
1186+
) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
1187+
PARTITION BY SYSTEM_TIME INTERVAL '3 11' DAY_HOUR
1188+
(PARTITION `p1` HISTORY ENGINE = DEFAULT_ENGINE,
1189+
PARTITION `pn` CURRENT ENGINE = DEFAULT_ENGINE)
1190+
drop table t1;
1191+
create table t1 (id int) with system versioning
1192+
partition by system_time interval "3 11:12" day_minute (partition p1 history, partition pn current);
1193+
show create table t1;
1194+
Table Create Table
1195+
t1 CREATE TABLE `t1` (
1196+
`id` int(11) DEFAULT NULL
1197+
) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
1198+
PARTITION BY SYSTEM_TIME INTERVAL '3 11:12' DAY_MINUTE
1199+
(PARTITION `p1` HISTORY ENGINE = DEFAULT_ENGINE,
1200+
PARTITION `pn` CURRENT ENGINE = DEFAULT_ENGINE)
1201+
drop table t1;
1202+
create table t1 (id int) with system versioning
1203+
partition by system_time interval "3 11:12:13" day_second (partition p1 history, partition pn current);
1204+
show create table t1;
1205+
Table Create Table
1206+
t1 CREATE TABLE `t1` (
1207+
`id` int(11) DEFAULT NULL
1208+
) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
1209+
PARTITION BY SYSTEM_TIME INTERVAL '3 11:12:13' DAY_SECOND
1210+
(PARTITION `p1` HISTORY ENGINE = DEFAULT_ENGINE,
1211+
PARTITION `pn` CURRENT ENGINE = DEFAULT_ENGINE)
1212+
drop table t1;
1213+
create table t1 (id int) with system versioning
1214+
partition by system_time interval "11:12" hour_minute (partition p1 history, partition pn current);
1215+
show create table t1;
1216+
Table Create Table
1217+
t1 CREATE TABLE `t1` (
1218+
`id` int(11) DEFAULT NULL
1219+
) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
1220+
PARTITION BY SYSTEM_TIME INTERVAL '11:12' HOUR_MINUTE
1221+
(PARTITION `p1` HISTORY ENGINE = DEFAULT_ENGINE,
1222+
PARTITION `pn` CURRENT ENGINE = DEFAULT_ENGINE)
1223+
drop table t1;
1224+
create table t1 (id int) with system versioning
1225+
partition by system_time interval "11:12:13" hour_second (partition p1 history, partition pn current);
1226+
show create table t1;
1227+
Table Create Table
1228+
t1 CREATE TABLE `t1` (
1229+
`id` int(11) DEFAULT NULL
1230+
) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
1231+
PARTITION BY SYSTEM_TIME INTERVAL '11:12:13' HOUR_SECOND
1232+
(PARTITION `p1` HISTORY ENGINE = DEFAULT_ENGINE,
1233+
PARTITION `pn` CURRENT ENGINE = DEFAULT_ENGINE)
1234+
drop table t1;
1235+
create table t1 (id int) with system versioning
1236+
partition by system_time interval "12:13" minute_second (partition p1 history, partition pn current);
1237+
show create table t1;
1238+
Table Create Table
1239+
t1 CREATE TABLE `t1` (
1240+
`id` int(11) DEFAULT NULL
1241+
) ENGINE=DEFAULT_ENGINE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
1242+
PARTITION BY SYSTEM_TIME INTERVAL '12:13' MINUTE_SECOND
1243+
(PARTITION `p1` HISTORY ENGINE = DEFAULT_ENGINE,
1244+
PARTITION `pn` CURRENT ENGINE = DEFAULT_ENGINE)
1245+
drop table t1;
1246+
create table t1 (id int) with system versioning
1247+
partition by system_time interval "12:13.123" minute_microsecond (partition p1 history, partition pn current);
1248+
ERROR HY000: Wrong parameters for partitioned `t1`: wrong value for 'INTERVAL'
11481249
# End of 10.3 tests
11491250
set global innodb_stats_persistent= @save_persistent;

mysql-test/suite/versioning/t/partition.test

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,6 +1098,80 @@ insert into t select * from t;
10981098
# cleanup
10991099
drop table tcount, t;
11001100

1101+
--echo #
1102+
--echo # MDEV-19569 Assertion `table_list->table' failed in find_field_in_table_ref and Assertion `table_ref->table || table_ref->view' in Field_iterator_table_ref::set_field_iterator
1103+
--echo #
1104+
create table t1 (i int);
1105+
create table t2 (i int);
1106+
1107+
--error ER_PARSE_ERROR
1108+
alter table t1 partition by system_time
1109+
interval (select i from t2) day (partition p1 history, partition pn current);
1110+
1111+
drop table t1;
1112+
1113+
--error ER_PARSE_ERROR
1114+
create table t1 (id int) with system versioning
1115+
partition by system_time
1116+
interval (select i from t2) day (partition p1 history, partition pn current);
1117+
1118+
--error ER_PART_WRONG_VALUE
1119+
create table t1 (id int) with system versioning
1120+
partition by system_time
1121+
interval "hello" day (partition p1 history, partition pn current);
1122+
1123+
create table t1 (id int) with system versioning
1124+
partition by system_time
1125+
interval 3.893 day (partition p1 history, partition pn current);
1126+
1127+
drop table t1, t2;
1128+
1129+
create table t1 (id int) with system versioning
1130+
partition by system_time interval "3-11" year_month (partition p1 history, partition pn current);
1131+
--replace_result $default_engine DEFAULT_ENGINE
1132+
show create table t1;
1133+
drop table t1;
1134+
1135+
create table t1 (id int) with system versioning
1136+
partition by system_time interval "3 11" day_hour (partition p1 history, partition pn current);
1137+
--replace_result $default_engine DEFAULT_ENGINE
1138+
show create table t1;
1139+
drop table t1;
1140+
1141+
create table t1 (id int) with system versioning
1142+
partition by system_time interval "3 11:12" day_minute (partition p1 history, partition pn current);
1143+
--replace_result $default_engine DEFAULT_ENGINE
1144+
show create table t1;
1145+
drop table t1;
1146+
1147+
create table t1 (id int) with system versioning
1148+
partition by system_time interval "3 11:12:13" day_second (partition p1 history, partition pn current);
1149+
--replace_result $default_engine DEFAULT_ENGINE
1150+
show create table t1;
1151+
drop table t1;
1152+
1153+
create table t1 (id int) with system versioning
1154+
partition by system_time interval "11:12" hour_minute (partition p1 history, partition pn current);
1155+
--replace_result $default_engine DEFAULT_ENGINE
1156+
show create table t1;
1157+
drop table t1;
1158+
1159+
create table t1 (id int) with system versioning
1160+
partition by system_time interval "11:12:13" hour_second (partition p1 history, partition pn current);
1161+
--replace_result $default_engine DEFAULT_ENGINE
1162+
show create table t1;
1163+
drop table t1;
1164+
1165+
create table t1 (id int) with system versioning
1166+
partition by system_time interval "12:13" minute_second (partition p1 history, partition pn current);
1167+
--replace_result $default_engine DEFAULT_ENGINE
1168+
show create table t1;
1169+
drop table t1;
1170+
1171+
--error ER_PART_WRONG_VALUE
1172+
create table t1 (id int) with system versioning
1173+
partition by system_time interval "12:13.123" minute_microsecond (partition p1 history, partition pn current);
1174+
11011175
--echo # End of 10.3 tests
11021176

11031177
set global innodb_stats_persistent= @save_persistent;

sql/sql_time.cc

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,34 +93,43 @@ int append_interval(String *str, interval_type int_type, const INTERVAL &interva
9393
len= my_snprintf(buf,sizeof(buf),"%u", interval.second_part);
9494
break;
9595
case INTERVAL_YEAR_MONTH:
96-
len= my_snprintf(buf,sizeof(buf),"%u-%02u", interval.day, interval.month);
96+
len= my_snprintf(buf,sizeof(buf),"'%u-%02u'",
97+
interval.year, interval.month);
9798
break;
9899
case INTERVAL_DAY_HOUR:
99-
len= my_snprintf(buf,sizeof(buf),"%u %u", interval.day, interval.hour);
100+
len= my_snprintf(buf,sizeof(buf),"'%u %u'", interval.day, interval.hour);
100101
break;
101102
case INTERVAL_DAY_MINUTE:
102-
len= my_snprintf(buf,sizeof(buf),"%u %u:%02u", interval.day, interval.hour, interval.minute);
103+
len= my_snprintf(buf,sizeof(buf),"'%u %u:%02u'",
104+
interval.day, interval.hour, interval.minute);
103105
break;
104106
case INTERVAL_DAY_SECOND:
105-
len= my_snprintf(buf,sizeof(buf),"%u %u:%02u:%02u", interval.day, interval.hour, interval.minute, interval.second);
107+
len= my_snprintf(buf,sizeof(buf),"'%u %u:%02u:%02u'",
108+
interval.day, interval.hour, interval.minute, interval.second);
106109
break;
107110
case INTERVAL_HOUR_MINUTE:
108-
len= my_snprintf(buf,sizeof(buf),"%u:%02u", interval.hour, interval.minute);
111+
len= my_snprintf(buf,sizeof(buf),"'%u:%02u'", interval.hour, interval.minute);
109112
break;
110113
case INTERVAL_HOUR_SECOND:
111-
len= my_snprintf(buf,sizeof(buf),"%u:%02u:%02u", interval.hour, interval.minute, interval.second);
114+
len= my_snprintf(buf,sizeof(buf),"'%u:%02u:%02u'",
115+
interval.hour, interval.minute, interval.second);
112116
break;
113117
case INTERVAL_MINUTE_SECOND:
114-
len= my_snprintf(buf,sizeof(buf),"%u:%02u", interval.minute, interval.second);
118+
len= my_snprintf(buf,sizeof(buf),"'%u:%02u'", interval.minute, interval.second);
115119
break;
116120
case INTERVAL_DAY_MICROSECOND:
117-
len= my_snprintf(buf,sizeof(buf),"%u %u:%02u:%02u.%06u", interval.day, interval.hour, interval.minute, interval.second, interval.second_part);
121+
len= my_snprintf(buf,sizeof(buf),"'%u %u:%02u:%02u.%06u'",
122+
interval.day, interval.hour, interval.minute,
123+
interval.second, interval.second_part);
118124
break;
119125
case INTERVAL_HOUR_MICROSECOND:
120-
len= my_snprintf(buf,sizeof(buf),"%u:%02u:%02u.%06u", interval.hour, interval.minute, interval.second, interval.second_part);
126+
len= my_snprintf(buf,sizeof(buf),"'%u:%02u:%02u.%06u'",
127+
interval.hour, interval.minute, interval.second,
128+
interval.second_part);
121129
break;
122130
case INTERVAL_MINUTE_MICROSECOND:
123-
len= my_snprintf(buf,sizeof(buf),"%u:%02u.%06u", interval.minute, interval.second, interval.second_part);
131+
len= my_snprintf(buf,sizeof(buf),"'%u:%02u.%06u'",
132+
interval.minute, interval.second, interval.second_part);
124133
break;
125134
case INTERVAL_SECOND_MICROSECOND:
126135
len= my_snprintf(buf,sizeof(buf),"%u.%06u", interval.second, interval.second_part);

sql/sql_yacc.yy

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6094,10 +6094,11 @@ opt_part_option:
60946094

60956095
opt_versioning_rotation:
60966096
/* empty */ {}
6097-
| INTERVAL_SYM expr interval opt_versioning_interval_start
6097+
| { Lex->expr_allows_subselect= false; }
6098+
INTERVAL_SYM expr interval opt_versioning_interval_start
60986099
{
60996100
partition_info *part_info= Lex->part_info;
6100-
if (unlikely(part_info->vers_set_interval(thd, $2, $3, $4)))
6101+
if (unlikely(part_info->vers_set_interval(thd, $3, $4, $5)))
61016102
MYSQL_YYABORT;
61026103
}
61036104
| LIMIT ulonglong_num

0 commit comments

Comments
 (0)