Merge remote-tracking branch 'origin/10.2' into bb-10.2-ext
This commit is contained in:
commit
4a8039b04e
@ -252,9 +252,8 @@ datadir_iter_next_database(datadir_iter_t *it)
|
|||||||
it->dbpath = static_cast<char*>(
|
it->dbpath = static_cast<char*>(
|
||||||
malloc(it->dbpath_len));
|
malloc(it->dbpath_len));
|
||||||
}
|
}
|
||||||
ut_snprintf(it->dbpath, it->dbpath_len,
|
snprintf(it->dbpath, it->dbpath_len, "%s/%s",
|
||||||
"%s/%s", it->datadir_path,
|
it->datadir_path, it->dbinfo.name);
|
||||||
it->dbinfo.name);
|
|
||||||
os_normalize_path(it->dbpath);
|
os_normalize_path(it->dbpath);
|
||||||
|
|
||||||
if (it->dbinfo.type == OS_FILE_TYPE_FILE) {
|
if (it->dbinfo.type == OS_FILE_TYPE_FILE) {
|
||||||
@ -1034,8 +1033,8 @@ move_file(ds_ctxt_t *datasink,
|
|||||||
char dst_dir_abs[FN_REFLEN];
|
char dst_dir_abs[FN_REFLEN];
|
||||||
size_t dirname_length;
|
size_t dirname_length;
|
||||||
|
|
||||||
ut_snprintf(dst_file_path_abs, sizeof(dst_file_path_abs),
|
snprintf(dst_file_path_abs, sizeof(dst_file_path_abs),
|
||||||
"%s/%s", dst_dir, dst_file_path);
|
"%s/%s", dst_dir, dst_file_path);
|
||||||
|
|
||||||
dirname_part(dst_dir_abs, dst_file_path_abs, &dirname_length);
|
dirname_part(dst_dir_abs, dst_file_path_abs, &dirname_length);
|
||||||
|
|
||||||
@ -1252,8 +1251,8 @@ backup_files(const char *from, bool prep_mode)
|
|||||||
} else if (!prep_mode) {
|
} else if (!prep_mode) {
|
||||||
/* backup fake file into empty directory */
|
/* backup fake file into empty directory */
|
||||||
char path[FN_REFLEN];
|
char path[FN_REFLEN];
|
||||||
ut_snprintf(path, sizeof(path),
|
snprintf(path, sizeof(path),
|
||||||
"%s/db.opt", node.filepath);
|
"%s/db.opt", node.filepath);
|
||||||
if (!(ret = backup_file_printf(
|
if (!(ret = backup_file_printf(
|
||||||
trim_dotslash(path), "%s", ""))) {
|
trim_dotslash(path), "%s", ""))) {
|
||||||
msg("Failed to create file %s\n", path);
|
msg("Failed to create file %s\n", path);
|
||||||
|
@ -589,7 +589,7 @@ select_incremental_lsn_from_history(lsn_t *incremental_lsn)
|
|||||||
mysql_real_escape_string(mysql_connection, buf,
|
mysql_real_escape_string(mysql_connection, buf,
|
||||||
opt_incremental_history_name,
|
opt_incremental_history_name,
|
||||||
(unsigned long)strlen(opt_incremental_history_name));
|
(unsigned long)strlen(opt_incremental_history_name));
|
||||||
ut_snprintf(query, sizeof(query),
|
snprintf(query, sizeof(query),
|
||||||
"SELECT innodb_to_lsn "
|
"SELECT innodb_to_lsn "
|
||||||
"FROM PERCONA_SCHEMA.xtrabackup_history "
|
"FROM PERCONA_SCHEMA.xtrabackup_history "
|
||||||
"WHERE name = '%s' "
|
"WHERE name = '%s' "
|
||||||
@ -602,7 +602,7 @@ select_incremental_lsn_from_history(lsn_t *incremental_lsn)
|
|||||||
mysql_real_escape_string(mysql_connection, buf,
|
mysql_real_escape_string(mysql_connection, buf,
|
||||||
opt_incremental_history_uuid,
|
opt_incremental_history_uuid,
|
||||||
(unsigned long)strlen(opt_incremental_history_uuid));
|
(unsigned long)strlen(opt_incremental_history_uuid));
|
||||||
ut_snprintf(query, sizeof(query),
|
snprintf(query, sizeof(query),
|
||||||
"SELECT innodb_to_lsn "
|
"SELECT innodb_to_lsn "
|
||||||
"FROM PERCONA_SCHEMA.xtrabackup_history "
|
"FROM PERCONA_SCHEMA.xtrabackup_history "
|
||||||
"WHERE uuid = '%s' "
|
"WHERE uuid = '%s' "
|
||||||
@ -766,7 +766,7 @@ kill_long_queries(MYSQL *connection, time_t timeout)
|
|||||||
is_select_query(info))) {
|
is_select_query(info))) {
|
||||||
msg_ts("Killing query %s (duration %d sec): %s\n",
|
msg_ts("Killing query %s (duration %d sec): %s\n",
|
||||||
id, (int)duration, info);
|
id, (int)duration, info);
|
||||||
ut_snprintf(kill_stmt, sizeof(kill_stmt),
|
snprintf(kill_stmt, sizeof(kill_stmt),
|
||||||
"KILL %s", id);
|
"KILL %s", id);
|
||||||
xb_mysql_query(connection, kill_stmt, false, false);
|
xb_mysql_query(connection, kill_stmt, false, false);
|
||||||
}
|
}
|
||||||
@ -1288,8 +1288,8 @@ write_current_binlog_file(MYSQL *connection)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_snprintf(filepath, sizeof(filepath), "%s%c%s",
|
snprintf(filepath, sizeof(filepath), "%s%c%s",
|
||||||
log_bin_dir, FN_LIBCHAR, log_bin_file);
|
log_bin_dir, FN_LIBCHAR, log_bin_file);
|
||||||
result = copy_file(ds_data, filepath, log_bin_file, 0);
|
result = copy_file(ds_data, filepath, log_bin_file, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1574,8 +1574,8 @@ char *make_argv(char *buf, size_t len, int argc, char **argv)
|
|||||||
if (strncmp(*argv, "--password", strlen("--password")) == 0) {
|
if (strncmp(*argv, "--password", strlen("--password")) == 0) {
|
||||||
arg = "--password=...";
|
arg = "--password=...";
|
||||||
}
|
}
|
||||||
left-= ut_snprintf(buf + len - left, left,
|
left-= snprintf(buf + len - left, left,
|
||||||
"%s%c", arg, argc > 1 ? ' ' : 0);
|
"%s%c", arg, argc > 1 ? ' ' : 0);
|
||||||
++argv; --argc;
|
++argv; --argc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,7 +441,7 @@ log_online_open_bitmap_file_read_only(
|
|||||||
|
|
||||||
xb_ad(name[0] != '\0');
|
xb_ad(name[0] != '\0');
|
||||||
|
|
||||||
ut_snprintf(bitmap_file->name, FN_REFLEN, "%s%s", srv_data_home, name);
|
snprintf(bitmap_file->name, FN_REFLEN, "%s%s", srv_data_home, name);
|
||||||
bitmap_file->file = os_file_create_simple_no_error_handling(
|
bitmap_file->file = os_file_create_simple_no_error_handling(
|
||||||
0, bitmap_file->name,
|
0, bitmap_file->name,
|
||||||
OS_FILE_OPEN, OS_FILE_READ_ONLY, true, &success);
|
OS_FILE_OPEN, OS_FILE_READ_ONLY, true, &success);
|
||||||
|
@ -2685,10 +2685,10 @@ xb_load_single_table_tablespace(
|
|||||||
name = static_cast<char*>(ut_malloc_nokey(pathlen));
|
name = static_cast<char*>(ut_malloc_nokey(pathlen));
|
||||||
|
|
||||||
if (dirname != NULL) {
|
if (dirname != NULL) {
|
||||||
ut_snprintf(name, pathlen, "%s/%s", dirname, filname);
|
snprintf(name, pathlen, "%s/%s", dirname, filname);
|
||||||
name[pathlen - 5] = 0;
|
name[pathlen - 5] = 0;
|
||||||
} else {
|
} else {
|
||||||
ut_snprintf(name, pathlen, "%s", filname);
|
snprintf(name, pathlen, "%s", filname);
|
||||||
name[pathlen - 5] = 0;
|
name[pathlen - 5] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2806,8 +2806,8 @@ static dberr_t enumerate_ibd_files(process_single_tablespace_func_t callback)
|
|||||||
|
|
||||||
dbpath = static_cast<char*>(ut_malloc_nokey(dbpath_len));
|
dbpath = static_cast<char*>(ut_malloc_nokey(dbpath_len));
|
||||||
}
|
}
|
||||||
ut_snprintf(dbpath, dbpath_len,
|
snprintf(dbpath, dbpath_len,
|
||||||
"%s/%s", fil_path_to_mysql_datadir, dbinfo.name);
|
"%s/%s", fil_path_to_mysql_datadir, dbinfo.name);
|
||||||
os_normalize_path(dbpath);
|
os_normalize_path(dbpath);
|
||||||
|
|
||||||
if (check_if_skip_database_by_path(dbpath)) {
|
if (check_if_skip_database_by_path(dbpath)) {
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 7e53ab369815590ff92913b581d43eb7786f2fe2
|
Subproject commit 9b7b25993f0f0c3e2c6502d94792f68fba2284b1
|
@ -230,7 +230,7 @@ insert into t2 (a) values (1023);
|
|||||||
do (f2(23));
|
do (f2(23));
|
||||||
Warnings:
|
Warnings:
|
||||||
Error 1062 Duplicate entry '23' for key 'a'
|
Error 1062 Duplicate entry '23' for key 'a'
|
||||||
Note 4092 At line 4 in test.f2
|
Note 4093 At line 4 in test.f2
|
||||||
select * from t2;
|
select * from t2;
|
||||||
a
|
a
|
||||||
1023
|
1023
|
||||||
|
@ -160,7 +160,7 @@ Note 1050 Table 'v1' already exists
|
|||||||
DROP VIEW IF EXISTS v1;
|
DROP VIEW IF EXISTS v1;
|
||||||
DROP VIEW IF EXISTS v1;
|
DROP VIEW IF EXISTS v1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v1'
|
Note 4091 Unknown VIEW: 'test.v1'
|
||||||
SHOW BINLOG EVENTS;
|
SHOW BINLOG EVENTS;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
# # Format_desc 1 # VER
|
# # Format_desc 1 # VER
|
||||||
|
@ -55,5 +55,5 @@ id
|
|||||||
DROP VIEW IF EXISTS v1;
|
DROP VIEW IF EXISTS v1;
|
||||||
DROP VIEW IF EXISTS v1;
|
DROP VIEW IF EXISTS v1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v1'
|
Note 4091 Unknown VIEW: 'test.v1'
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -1147,3 +1147,61 @@ SELECT * FROM cte_test;
|
|||||||
a
|
a
|
||||||
1
|
1
|
||||||
DROP VIEW cte_test;
|
DROP VIEW cte_test;
|
||||||
|
#
|
||||||
|
# MDEV-13453: privileges checking for CTE
|
||||||
|
#
|
||||||
|
create database db;
|
||||||
|
use db;
|
||||||
|
create table t1 (i int);
|
||||||
|
insert into t1
|
||||||
|
values (3), (7), (1), (4), (2), (3), (1);
|
||||||
|
create table t2 (a int, b int);
|
||||||
|
insert into t2
|
||||||
|
values (3,10), (7,11), (1,17), (4,15), (2,11), (3,10), (1,15);
|
||||||
|
create user foo@localhost;
|
||||||
|
grant SELECT on db.t1 to foo@localhost;
|
||||||
|
grant SELECT(a) on db.t2 to foo@localhost;
|
||||||
|
connect con1,localhost,foo,,;
|
||||||
|
use db;
|
||||||
|
with cte as (select * from t1 where i < 4)
|
||||||
|
select * from cte;
|
||||||
|
i
|
||||||
|
3
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
1
|
||||||
|
with cte as (select * from t1 where i < 4 group by i)
|
||||||
|
select * from cte;
|
||||||
|
i
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
with cte as (select * from t1 where i < 4)
|
||||||
|
select * from cte cte1 where i < 2 union select * from cte cte2 where i > 2;
|
||||||
|
i
|
||||||
|
1
|
||||||
|
3
|
||||||
|
with cte as (select * from t1 where i < 4 group by i)
|
||||||
|
select * from cte cte1 where i < 2 union select * from cte cte2 where i > 2;
|
||||||
|
i
|
||||||
|
1
|
||||||
|
3
|
||||||
|
with cte as (select b from t2 where a < 4)
|
||||||
|
select * from cte cte1 where b < 15 union select * from cte cte2 where b > 15;
|
||||||
|
ERROR 42000: SELECT command denied to user 'foo'@'localhost' for column 'b' in table 't2'
|
||||||
|
with cte as (select a from t2 where a < 4)
|
||||||
|
select * from cte cte1 where a < 2 union select * from cte cte2 where a > 2;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
3
|
||||||
|
connection default;
|
||||||
|
revoke SELECT on db.t1 from foo@localhost;
|
||||||
|
connection con1;
|
||||||
|
with cte as (select * from t1 where i < 4)
|
||||||
|
select * from cte;
|
||||||
|
ERROR 42000: SELECT command denied to user 'foo'@'localhost' for table 't1'
|
||||||
|
disconnect con1;
|
||||||
|
connection default;
|
||||||
|
drop database db;
|
||||||
|
drop user foo@localhost;
|
||||||
|
@ -209,10 +209,10 @@ Note 1051 Unknown table 'test.table1'
|
|||||||
Note 1051 Unknown table 'test.table2'
|
Note 1051 Unknown table 'test.table2'
|
||||||
DROP VIEW IF EXISTS view1,view2,view3,view4;
|
DROP VIEW IF EXISTS view1,view2,view3,view4;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.view1'
|
Note 4091 Unknown VIEW: 'test.view1'
|
||||||
Note 4090 Unknown VIEW: 'test.view2'
|
Note 4091 Unknown VIEW: 'test.view2'
|
||||||
Note 4090 Unknown VIEW: 'test.view3'
|
Note 4091 Unknown VIEW: 'test.view3'
|
||||||
Note 4090 Unknown VIEW: 'test.view4'
|
Note 4091 Unknown VIEW: 'test.view4'
|
||||||
|
|
||||||
# Test error message when trigger does not find table
|
# Test error message when trigger does not find table
|
||||||
CREATE TABLE table1(a int);
|
CREATE TABLE table1(a int);
|
||||||
|
@ -28,6 +28,9 @@ NULL
|
|||||||
select json_value('{"key1": [1,2,3], "key1":123}', '$.key1');
|
select json_value('{"key1": [1,2,3], "key1":123}', '$.key1');
|
||||||
json_value('{"key1": [1,2,3], "key1":123}', '$.key1')
|
json_value('{"key1": [1,2,3], "key1":123}', '$.key1')
|
||||||
123
|
123
|
||||||
|
select JSON_VALUE('{ "x": [0,1], "y": "[0,1]", "z": "Mon\\\"t\\\"y" }','$.z');
|
||||||
|
JSON_VALUE('{ "x": [0,1], "y": "[0,1]", "z": "Mon\\\"t\\\"y" }','$.z')
|
||||||
|
Mon"t"y
|
||||||
select json_query('{"key1":{"a":1, "b":[1,2]}}', '$.key2');
|
select json_query('{"key1":{"a":1, "b":[1,2]}}', '$.key2');
|
||||||
json_query('{"key1":{"a":1, "b":[1,2]}}', '$.key2')
|
json_query('{"key1":{"a":1, "b":[1,2]}}', '$.key2')
|
||||||
NULL
|
NULL
|
||||||
@ -725,6 +728,9 @@ json_contains_path('{"foo":"bar"}', 'one', '$[]')
|
|||||||
NULL
|
NULL
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4042 Syntax error in JSON path in argument 3 to function 'json_contains_path' at position 3
|
Warning 4042 Syntax error in JSON path in argument 3 to function 'json_contains_path' at position 3
|
||||||
|
select JSON_VALID(0x36f0c8dccd83c5eac156da);
|
||||||
|
JSON_VALID(0x36f0c8dccd83c5eac156da)
|
||||||
|
0
|
||||||
#
|
#
|
||||||
# Start of 10.3 tests
|
# Start of 10.3 tests
|
||||||
#
|
#
|
||||||
|
@ -590,7 +590,7 @@ DROP PROCEDURE p1;
|
|||||||
SHOW WARNINGS;
|
SHOW WARNINGS;
|
||||||
Level Code Message
|
Level Code Message
|
||||||
Error 54321 MESSAGE_TEXT text
|
Error 54321 MESSAGE_TEXT text
|
||||||
Note 4092 At line 16 in test.p1
|
Note 4093 At line 16 in test.p1
|
||||||
CREATE PROCEDURE p1()
|
CREATE PROCEDURE p1()
|
||||||
BEGIN
|
BEGIN
|
||||||
DECLARE var INT;
|
DECLARE var INT;
|
||||||
|
@ -89,6 +89,21 @@ ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 1)
|
|||||||
SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5);
|
SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5);
|
||||||
ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5)
|
ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5)
|
||||||
{"bbox": [10, 11, 10, 11], "type": "Point", "coordinates": [10, 11]}
|
{"bbox": [10, 11, 10, 11], "type": "Point", "coordinates": [10, 11]}
|
||||||
|
SELECT st_astext(st_geomfromgeojson('{"type": "MultiLineString","coordinates": []}')) as a;
|
||||||
|
a
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 4076 Incorrect GeoJSON format - empty 'coordinates' array.
|
||||||
|
SELECT st_astext(st_geomfromgeojson('{"type": "Polygon","coordinates": []}')) as a;
|
||||||
|
a
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 4076 Incorrect GeoJSON format - empty 'coordinates' array.
|
||||||
|
SELECT st_astext(st_geomfromgeojson('{"type": "MultiPolygon","coordinates": []}')) as a;
|
||||||
|
a
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 4076 Incorrect GeoJSON format - empty 'coordinates' array.
|
||||||
#
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
|
@ -1428,7 +1428,7 @@ Warnings:
|
|||||||
Note 1305 FUNCTION test.test_function does not exist
|
Note 1305 FUNCTION test.test_function does not exist
|
||||||
drop view if exists v1;
|
drop view if exists v1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v1'
|
Note 4091 Unknown VIEW: 'test.v1'
|
||||||
create table test (col1 varchar(30));
|
create table test (col1 varchar(30));
|
||||||
create function test_function() returns varchar(30)
|
create function test_function() returns varchar(30)
|
||||||
begin
|
begin
|
||||||
|
@ -3159,3 +3159,51 @@ pk
|
|||||||
2
|
2
|
||||||
3
|
3
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# MDEV-13994: Bad join results with orderby_uses_equalities=on
|
||||||
|
#
|
||||||
|
CREATE TABLE books (
|
||||||
|
id int(16) NOT NULL AUTO_INCREMENT,
|
||||||
|
library_id int(16) NOT NULL DEFAULT 0,
|
||||||
|
wings_id int(12) NOT NULL DEFAULT 0,
|
||||||
|
scheduled_for_removal int(1) DEFAULT 0,
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
KEY library_idx (library_id)
|
||||||
|
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
|
||||||
|
INSERT INTO books VALUES (32625,8663,707,0),(32624,8663,505,1);
|
||||||
|
CREATE TABLE wings (
|
||||||
|
id int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
department_id int(11) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
|
||||||
|
INSERT INTO wings VALUES (505,11745),(707,11768);
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch='orderby_uses_equalities=off';
|
||||||
|
SELECT wings.id as wing_id, wings.department_id FROM wings
|
||||||
|
WHERE wings.id IN ( SELECT books.wings_id FROM books
|
||||||
|
WHERE books.library_id = 8663 AND
|
||||||
|
books.scheduled_for_removal=0 )
|
||||||
|
ORDER BY wings.id;
|
||||||
|
wing_id department_id
|
||||||
|
707 11768
|
||||||
|
SET optimizer_switch='orderby_uses_equalities=on';
|
||||||
|
SELECT wings.id as wing_id, wings.department_id FROM wings
|
||||||
|
WHERE wings.id IN ( SELECT books.wings_id FROM books
|
||||||
|
WHERE books.library_id = 8663 AND
|
||||||
|
books.scheduled_for_removal=0 )
|
||||||
|
ORDER BY wings.id;
|
||||||
|
wing_id department_id
|
||||||
|
707 11768
|
||||||
|
explain extended SELECT wings.id as wing_id, wings.department_id FROM wings
|
||||||
|
WHERE wings.id IN ( SELECT books.wings_id FROM books
|
||||||
|
WHERE books.library_id = 8663 AND
|
||||||
|
books.scheduled_for_removal=0 )
|
||||||
|
ORDER BY wings.id;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 1 100.00 Using temporary; Using filesort
|
||||||
|
1 PRIMARY wings eq_ref PRIMARY PRIMARY 4 test.books.wings_id 1 100.00
|
||||||
|
2 MATERIALIZED books ref library_idx library_idx 4 const 1 100.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`wings`.`id` AS `wing_id`,`test`.`wings`.`department_id` AS `department_id` from `test`.`wings` semi join (`test`.`books`) where `test`.`books`.`library_id` = 8663 and `test`.`books`.`scheduled_for_removal` = 0 and `test`.`wings`.`id` = `test`.`books`.`wings_id` order by `test`.`wings`.`id`
|
||||||
|
set optimizer_switch= @save_optimizer_switch;
|
||||||
|
DROP TABLE books, wings;
|
||||||
|
@ -48,3 +48,76 @@ where key1<3 or key2<3;
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 index_merge key1,key2 key1,key2 5,5 NULL # Using sort_union(key1,key2); Using where
|
1 SIMPLE t1 index_merge key1,key2 key1,key2 5,5 NULL # Using sort_union(key1,key2); Using where
|
||||||
drop table t0, t1;
|
drop table t0, t1;
|
||||||
|
#
|
||||||
|
# MDEV-14071: wrong results with orderby_uses_equalities=on
|
||||||
|
# (duplicate of MDEV-13994)
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (i int, j int, z int,PRIMARY KEY (i,j), KEY (z)) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 (i int, j int, PRIMARY KEY (i,j)) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t3 (j int, n varchar(5), PRIMARY KEY (j)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(127,0,1),(188,0,1),(206,0,1),(218,0,1),(292,0,1),(338,0,1),(375,0,1),
|
||||||
|
(381,0,1),(409,0,1),(466,0,1),(469,0,1),(498,0,1),(656,0,1);
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(77,4,0),(86,7,0),(96,6,0),(96,7,0),(99,9,0),(99,10,0),(99,11,0),(104,4,0),
|
||||||
|
(106,5,0),(148,6,0),(177,6,0),(181,5,0),(188,8,0),(218,8,0),(253,7,0),
|
||||||
|
(268,4,0),(338,4,0),(409,7,0),(466,8,0),(469,8,0),(498,8,0),(656,8,0);
|
||||||
|
INSERT INTO t2 VALUES
|
||||||
|
(127,7),(188,8),(188,9),(206,6),(218,8),(218,9),(292,7),(338,4),(338,5),
|
||||||
|
(375,6),(381,5),(409,7),(409,8),(466,8),(466,9),(469,8),(469,9),(498,8),
|
||||||
|
(498,9),(656,8),(656,9);
|
||||||
|
INSERT INTO t3 VALUES
|
||||||
|
(4,'four'),(5,'five'),(6,'six'),(7,'seven'),(8,'eight'),(9,'nine');
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch='orderby_uses_equalities=off';
|
||||||
|
SELECT i,n
|
||||||
|
FROM t1 INNER JOIN t2 USING (i,j) LEFT JOIN t3 USING (j)
|
||||||
|
WHERE i IN (SELECT i FROM t1 WHERE z=1) AND z=0 ORDER BY i;
|
||||||
|
i n
|
||||||
|
188 eight
|
||||||
|
218 eight
|
||||||
|
338 four
|
||||||
|
409 seven
|
||||||
|
466 eight
|
||||||
|
469 eight
|
||||||
|
498 eight
|
||||||
|
656 eight
|
||||||
|
SELECT i,n
|
||||||
|
FROM t1 x INNER JOIN t2 USING (i,j) LEFT JOIN t3 USING (j)
|
||||||
|
WHERE EXISTS (SELECT * FROM t1 WHERE i=x.i AND z=1) AND z=0 ORDER BY i;
|
||||||
|
i n
|
||||||
|
188 eight
|
||||||
|
218 eight
|
||||||
|
338 four
|
||||||
|
409 seven
|
||||||
|
466 eight
|
||||||
|
469 eight
|
||||||
|
498 eight
|
||||||
|
656 eight
|
||||||
|
SET optimizer_switch='orderby_uses_equalities=on';
|
||||||
|
SELECT i,n
|
||||||
|
FROM t1 INNER JOIN t2 USING (i,j) LEFT JOIN t3 USING (j)
|
||||||
|
WHERE i IN (SELECT i FROM t1 WHERE z=1) AND z=0 ORDER BY i;
|
||||||
|
i n
|
||||||
|
188 eight
|
||||||
|
218 eight
|
||||||
|
338 four
|
||||||
|
409 seven
|
||||||
|
466 eight
|
||||||
|
469 eight
|
||||||
|
498 eight
|
||||||
|
656 eight
|
||||||
|
SELECT i,n
|
||||||
|
FROM t1 x INNER JOIN t2 USING (i,j) LEFT JOIN t3 USING (j)
|
||||||
|
WHERE EXISTS (SELECT * FROM t1 WHERE i=x.i AND z=1) AND z=0 ORDER BY i;
|
||||||
|
i n
|
||||||
|
188 eight
|
||||||
|
218 eight
|
||||||
|
338 four
|
||||||
|
409 seven
|
||||||
|
466 eight
|
||||||
|
469 eight
|
||||||
|
498 eight
|
||||||
|
656 eight
|
||||||
|
set optimizer_switch= @save_optimizer_switch;
|
||||||
|
DROP TABLE t1,t2,t3;
|
||||||
|
@ -415,7 +415,7 @@ select @@profiling;
|
|||||||
drop table if exists t1, t2, t3;
|
drop table if exists t1, t2, t3;
|
||||||
drop view if exists v1;
|
drop view if exists v1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v1'
|
Note 4091 Unknown VIEW: 'test.v1'
|
||||||
drop function if exists f1;
|
drop function if exists f1;
|
||||||
set session profiling = OFF;
|
set session profiling = OFF;
|
||||||
set global profiling_history_size= @start_value;
|
set global profiling_history_size= @start_value;
|
||||||
|
@ -3388,7 +3388,7 @@ CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1;
|
|||||||
SHOW CREATE TABLE tmp1;
|
SHOW CREATE TABLE tmp1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
tmp1 CREATE TEMPORARY TABLE `tmp1` (
|
tmp1 CREATE TEMPORARY TABLE `tmp1` (
|
||||||
`c1` bigint(20) DEFAULT NULL
|
`c1` bigint(20) unsigned DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
SELECT @a, @a = b'10100100101';
|
SELECT @a, @a = b'10100100101';
|
||||||
@a @a = b'10100100101'
|
@a @a = b'10100100101'
|
||||||
@ -3478,7 +3478,7 @@ CREATE TEMPORARY TABLE tmp1 AS SELECT @a AS c1;
|
|||||||
SHOW CREATE TABLE tmp1;
|
SHOW CREATE TABLE tmp1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
tmp1 CREATE TEMPORARY TABLE `tmp1` (
|
tmp1 CREATE TEMPORARY TABLE `tmp1` (
|
||||||
`c1` bigint(20) DEFAULT NULL
|
`c1` bigint(20) unsigned DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
SELECT @a, @a = 2010;
|
SELECT @a, @a = 2010;
|
||||||
@a @a = 2010
|
@a @a = 2010
|
||||||
@ -4992,3 +4992,85 @@ ERROR 42000: OUT or INOUT argument 1 for routine test.p1 is not a variable or NE
|
|||||||
EXECUTE IMMEDIATE 'CALL p1(?)' USING IGNORE;
|
EXECUTE IMMEDIATE 'CALL p1(?)' USING IGNORE;
|
||||||
ERROR 42000: OUT or INOUT argument 1 for routine test.p1 is not a variable or NEW pseudo-variable in BEFORE trigger
|
ERROR 42000: OUT or INOUT argument 1 for routine test.p1 is not a variable or NEW pseudo-variable in BEFORE trigger
|
||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
|
#
|
||||||
|
# MDEV-14434 Wrong result for CHARSET(CONCAT(?,const))
|
||||||
|
#
|
||||||
|
SET NAMES utf8;
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(5,_latin1'a'))";
|
||||||
|
CHARSET(CONCAT(5,_latin1'a'))
|
||||||
|
latin1
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5;
|
||||||
|
CHARSET(CONCAT(?,_latin1'a'))
|
||||||
|
latin1
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5.5;
|
||||||
|
CHARSET(CONCAT(?,_latin1'a'))
|
||||||
|
latin1
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5.5e0;
|
||||||
|
CHARSET(CONCAT(?,_latin1'a'))
|
||||||
|
latin1
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING TIME'10:20:30';
|
||||||
|
CHARSET(CONCAT(?,_latin1'a'))
|
||||||
|
latin1
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING TIMESTAMP'2001-01-01 10:20:30';
|
||||||
|
CHARSET(CONCAT(?,_latin1'a'))
|
||||||
|
latin1
|
||||||
|
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5;
|
||||||
|
COERCIBILITY(?)
|
||||||
|
5
|
||||||
|
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5.5;
|
||||||
|
COERCIBILITY(?)
|
||||||
|
5
|
||||||
|
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5.5e0;
|
||||||
|
COERCIBILITY(?)
|
||||||
|
5
|
||||||
|
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING TIME'10:20:30';
|
||||||
|
COERCIBILITY(?)
|
||||||
|
5
|
||||||
|
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING TIMESTAMP'2001-01-01 10:20:30';
|
||||||
|
COERCIBILITY(?)
|
||||||
|
5
|
||||||
|
#
|
||||||
|
# MDEV-14435 Different UNSIGNED flag of out user variable for YEAR parameter for direct vs prepared CALL
|
||||||
|
#
|
||||||
|
CREATE PROCEDURE p1(OUT v INT UNSIGNED) SET v = 2010;
|
||||||
|
CALL p1(@a);
|
||||||
|
PREPARE stmt FROM 'CALL p1(?)';
|
||||||
|
EXECUTE stmt USING @b;
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
CREATE TABLE t1 AS SELECT @a AS a, @b AS b;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(20) unsigned DEFAULT NULL,
|
||||||
|
`b` bigint(20) unsigned DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
CREATE PROCEDURE p1(OUT v YEAR) SET v = 2010;
|
||||||
|
CALL p1(@a);
|
||||||
|
PREPARE stmt FROM 'CALL p1(?)';
|
||||||
|
EXECUTE stmt USING @b;
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
CREATE TABLE t1 AS SELECT @a AS a, @b AS b;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(20) unsigned DEFAULT NULL,
|
||||||
|
`b` bigint(20) unsigned DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
CREATE PROCEDURE p1(OUT v BIT(16)) SET v = 2010;
|
||||||
|
CALL p1(@a);
|
||||||
|
PREPARE stmt FROM 'CALL p1(?)';
|
||||||
|
EXECUTE stmt USING @b;
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
CREATE TABLE t1 AS SELECT @a AS a, @b AS b;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(20) unsigned DEFAULT NULL,
|
||||||
|
`b` bigint(20) unsigned DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
@ -1715,7 +1715,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Warning 1012 Raising a warning
|
Warning 1012 Raising a warning
|
||||||
Error 5555 RESIGNAL to not found
|
Error 5555 RESIGNAL to not found
|
||||||
Note 4092 At line 9 in test.test_resignal
|
Note 4093 At line 9 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -1740,7 +1740,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Warning 1012 Raising a warning
|
Warning 1012 Raising a warning
|
||||||
Error 5555 RESIGNAL to error
|
Error 5555 RESIGNAL to error
|
||||||
Note 4092 At line 9 in test.test_resignal
|
Note 4093 At line 9 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -1789,7 +1789,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1012 Raising a not found
|
Error 1012 Raising a not found
|
||||||
Error 5555 RESIGNAL to not found
|
Error 5555 RESIGNAL to not found
|
||||||
Note 4092 At line 9 in test.test_resignal
|
Note 4093 At line 9 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -1814,7 +1814,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1012 Raising a not found
|
Error 1012 Raising a not found
|
||||||
Error 5555 RESIGNAL to error
|
Error 5555 RESIGNAL to error
|
||||||
Note 4092 At line 9 in test.test_resignal
|
Note 4093 At line 9 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -1863,7 +1863,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1012 Raising an error
|
Error 1012 Raising an error
|
||||||
Error 5555 RESIGNAL to not found
|
Error 5555 RESIGNAL to not found
|
||||||
Note 4092 At line 9 in test.test_resignal
|
Note 4093 At line 9 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -1888,7 +1888,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1012 Raising an error
|
Error 1012 Raising an error
|
||||||
Error 5555 RESIGNAL to error
|
Error 5555 RESIGNAL to error
|
||||||
Note 4092 At line 9 in test.test_resignal
|
Note 4093 At line 9 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -1931,7 +1931,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Warning 1264 Out of range value for column 'a' at row 1
|
Warning 1264 Out of range value for column 'a' at row 1
|
||||||
Error 5555 RESIGNAL to a not found
|
Error 5555 RESIGNAL to a not found
|
||||||
Note 4092 At line 8 in test.test_resignal
|
Note 4093 At line 8 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -1953,7 +1953,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Warning 1264 Out of range value for column 'a' at row 1
|
Warning 1264 Out of range value for column 'a' at row 1
|
||||||
Error 5555 RESIGNAL to an error
|
Error 5555 RESIGNAL to an error
|
||||||
Note 4092 At line 8 in test.test_resignal
|
Note 4093 At line 8 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -2004,7 +2004,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1329 No data - zero rows fetched, selected, or processed
|
Error 1329 No data - zero rows fetched, selected, or processed
|
||||||
Error 5555 RESIGNAL to a not found
|
Error 5555 RESIGNAL to a not found
|
||||||
Note 4092 At line 10 in test.test_resignal
|
Note 4093 At line 10 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -2030,7 +2030,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1329 No data - zero rows fetched, selected, or processed
|
Error 1329 No data - zero rows fetched, selected, or processed
|
||||||
Error 5555 RESIGNAL to an error
|
Error 5555 RESIGNAL to an error
|
||||||
Note 4092 At line 10 in test.test_resignal
|
Note 4093 At line 10 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -2073,7 +2073,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1051 Unknown table 'test.no_such_table'
|
Error 1051 Unknown table 'test.no_such_table'
|
||||||
Error 5555 RESIGNAL to a not found
|
Error 5555 RESIGNAL to a not found
|
||||||
Note 4092 At line 8 in test.test_resignal
|
Note 4093 At line 8 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
create procedure test_resignal()
|
create procedure test_resignal()
|
||||||
begin
|
begin
|
||||||
@ -2095,7 +2095,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1051 Unknown table 'test.no_such_table'
|
Error 1051 Unknown table 'test.no_such_table'
|
||||||
Error 5555 RESIGNAL to an error
|
Error 5555 RESIGNAL to an error
|
||||||
Note 4092 At line 8 in test.test_resignal
|
Note 4093 At line 8 in test.test_resignal
|
||||||
drop procedure test_resignal $$
|
drop procedure test_resignal $$
|
||||||
#
|
#
|
||||||
# More complex cases
|
# More complex cases
|
||||||
@ -2142,7 +2142,7 @@ ERROR 42000: Hi, I am a useless error message
|
|||||||
show warnings $$
|
show warnings $$
|
||||||
Level Code Message
|
Level Code Message
|
||||||
Error 9999 Hi, I am a useless error message
|
Error 9999 Hi, I am a useless error message
|
||||||
Note 4092 At line 7 in test.peter_p2
|
Note 4093 At line 7 in test.peter_p2
|
||||||
drop procedure peter_p1 $$
|
drop procedure peter_p1 $$
|
||||||
drop procedure peter_p2 $$
|
drop procedure peter_p2 $$
|
||||||
CREATE PROCEDURE peter_p1 ()
|
CREATE PROCEDURE peter_p1 ()
|
||||||
@ -2198,16 +2198,16 @@ Level Code Message
|
|||||||
Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL'
|
Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL'
|
||||||
Error 1232 Variable 'sql_mode' can't be set to the value of 'NULL'
|
Error 1232 Variable 'sql_mode' can't be set to the value of 'NULL'
|
||||||
Error 9999 Variable 'sql_mode' can't be set to the value of 'NULL'
|
Error 9999 Variable 'sql_mode' can't be set to the value of 'NULL'
|
||||||
Note 4092 At line 8 in test.peter_p1
|
Note 4093 At line 8 in test.peter_p1
|
||||||
ERROR 42000: Hi, I am a useless error message
|
ERROR 42000: Hi, I am a useless error message
|
||||||
show warnings $$
|
show warnings $$
|
||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL'
|
Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL'
|
||||||
Error 1232 Variable 'sql_mode' can't be set to the value of 'NULL'
|
Error 1232 Variable 'sql_mode' can't be set to the value of 'NULL'
|
||||||
Error 9999 Variable 'sql_mode' can't be set to the value of 'NULL'
|
Error 9999 Variable 'sql_mode' can't be set to the value of 'NULL'
|
||||||
Note 4092 At line 8 in test.peter_p1
|
Note 4093 At line 8 in test.peter_p1
|
||||||
Error 9999 Hi, I am a useless error message
|
Error 9999 Hi, I am a useless error message
|
||||||
Note 4092 At line 10 in test.peter_p2
|
Note 4093 At line 10 in test.peter_p2
|
||||||
drop procedure peter_p1 $$
|
drop procedure peter_p1 $$
|
||||||
drop procedure peter_p2 $$
|
drop procedure peter_p2 $$
|
||||||
drop procedure if exists peter_p3 $$
|
drop procedure if exists peter_p3 $$
|
||||||
@ -2225,7 +2225,7 @@ show warnings $$
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1 Original
|
Error 1 Original
|
||||||
Error 2 Original
|
Error 2 Original
|
||||||
Note 4092 At line 4 in test.peter_p3
|
Note 4093 At line 4 in test.peter_p3
|
||||||
drop procedure peter_p3 $$
|
drop procedure peter_p3 $$
|
||||||
drop table t_warn;
|
drop table t_warn;
|
||||||
drop table t_cursor;
|
drop table t_cursor;
|
||||||
|
@ -79,23 +79,23 @@ show warnings;
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1051 Unknown table 'demo.oops_it_is_not_here'
|
Error 1051 Unknown table 'demo.oops_it_is_not_here'
|
||||||
Error 1644 Oops in proc_9
|
Error 1644 Oops in proc_9
|
||||||
Note 4092 At line 4 in demo.proc_9
|
Note 4093 At line 4 in demo.proc_9
|
||||||
Error 1644 Oops in proc_8
|
Error 1644 Oops in proc_8
|
||||||
Note 4092 At line 4 in demo.proc_8
|
Note 4093 At line 4 in demo.proc_8
|
||||||
Error 1644 Oops in proc_7
|
Error 1644 Oops in proc_7
|
||||||
Note 4092 At line 4 in demo.proc_7
|
Note 4093 At line 4 in demo.proc_7
|
||||||
Error 1644 Oops in proc_6
|
Error 1644 Oops in proc_6
|
||||||
Note 4092 At line 4 in demo.proc_6
|
Note 4093 At line 4 in demo.proc_6
|
||||||
Error 1644 Oops in proc_5
|
Error 1644 Oops in proc_5
|
||||||
Note 4092 At line 4 in demo.proc_5
|
Note 4093 At line 4 in demo.proc_5
|
||||||
Error 1644 Oops in proc_4
|
Error 1644 Oops in proc_4
|
||||||
Note 4092 At line 4 in demo.proc_4
|
Note 4093 At line 4 in demo.proc_4
|
||||||
Error 1644 Oops in proc_3
|
Error 1644 Oops in proc_3
|
||||||
Note 4092 At line 4 in demo.proc_3
|
Note 4093 At line 4 in demo.proc_3
|
||||||
Error 1644 Oops in proc_2
|
Error 1644 Oops in proc_2
|
||||||
Note 4092 At line 4 in demo.proc_2
|
Note 4093 At line 4 in demo.proc_2
|
||||||
Error 1644 Oops in proc_1
|
Error 1644 Oops in proc_1
|
||||||
Note 4092 At line 4 in demo.proc_1
|
Note 4093 At line 4 in demo.proc_1
|
||||||
SET @@session.max_error_count = 5;
|
SET @@session.max_error_count = 5;
|
||||||
SELECT @@session.max_error_count;
|
SELECT @@session.max_error_count;
|
||||||
@@session.max_error_count
|
@@session.max_error_count
|
||||||
@ -104,11 +104,11 @@ call proc_1();
|
|||||||
ERROR 45000: Oops in proc_1
|
ERROR 45000: Oops in proc_1
|
||||||
show warnings;
|
show warnings;
|
||||||
Level Code Message
|
Level Code Message
|
||||||
Note 4092 At line 4 in demo.proc_3
|
Note 4093 At line 4 in demo.proc_3
|
||||||
Error 1644 Oops in proc_2
|
Error 1644 Oops in proc_2
|
||||||
Note 4092 At line 4 in demo.proc_2
|
Note 4093 At line 4 in demo.proc_2
|
||||||
Error 1644 Oops in proc_1
|
Error 1644 Oops in proc_1
|
||||||
Note 4092 At line 4 in demo.proc_1
|
Note 4093 At line 4 in demo.proc_1
|
||||||
SET @@session.max_error_count = 7;
|
SET @@session.max_error_count = 7;
|
||||||
SELECT @@session.max_error_count;
|
SELECT @@session.max_error_count;
|
||||||
@@session.max_error_count
|
@@session.max_error_count
|
||||||
@ -117,13 +117,13 @@ call proc_1();
|
|||||||
ERROR 45000: Oops in proc_1
|
ERROR 45000: Oops in proc_1
|
||||||
show warnings;
|
show warnings;
|
||||||
Level Code Message
|
Level Code Message
|
||||||
Note 4092 At line 4 in demo.proc_4
|
Note 4093 At line 4 in demo.proc_4
|
||||||
Error 1644 Oops in proc_3
|
Error 1644 Oops in proc_3
|
||||||
Note 4092 At line 4 in demo.proc_3
|
Note 4093 At line 4 in demo.proc_3
|
||||||
Error 1644 Oops in proc_2
|
Error 1644 Oops in proc_2
|
||||||
Note 4092 At line 4 in demo.proc_2
|
Note 4093 At line 4 in demo.proc_2
|
||||||
Error 1644 Oops in proc_1
|
Error 1644 Oops in proc_1
|
||||||
Note 4092 At line 4 in demo.proc_1
|
Note 4093 At line 4 in demo.proc_1
|
||||||
SET @@session.max_error_count = 9;
|
SET @@session.max_error_count = 9;
|
||||||
SELECT @@session.max_error_count;
|
SELECT @@session.max_error_count;
|
||||||
@@session.max_error_count
|
@@session.max_error_count
|
||||||
@ -132,15 +132,15 @@ call proc_1();
|
|||||||
ERROR 45000: Oops in proc_1
|
ERROR 45000: Oops in proc_1
|
||||||
show warnings;
|
show warnings;
|
||||||
Level Code Message
|
Level Code Message
|
||||||
Note 4092 At line 4 in demo.proc_5
|
Note 4093 At line 4 in demo.proc_5
|
||||||
Error 1644 Oops in proc_4
|
Error 1644 Oops in proc_4
|
||||||
Note 4092 At line 4 in demo.proc_4
|
Note 4093 At line 4 in demo.proc_4
|
||||||
Error 1644 Oops in proc_3
|
Error 1644 Oops in proc_3
|
||||||
Note 4092 At line 4 in demo.proc_3
|
Note 4093 At line 4 in demo.proc_3
|
||||||
Error 1644 Oops in proc_2
|
Error 1644 Oops in proc_2
|
||||||
Note 4092 At line 4 in demo.proc_2
|
Note 4093 At line 4 in demo.proc_2
|
||||||
Error 1644 Oops in proc_1
|
Error 1644 Oops in proc_1
|
||||||
Note 4092 At line 4 in demo.proc_1
|
Note 4093 At line 4 in demo.proc_1
|
||||||
drop database demo;
|
drop database demo;
|
||||||
SET @@global.max_error_count = @start_global_value;
|
SET @@global.max_error_count = @start_global_value;
|
||||||
SELECT @@global.max_error_count;
|
SELECT @@global.max_error_count;
|
||||||
|
@ -1990,8 +1990,8 @@ Warning 1264 Out of range value for column 'a' at row 1
|
|||||||
Note 1292 Truncated incorrect INTEGER value: '222222 '
|
Note 1292 Truncated incorrect INTEGER value: '222222 '
|
||||||
Warning 1264 Out of range value for column 'b' at row 1
|
Warning 1264 Out of range value for column 'b' at row 1
|
||||||
Error 1048 Column 'c' cannot be null
|
Error 1048 Column 'c' cannot be null
|
||||||
Note 4092 At line 6 in test.t1_bi
|
Note 4093 At line 6 in test.t1_bi
|
||||||
Note 4092 At line 2 in test.p1
|
Note 4093 At line 2 in test.p1
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
|
@ -3,7 +3,7 @@ Warnings:
|
|||||||
Note 1051 Unknown table 'test.t1'
|
Note 1051 Unknown table 'test.t1'
|
||||||
drop view if exists view_t1;
|
drop view if exists view_t1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.view_t1'
|
Note 4091 Unknown VIEW: 'test.view_t1'
|
||||||
SET sql_mode=ONLY_FULL_GROUP_BY;
|
SET sql_mode=ONLY_FULL_GROUP_BY;
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
pk INT,
|
pk INT,
|
||||||
|
@ -3211,7 +3211,7 @@ drop procedure bug10961|
|
|||||||
DROP PROCEDURE IF EXISTS bug6866|
|
DROP PROCEDURE IF EXISTS bug6866|
|
||||||
DROP VIEW IF EXISTS tv|
|
DROP VIEW IF EXISTS tv|
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.tv'
|
Note 4091 Unknown VIEW: 'test.tv'
|
||||||
DROP TABLE IF EXISTS tt1,tt2,tt3|
|
DROP TABLE IF EXISTS tt1,tt2,tt3|
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1051 Unknown table 'test.tt1'
|
Note 1051 Unknown table 'test.tt1'
|
||||||
@ -7823,7 +7823,7 @@ ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
|
|||||||
show warnings;
|
show warnings;
|
||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1062 Duplicate entry '2' for key 'PRIMARY'
|
Error 1062 Duplicate entry '2' for key 'PRIMARY'
|
||||||
Note 4092 At line 5 in test.p1
|
Note 4093 At line 5 in test.p1
|
||||||
select * from t1;
|
select * from t1;
|
||||||
id
|
id
|
||||||
1
|
1
|
||||||
|
@ -5166,7 +5166,7 @@ CREATE TABLE t4 (i4 INT);
|
|||||||
INSERT INTO t4 VALUES (1),(2);
|
INSERT INTO t4 VALUES (1),(2);
|
||||||
DROP VIEW IF EXISTS v1;
|
DROP VIEW IF EXISTS v1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v1'
|
Note 4091 Unknown VIEW: 'test.v1'
|
||||||
CREATE VIEW v1 AS select coalesce(j1,i3) AS v1_field1 from t2 join t3 left join t1 on ( i1 = i2 );
|
CREATE VIEW v1 AS select coalesce(j1,i3) AS v1_field1 from t2 join t3 left join t1 on ( i1 = i2 );
|
||||||
CREATE VIEW v2 AS select v1_field1 from t4 join v1;
|
CREATE VIEW v2 AS select v1_field1 from t4 join v1;
|
||||||
prepare my_stmt from "select v1_field1 from v2";
|
prepare my_stmt from "select v1_field1 from v2";
|
||||||
|
@ -353,7 +353,7 @@ ERROR 23000: Duplicate entry '11' for key 'a'
|
|||||||
|
|
||||||
SHOW WARNINGS;
|
SHOW WARNINGS;
|
||||||
Level Code Message
|
Level Code Message
|
||||||
Note 4092 At line 4 in test.f1
|
Note 4093 At line 4 in test.f1
|
||||||
Error 1062 Duplicate entry '11' for key 'a'
|
Error 1062 Duplicate entry '11' for key 'a'
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -4314,7 +4314,7 @@ CREATE VIEW v2 AS Select * from test.v1;
|
|||||||
ERROR 42S02: Table 'test.v1' doesn't exist
|
ERROR 42S02: Table 'test.v1' doesn't exist
|
||||||
DROP VIEW IF EXISTS v2;
|
DROP VIEW IF EXISTS v2;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v2'
|
Note 4091 Unknown VIEW: 'test.v2'
|
||||||
|
|
||||||
Testcase 3.3.1.25
|
Testcase 3.3.1.25
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
@ -7566,7 +7566,7 @@ Call sp1() ;
|
|||||||
ERROR 42000: PROCEDURE test.sp1 does not exist
|
ERROR 42000: PROCEDURE test.sp1 does not exist
|
||||||
Drop view if exists test.v1 ;
|
Drop view if exists test.v1 ;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v1'
|
Note 4091 Unknown VIEW: 'test.v1'
|
||||||
Drop procedure sp1 ;
|
Drop procedure sp1 ;
|
||||||
ERROR 42000: PROCEDURE test.sp1 does not exist
|
ERROR 42000: PROCEDURE test.sp1 does not exist
|
||||||
|
|
||||||
@ -21312,7 +21312,7 @@ CREATE VIEW v1 AS SELECT f1 FROM t1;
|
|||||||
DROP VIEW IF EXISTS v1;
|
DROP VIEW IF EXISTS v1;
|
||||||
DROP VIEW IF EXISTS v1;
|
DROP VIEW IF EXISTS v1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v1'
|
Note 4091 Unknown VIEW: 'test.v1'
|
||||||
|
|
||||||
Testcase 3.3.1.68
|
Testcase 3.3.1.68
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
@ -4315,7 +4315,7 @@ CREATE VIEW v2 AS Select * from test.v1;
|
|||||||
ERROR 42S02: Table 'test.v1' doesn't exist
|
ERROR 42S02: Table 'test.v1' doesn't exist
|
||||||
DROP VIEW IF EXISTS v2;
|
DROP VIEW IF EXISTS v2;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v2'
|
Note 4091 Unknown VIEW: 'test.v2'
|
||||||
|
|
||||||
Testcase 3.3.1.25
|
Testcase 3.3.1.25
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
@ -7567,7 +7567,7 @@ Call sp1() ;
|
|||||||
ERROR 42000: PROCEDURE test.sp1 does not exist
|
ERROR 42000: PROCEDURE test.sp1 does not exist
|
||||||
Drop view if exists test.v1 ;
|
Drop view if exists test.v1 ;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v1'
|
Note 4091 Unknown VIEW: 'test.v1'
|
||||||
Drop procedure sp1 ;
|
Drop procedure sp1 ;
|
||||||
ERROR 42000: PROCEDURE test.sp1 does not exist
|
ERROR 42000: PROCEDURE test.sp1 does not exist
|
||||||
|
|
||||||
@ -21314,7 +21314,7 @@ CREATE VIEW v1 AS SELECT f1 FROM t1;
|
|||||||
DROP VIEW IF EXISTS v1;
|
DROP VIEW IF EXISTS v1;
|
||||||
DROP VIEW IF EXISTS v1;
|
DROP VIEW IF EXISTS v1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v1'
|
Note 4091 Unknown VIEW: 'test.v1'
|
||||||
|
|
||||||
Testcase 3.3.1.68
|
Testcase 3.3.1.68
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
@ -4477,7 +4477,7 @@ CREATE PROCEDURE sp1()
|
|||||||
for:BEGIN
|
for:BEGIN
|
||||||
SELECT @x;
|
SELECT @x;
|
||||||
END//
|
END//
|
||||||
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 'for:BEGIN
|
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 ':BEGIN
|
||||||
SELECT @x;
|
SELECT @x;
|
||||||
END' at line 2
|
END' at line 2
|
||||||
DROP PROCEDURE IF EXISTS sp1;
|
DROP PROCEDURE IF EXISTS sp1;
|
||||||
|
60
mysql-test/suite/innodb/r/innodb-on-duplicate-update.result
Normal file
60
mysql-test/suite/innodb/r/innodb-on-duplicate-update.result
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
set sql_mode='';
|
||||||
|
set innodb_strict_mode=0;
|
||||||
|
CREATE TABLE `v` (
|
||||||
|
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
|
||||||
|
INSERT v values (1);
|
||||||
|
CREATE TABLE `vp` (
|
||||||
|
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`v_id` int(10) unsigned NOT NULL,
|
||||||
|
`p_id` int(10) unsigned NOT NULL,
|
||||||
|
`ppp` varchar(255) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `IDX_vp_uniq` (`v_id`,`p_id`),
|
||||||
|
KEY `FK_vp_v` (`v_id`),
|
||||||
|
CONSTRAINT `FK_vp_v` FOREIGN KEY (`v_id`) REFERENCES `v` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
|
||||||
|
INSERT vp VALUES (12, 1, 100, 'text12');
|
||||||
|
INSERT INTO `vp` (`id`,`ppp`) VALUES (12, 'test12-2') ON DUPLICATE KEY UPDATE `ppp` = VALUES(`ppp`);
|
||||||
|
Warnings:
|
||||||
|
Warning 1364 Field 'v_id' doesn't have a default value
|
||||||
|
Warning 1364 Field 'p_id' doesn't have a default value
|
||||||
|
SELECT * FROM vp;
|
||||||
|
id v_id p_id ppp
|
||||||
|
12 1 100 test12-2
|
||||||
|
DROP TABLE vp, v;
|
||||||
|
CREATE TABLE t1 (i int PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
INSERT into t1 values (1);
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
i int not null primary key,
|
||||||
|
vi int not null,
|
||||||
|
m int,
|
||||||
|
UNIQUE KEY (vi),
|
||||||
|
CONSTRAINT `cc` FOREIGN KEY (vi) REFERENCES t1 (i) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
INSERT into t2 VALUES (1, 1, 100);
|
||||||
|
INSERT INTO t2 (i,m) VALUES (1, 2) ON DUPLICATE KEY UPDATE m=3;
|
||||||
|
Warnings:
|
||||||
|
Warning 1364 Field 'vi' doesn't have a default value
|
||||||
|
SELECT * FROM t2;
|
||||||
|
i vi m
|
||||||
|
1 1 3
|
||||||
|
DROP TABLE t2,t1;
|
||||||
|
CREATE TABLE t1 (i int PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
INSERT into t1 values (1);
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
i int not null primary key,
|
||||||
|
vi int not null,
|
||||||
|
m int,
|
||||||
|
KEY (vi),
|
||||||
|
CONSTRAINT `cc` FOREIGN KEY (vi) REFERENCES t1 (i) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
INSERT into t2 VALUES (1, 1, 100);
|
||||||
|
INSERT INTO t2 (i,m) VALUES (1, 2) ON DUPLICATE KEY UPDATE m=3;
|
||||||
|
Warnings:
|
||||||
|
Warning 1364 Field 'vi' doesn't have a default value
|
||||||
|
SELECT * FROM t2;
|
||||||
|
i vi m
|
||||||
|
1 1 3
|
||||||
|
DROP TABLE t2, t1;
|
63
mysql-test/suite/innodb/t/innodb-on-duplicate-update.test
Normal file
63
mysql-test/suite/innodb/t/innodb-on-duplicate-update.test
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-13206: INSERT ON DUPLICATE KEY UPDATE foreign key fail
|
||||||
|
#
|
||||||
|
set sql_mode='';
|
||||||
|
set innodb_strict_mode=0;
|
||||||
|
|
||||||
|
CREATE TABLE `v` (
|
||||||
|
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
INSERT v values (1);
|
||||||
|
|
||||||
|
CREATE TABLE `vp` (
|
||||||
|
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`v_id` int(10) unsigned NOT NULL,
|
||||||
|
`p_id` int(10) unsigned NOT NULL,
|
||||||
|
`ppp` varchar(255) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `IDX_vp_uniq` (`v_id`,`p_id`),
|
||||||
|
KEY `FK_vp_v` (`v_id`),
|
||||||
|
CONSTRAINT `FK_vp_v` FOREIGN KEY (`v_id`) REFERENCES `v` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
INSERT vp VALUES (12, 1, 100, 'text12');
|
||||||
|
INSERT INTO `vp` (`id`,`ppp`) VALUES (12, 'test12-2') ON DUPLICATE KEY UPDATE `ppp` = VALUES(`ppp`);
|
||||||
|
SELECT * FROM vp;
|
||||||
|
DROP TABLE vp, v;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i int PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
INSERT into t1 values (1);
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
i int not null primary key,
|
||||||
|
vi int not null,
|
||||||
|
m int,
|
||||||
|
UNIQUE KEY (vi),
|
||||||
|
CONSTRAINT `cc` FOREIGN KEY (vi) REFERENCES t1 (i) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
INSERT into t2 VALUES (1, 1, 100);
|
||||||
|
INSERT INTO t2 (i,m) VALUES (1, 2) ON DUPLICATE KEY UPDATE m=3;
|
||||||
|
SELECT * FROM t2;
|
||||||
|
|
||||||
|
DROP TABLE t2,t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i int PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
INSERT into t1 values (1);
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
i int not null primary key,
|
||||||
|
vi int not null,
|
||||||
|
m int,
|
||||||
|
KEY (vi),
|
||||||
|
CONSTRAINT `cc` FOREIGN KEY (vi) REFERENCES t1 (i) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
INSERT into t2 VALUES (1, 1, 100);
|
||||||
|
INSERT INTO t2 (i,m) VALUES (1, 2) ON DUPLICATE KEY UPDATE m=3;
|
||||||
|
SELECT * FROM t2;
|
||||||
|
DROP TABLE t2, t1;
|
@ -99,7 +99,7 @@ DROP VIEW v1;
|
|||||||
ERROR 42S02: Unknown VIEW: 'test.v1'
|
ERROR 42S02: Unknown VIEW: 'test.v1'
|
||||||
DROP VIEW IF EXISTS v2;
|
DROP VIEW IF EXISTS v2;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4090 Unknown VIEW: 'test.v2'
|
Note 4091 Unknown VIEW: 'test.v2'
|
||||||
# Syncing slave with master
|
# Syncing slave with master
|
||||||
connection slave;
|
connection slave;
|
||||||
SELECT * FROM v1;
|
SELECT * FROM v1;
|
||||||
|
@ -128,7 +128,7 @@ show warnings;
|
|||||||
Level Code Message
|
Level Code Message
|
||||||
Error 1062 Duplicate entry '20' for key 'a'
|
Error 1062 Duplicate entry '20' for key 'a'
|
||||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||||
Note 4092 At line 4 in mysqltest1.foo4
|
Note 4093 At line 4 in mysqltest1.foo4
|
||||||
select * from t2;
|
select * from t2;
|
||||||
a
|
a
|
||||||
20
|
20
|
||||||
@ -291,7 +291,7 @@ end|
|
|||||||
do fn1(100);
|
do fn1(100);
|
||||||
Warnings:
|
Warnings:
|
||||||
Error 1062 Duplicate entry '100' for key 'a'
|
Error 1062 Duplicate entry '100' for key 'a'
|
||||||
Note 4092 At line 3 in mysqltest1.fn1
|
Note 4093 At line 3 in mysqltest1.fn1
|
||||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||||
select fn1(20);
|
select fn1(20);
|
||||||
ERROR 23000: Duplicate entry '20' for key 'a'
|
ERROR 23000: Duplicate entry '20' for key 'a'
|
||||||
|
@ -212,7 +212,7 @@ ERROR 42S02: 'test.t1' is not a SEQUENCE
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
alter sequence if exists t1 minvalue=100;
|
alter sequence if exists t1 minvalue=100;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4089 Unknown SEQUENCE: 'test.t1'
|
Note 4090 Unknown SEQUENCE: 'test.t1'
|
||||||
alter sequence t1 minvalue=100;
|
alter sequence t1 minvalue=100;
|
||||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||||
create sequence t1;
|
create sequence t1;
|
||||||
|
@ -165,7 +165,7 @@ drop sequence t1;
|
|||||||
ERROR 42S02: 'test.t1' is not a SEQUENCE
|
ERROR 42S02: 'test.t1' is not a SEQUENCE
|
||||||
drop sequence if exists t1;
|
drop sequence if exists t1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4089 Unknown SEQUENCE: 'test.t1'
|
Note 4090 Unknown SEQUENCE: 'test.t1'
|
||||||
create sequence t1 start with 10 maxvalue=9;
|
create sequence t1 start with 10 maxvalue=9;
|
||||||
ERROR HY000: Sequence 'test.t1' values are conflicting
|
ERROR HY000: Sequence 'test.t1' values are conflicting
|
||||||
create sequence t1 minvalue= 100 maxvalue=10;
|
create sequence t1 minvalue= 100 maxvalue=10;
|
||||||
@ -377,7 +377,7 @@ key key1 (next_not_cached_value)
|
|||||||
ERROR HY000: Sequence 'test.t1' table structure is invalid (Sequence tables cannot have any keys)
|
ERROR HY000: Sequence 'test.t1' table structure is invalid (Sequence tables cannot have any keys)
|
||||||
drop sequence if exists t1;
|
drop sequence if exists t1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4089 Unknown SEQUENCE: 'test.t1'
|
Note 4090 Unknown SEQUENCE: 'test.t1'
|
||||||
create sequence t1;
|
create sequence t1;
|
||||||
create sequence t2;
|
create sequence t2;
|
||||||
create table t3 (a int) engine=myisam;
|
create table t3 (a int) engine=myisam;
|
||||||
@ -387,8 +387,8 @@ CREATE SEQUENCE s1;
|
|||||||
drop sequence s1;
|
drop sequence s1;
|
||||||
drop sequence if exists t1,t2,t3,t4;
|
drop sequence if exists t1,t2,t3,t4;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4089 Unknown SEQUENCE: 'test.t3'
|
Note 4090 Unknown SEQUENCE: 'test.t3'
|
||||||
Note 4089 Unknown SEQUENCE: 'test.t4'
|
Note 4090 Unknown SEQUENCE: 'test.t4'
|
||||||
drop table if exists t1,t2,t3;
|
drop table if exists t1,t2,t3;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1051 Unknown table 'test.t1'
|
Note 1051 Unknown table 'test.t1'
|
||||||
@ -414,9 +414,9 @@ CREATE TABLE t2 (a int);
|
|||||||
CREATE SEQUENCE s1;
|
CREATE SEQUENCE s1;
|
||||||
drop sequence if exists t1,t2,s1,s2;
|
drop sequence if exists t1,t2,s1,s2;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 4089 Unknown SEQUENCE: 'test.t1'
|
Note 4090 Unknown SEQUENCE: 'test.t1'
|
||||||
Note 4089 Unknown SEQUENCE: 'test.t2'
|
Note 4090 Unknown SEQUENCE: 'test.t2'
|
||||||
Note 4089 Unknown SEQUENCE: 'test.s2'
|
Note 4090 Unknown SEQUENCE: 'test.s2'
|
||||||
drop table if exists t1,t2;
|
drop table if exists t1,t2;
|
||||||
CREATE TEMPORARY SEQUENCE s1;
|
CREATE TEMPORARY SEQUENCE s1;
|
||||||
DROP SEQUENCE s1;
|
DROP SEQUENCE s1;
|
||||||
|
@ -790,3 +790,54 @@ SHOW CREATE VIEW cte_test;
|
|||||||
SELECT * FROM cte_test;
|
SELECT * FROM cte_test;
|
||||||
|
|
||||||
DROP VIEW cte_test;
|
DROP VIEW cte_test;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-13453: privileges checking for CTE
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create database db;
|
||||||
|
use db;
|
||||||
|
create table t1 (i int);
|
||||||
|
insert into t1
|
||||||
|
values (3), (7), (1), (4), (2), (3), (1);
|
||||||
|
|
||||||
|
create table t2 (a int, b int);
|
||||||
|
insert into t2
|
||||||
|
values (3,10), (7,11), (1,17), (4,15), (2,11), (3,10), (1,15);
|
||||||
|
|
||||||
|
create user foo@localhost;
|
||||||
|
grant SELECT on db.t1 to foo@localhost;
|
||||||
|
grant SELECT(a) on db.t2 to foo@localhost;
|
||||||
|
|
||||||
|
--connect (con1,localhost,foo,,)
|
||||||
|
use db;
|
||||||
|
with cte as (select * from t1 where i < 4)
|
||||||
|
select * from cte;
|
||||||
|
with cte as (select * from t1 where i < 4 group by i)
|
||||||
|
select * from cte;
|
||||||
|
with cte as (select * from t1 where i < 4)
|
||||||
|
select * from cte cte1 where i < 2 union select * from cte cte2 where i > 2;
|
||||||
|
with cte as (select * from t1 where i < 4 group by i)
|
||||||
|
select * from cte cte1 where i < 2 union select * from cte cte2 where i > 2;
|
||||||
|
|
||||||
|
--error ER_COLUMNACCESS_DENIED_ERROR
|
||||||
|
with cte as (select b from t2 where a < 4)
|
||||||
|
select * from cte cte1 where b < 15 union select * from cte cte2 where b > 15;
|
||||||
|
with cte as (select a from t2 where a < 4)
|
||||||
|
select * from cte cte1 where a < 2 union select * from cte cte2 where a > 2;
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
revoke SELECT on db.t1 from foo@localhost;
|
||||||
|
|
||||||
|
--connection con1
|
||||||
|
|
||||||
|
--error ER_TABLEACCESS_DENIED_ERROR
|
||||||
|
with cte as (select * from t1 where i < 4)
|
||||||
|
select * from cte;
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
--disconnect con1
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
drop database db;
|
||||||
|
drop user foo@localhost;
|
||||||
|
@ -9,6 +9,7 @@ select json_value('{"key1":123}', '$.key2');
|
|||||||
select json_value('{"key1":123}', '$.key1');
|
select json_value('{"key1":123}', '$.key1');
|
||||||
select json_value('{"key1":[1,2,3]}', '$.key1');
|
select json_value('{"key1":[1,2,3]}', '$.key1');
|
||||||
select json_value('{"key1": [1,2,3], "key1":123}', '$.key1');
|
select json_value('{"key1": [1,2,3], "key1":123}', '$.key1');
|
||||||
|
select JSON_VALUE('{ "x": [0,1], "y": "[0,1]", "z": "Mon\\\"t\\\"y" }','$.z');
|
||||||
|
|
||||||
select json_query('{"key1":{"a":1, "b":[1,2]}}', '$.key2');
|
select json_query('{"key1":{"a":1, "b":[1,2]}}', '$.key2');
|
||||||
select json_query('{"key1":{"a":1, "b":[1,2]}}', '$.key1');
|
select json_query('{"key1":{"a":1, "b":[1,2]}}', '$.key1');
|
||||||
@ -377,6 +378,11 @@ SELECT JSON_OBJECT("user","Jožko Mrkvičká") as json_data;
|
|||||||
|
|
||||||
select json_contains_path('{"foo":"bar"}', 'one', '$[]');
|
select json_contains_path('{"foo":"bar"}', 'one', '$[]');
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-13971 crash in skip_num_constant.
|
||||||
|
#
|
||||||
|
select JSON_VALID(0x36f0c8dccd83c5eac156da);
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Start of 10.3 tests
|
--echo # Start of 10.3 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -40,6 +40,10 @@ SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(5.363 7.266)'),10);
|
|||||||
SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 1);
|
SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 1);
|
||||||
SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5);
|
SELECT ST_AsGeoJSON(ST_GeomFromText("POINT(10 11)"), 100, 5);
|
||||||
|
|
||||||
|
SELECT st_astext(st_geomfromgeojson('{"type": "MultiLineString","coordinates": []}')) as a;
|
||||||
|
SELECT st_astext(st_geomfromgeojson('{"type": "Polygon","coordinates": []}')) as a;
|
||||||
|
SELECT st_astext(st_geomfromgeojson('{"type": "MultiPolygon","coordinates": []}')) as a;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -2106,3 +2106,46 @@ INSERT INTO t1 VALUES (1),(2),(3);
|
|||||||
SELECT DISTINCT pk FROM t1 GROUP BY 'foo';
|
SELECT DISTINCT pk FROM t1 GROUP BY 'foo';
|
||||||
SELECT DISTINCT pk FROM t1;
|
SELECT DISTINCT pk FROM t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-13994: Bad join results with orderby_uses_equalities=on
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE books (
|
||||||
|
id int(16) NOT NULL AUTO_INCREMENT,
|
||||||
|
library_id int(16) NOT NULL DEFAULT 0,
|
||||||
|
wings_id int(12) NOT NULL DEFAULT 0,
|
||||||
|
scheduled_for_removal int(1) DEFAULT 0,
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
KEY library_idx (library_id)
|
||||||
|
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
INSERT INTO books VALUES (32625,8663,707,0),(32624,8663,505,1);
|
||||||
|
|
||||||
|
CREATE TABLE wings (
|
||||||
|
id int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
department_id int(11) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (id)
|
||||||
|
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
INSERT INTO wings VALUES (505,11745),(707,11768);
|
||||||
|
|
||||||
|
let $q=
|
||||||
|
SELECT wings.id as wing_id, wings.department_id FROM wings
|
||||||
|
WHERE wings.id IN ( SELECT books.wings_id FROM books
|
||||||
|
WHERE books.library_id = 8663 AND
|
||||||
|
books.scheduled_for_removal=0 )
|
||||||
|
ORDER BY wings.id;
|
||||||
|
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
|
||||||
|
SET optimizer_switch='orderby_uses_equalities=off';
|
||||||
|
eval $q;
|
||||||
|
|
||||||
|
SET optimizer_switch='orderby_uses_equalities=on';
|
||||||
|
eval $q;
|
||||||
|
eval explain extended $q;
|
||||||
|
|
||||||
|
set optimizer_switch= @save_optimizer_switch;
|
||||||
|
|
||||||
|
DROP TABLE books, wings;
|
||||||
|
@ -61,3 +61,50 @@ from t1
|
|||||||
where key1<3 or key2<3;
|
where key1<3 or key2<3;
|
||||||
|
|
||||||
drop table t0, t1;
|
drop table t0, t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-14071: wrong results with orderby_uses_equalities=on
|
||||||
|
--echo # (duplicate of MDEV-13994)
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i int, j int, z int,PRIMARY KEY (i,j), KEY (z)) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 (i int, j int, PRIMARY KEY (i,j)) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t3 (j int, n varchar(5), PRIMARY KEY (j)) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(127,0,1),(188,0,1),(206,0,1),(218,0,1),(292,0,1),(338,0,1),(375,0,1),
|
||||||
|
(381,0,1),(409,0,1),(466,0,1),(469,0,1),(498,0,1),(656,0,1);
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(77,4,0),(86,7,0),(96,6,0),(96,7,0),(99,9,0),(99,10,0),(99,11,0),(104,4,0),
|
||||||
|
(106,5,0),(148,6,0),(177,6,0),(181,5,0),(188,8,0),(218,8,0),(253,7,0),
|
||||||
|
(268,4,0),(338,4,0),(409,7,0),(466,8,0),(469,8,0),(498,8,0),(656,8,0);
|
||||||
|
|
||||||
|
INSERT INTO t2 VALUES
|
||||||
|
(127,7),(188,8),(188,9),(206,6),(218,8),(218,9),(292,7),(338,4),(338,5),
|
||||||
|
(375,6),(381,5),(409,7),(409,8),(466,8),(466,9),(469,8),(469,9),(498,8),
|
||||||
|
(498,9),(656,8),(656,9);
|
||||||
|
INSERT INTO t3 VALUES
|
||||||
|
(4,'four'),(5,'five'),(6,'six'),(7,'seven'),(8,'eight'),(9,'nine');
|
||||||
|
|
||||||
|
let $q1=
|
||||||
|
SELECT i,n
|
||||||
|
FROM t1 INNER JOIN t2 USING (i,j) LEFT JOIN t3 USING (j)
|
||||||
|
WHERE i IN (SELECT i FROM t1 WHERE z=1) AND z=0 ORDER BY i;
|
||||||
|
let $q2=
|
||||||
|
SELECT i,n
|
||||||
|
FROM t1 x INNER JOIN t2 USING (i,j) LEFT JOIN t3 USING (j)
|
||||||
|
WHERE EXISTS (SELECT * FROM t1 WHERE i=x.i AND z=1) AND z=0 ORDER BY i;
|
||||||
|
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
|
||||||
|
SET optimizer_switch='orderby_uses_equalities=off';
|
||||||
|
eval $q1;
|
||||||
|
eval $q2;
|
||||||
|
|
||||||
|
SET optimizer_switch='orderby_uses_equalities=on';
|
||||||
|
eval $q1;
|
||||||
|
eval $q2;
|
||||||
|
|
||||||
|
set optimizer_switch= @save_optimizer_switch;
|
||||||
|
|
||||||
|
DROP TABLE t1,t2,t3;
|
||||||
|
@ -4476,3 +4476,56 @@ EXECUTE IMMEDIATE 'CALL p1(?)' USING DEFAULT;
|
|||||||
--error ER_SP_NOT_VAR_ARG
|
--error ER_SP_NOT_VAR_ARG
|
||||||
EXECUTE IMMEDIATE 'CALL p1(?)' USING IGNORE;
|
EXECUTE IMMEDIATE 'CALL p1(?)' USING IGNORE;
|
||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-14434 Wrong result for CHARSET(CONCAT(?,const))
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8;
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(5,_latin1'a'))";
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5;
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5.5;
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING 5.5e0;
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING TIME'10:20:30';
|
||||||
|
EXECUTE IMMEDIATE "SELECT CHARSET(CONCAT(?,_latin1'a'))" USING TIMESTAMP'2001-01-01 10:20:30';
|
||||||
|
|
||||||
|
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5;
|
||||||
|
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5.5;
|
||||||
|
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5.5e0;
|
||||||
|
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING TIME'10:20:30';
|
||||||
|
EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING TIMESTAMP'2001-01-01 10:20:30';
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-14435 Different UNSIGNED flag of out user variable for YEAR parameter for direct vs prepared CALL
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE PROCEDURE p1(OUT v INT UNSIGNED) SET v = 2010;
|
||||||
|
CALL p1(@a);
|
||||||
|
PREPARE stmt FROM 'CALL p1(?)';
|
||||||
|
EXECUTE stmt USING @b;
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
CREATE TABLE t1 AS SELECT @a AS a, @b AS b;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
|
||||||
|
CREATE PROCEDURE p1(OUT v YEAR) SET v = 2010;
|
||||||
|
CALL p1(@a);
|
||||||
|
PREPARE stmt FROM 'CALL p1(?)';
|
||||||
|
EXECUTE stmt USING @b;
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
CREATE TABLE t1 AS SELECT @a AS a, @b AS b;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
|
||||||
|
CREATE PROCEDURE p1(OUT v BIT(16)) SET v = 2010;
|
||||||
|
CALL p1(@a);
|
||||||
|
PREPARE stmt FROM 'CALL p1(?)';
|
||||||
|
EXECUTE stmt USING @b;
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
CREATE TABLE t1 AS SELECT @a AS a, @b AS b;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
@ -3783,6 +3783,7 @@ void Item_param::set_int(longlong i, uint32 max_length_arg)
|
|||||||
DBUG_ENTER("Item_param::set_int");
|
DBUG_ENTER("Item_param::set_int");
|
||||||
value.integer= (longlong) i;
|
value.integer= (longlong) i;
|
||||||
state= INT_VALUE;
|
state= INT_VALUE;
|
||||||
|
collation.set_numeric();
|
||||||
max_length= max_length_arg;
|
max_length= max_length_arg;
|
||||||
decimals= 0;
|
decimals= 0;
|
||||||
maybe_null= 0;
|
maybe_null= 0;
|
||||||
@ -3795,6 +3796,7 @@ void Item_param::set_double(double d)
|
|||||||
DBUG_ENTER("Item_param::set_double");
|
DBUG_ENTER("Item_param::set_double");
|
||||||
value.real= d;
|
value.real= d;
|
||||||
state= REAL_VALUE;
|
state= REAL_VALUE;
|
||||||
|
collation.set_numeric();
|
||||||
max_length= DBL_DIG + 8;
|
max_length= DBL_DIG + 8;
|
||||||
decimals= NOT_FIXED_DEC;
|
decimals= NOT_FIXED_DEC;
|
||||||
maybe_null= 0;
|
maybe_null= 0;
|
||||||
@ -3824,6 +3826,7 @@ void Item_param::set_decimal(const char *str, ulong length)
|
|||||||
str2my_decimal(E_DEC_FATAL_ERROR, str, &decimal_value, &end);
|
str2my_decimal(E_DEC_FATAL_ERROR, str, &decimal_value, &end);
|
||||||
state= DECIMAL_VALUE;
|
state= DECIMAL_VALUE;
|
||||||
decimals= decimal_value.frac;
|
decimals= decimal_value.frac;
|
||||||
|
collation.set_numeric();
|
||||||
max_length=
|
max_length=
|
||||||
my_decimal_precision_to_length_no_truncation(decimal_value.precision(),
|
my_decimal_precision_to_length_no_truncation(decimal_value.precision(),
|
||||||
decimals, unsigned_flag);
|
decimals, unsigned_flag);
|
||||||
@ -3839,6 +3842,7 @@ void Item_param::set_decimal(const my_decimal *dv, bool unsigned_arg)
|
|||||||
my_decimal2decimal(dv, &decimal_value);
|
my_decimal2decimal(dv, &decimal_value);
|
||||||
|
|
||||||
decimals= (uint8) decimal_value.frac;
|
decimals= (uint8) decimal_value.frac;
|
||||||
|
collation.set_numeric();
|
||||||
unsigned_flag= unsigned_arg;
|
unsigned_flag= unsigned_arg;
|
||||||
max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
|
max_length= my_decimal_precision_to_length(decimal_value.intg + decimals,
|
||||||
decimals, unsigned_flag);
|
decimals, unsigned_flag);
|
||||||
@ -3849,6 +3853,7 @@ void Item_param::set_decimal(const my_decimal *dv, bool unsigned_arg)
|
|||||||
void Item_param::fix_temporal(uint32 max_length_arg, uint decimals_arg)
|
void Item_param::fix_temporal(uint32 max_length_arg, uint decimals_arg)
|
||||||
{
|
{
|
||||||
state= TIME_VALUE;
|
state= TIME_VALUE;
|
||||||
|
collation.set_numeric();
|
||||||
max_length= max_length_arg;
|
max_length= max_length_arg;
|
||||||
decimals= decimals_arg;
|
decimals= decimals_arg;
|
||||||
fix_type(Item::DATE_ITEM);
|
fix_type(Item::DATE_ITEM);
|
||||||
@ -4579,6 +4584,7 @@ Item_param::set_value(THD *thd, sp_rcontext *ctx, Item **it)
|
|||||||
}
|
}
|
||||||
|
|
||||||
null_value= FALSE;
|
null_value= FALSE;
|
||||||
|
unsigned_flag= arg->unsigned_flag;
|
||||||
|
|
||||||
switch (arg->result_type()) {
|
switch (arg->result_type()) {
|
||||||
case STRING_RESULT:
|
case STRING_RESULT:
|
||||||
|
@ -165,6 +165,9 @@ String *Item_func_geometry_from_json::val_str(String *str)
|
|||||||
case Geometry::GEOJ_TOO_FEW_POINTS:
|
case Geometry::GEOJ_TOO_FEW_POINTS:
|
||||||
code= ER_GEOJSON_TOO_FEW_POINTS;
|
code= ER_GEOJSON_TOO_FEW_POINTS;
|
||||||
break;
|
break;
|
||||||
|
case Geometry::GEOJ_EMPTY_COORDINATES:
|
||||||
|
code= ER_GEOJSON_EMPTY_COORDINATES;
|
||||||
|
break;
|
||||||
case Geometry::GEOJ_POLYGON_NOT_CLOSED:
|
case Geometry::GEOJ_POLYGON_NOT_CLOSED:
|
||||||
code= ER_GEOJSON_NOT_CLOSED;
|
code= ER_GEOJSON_NOT_CLOSED;
|
||||||
break;
|
break;
|
||||||
|
@ -69,6 +69,7 @@ static inline bool append_simple(String *s, const uchar *a, size_t a_len)
|
|||||||
/*
|
/*
|
||||||
Appends JSON string to the String object taking charsets in
|
Appends JSON string to the String object taking charsets in
|
||||||
consideration.
|
consideration.
|
||||||
|
*/
|
||||||
static int st_append_json(String *s,
|
static int st_append_json(String *s,
|
||||||
CHARSET_INFO *json_cs, const uchar *js, uint js_len)
|
CHARSET_INFO *json_cs, const uchar *js, uint js_len)
|
||||||
{
|
{
|
||||||
@ -82,9 +83,8 @@ static int st_append_json(String *s,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return js_len;
|
return str_len;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -475,6 +475,9 @@ String *Item_func_json_value::val_str(String *str)
|
|||||||
json_scan_start(&je, js->charset(),(const uchar *) js->ptr(),
|
json_scan_start(&je, js->charset(),(const uchar *) js->ptr(),
|
||||||
(const uchar *) js->ptr() + js->length());
|
(const uchar *) js->ptr() + js->length());
|
||||||
|
|
||||||
|
str->length(0);
|
||||||
|
str->set_charset(&my_charset_utf8mb4_bin);
|
||||||
|
|
||||||
path.cur_step= path.p.steps;
|
path.cur_step= path.p.steps;
|
||||||
continue_search:
|
continue_search:
|
||||||
if (json_find_path(&je, &path.p, &path.cur_step, array_counters))
|
if (json_find_path(&je, &path.p, &path.cur_step, array_counters))
|
||||||
@ -515,8 +518,7 @@ bool Item_func_json_value::check_and_get_value(json_engine_t *je, String *res,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
res->set((const char *) je->value, je->value_len, je->s.cs);
|
return st_append_json(res, je->s.cs, je->value, je->value_len);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -7747,6 +7747,9 @@ ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
|||||||
ER_NET_OK_PACKET_TOO_LARGE
|
ER_NET_OK_PACKET_TOO_LARGE
|
||||||
eng "OK packet too large"
|
eng "OK packet too large"
|
||||||
|
|
||||||
|
ER_GEOJSON_EMPTY_COORDINATES
|
||||||
|
eng "Incorrect GeoJSON format - empty 'coordinates' array."
|
||||||
|
|
||||||
ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
|
ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
|
||||||
eng "Illegal parameter data types %s and %s for operation '%s'"
|
eng "Illegal parameter data types %s and %s for operation '%s'"
|
||||||
ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
|
ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
|
||||||
|
@ -1041,7 +1041,7 @@ bool Gis_line_string::init_from_json(json_engine_t *je, bool er_on_3D,
|
|||||||
}
|
}
|
||||||
if (n_points < 1)
|
if (n_points < 1)
|
||||||
{
|
{
|
||||||
je->s.error= GEOJ_TOO_FEW_POINTS;
|
je->s.error= Geometry::GEOJ_TOO_FEW_POINTS;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
wkb->write_at_position(np_pos, n_points);
|
wkb->write_at_position(np_pos, n_points);
|
||||||
@ -1440,6 +1440,15 @@ bool Gis_polygon::init_from_json(json_engine_t *je, bool er_on_3D, String *wkb)
|
|||||||
}
|
}
|
||||||
n_linear_rings++;
|
n_linear_rings++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (je->s.error)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (n_linear_rings == 0)
|
||||||
|
{
|
||||||
|
je->s.error= Geometry::GEOJ_EMPTY_COORDINATES;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
wkb->write_at_position(lr_pos, n_linear_rings);
|
wkb->write_at_position(lr_pos, n_linear_rings);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -1945,6 +1954,14 @@ bool Gis_multi_point::init_from_json(json_engine_t *je, bool er_on_3D,
|
|||||||
n_points++;
|
n_points++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (je->s.error)
|
||||||
|
return TRUE;
|
||||||
|
if (n_points == 0)
|
||||||
|
{
|
||||||
|
je->s.error= Geometry::GEOJ_EMPTY_COORDINATES;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
wkb->write_at_position(np_pos, n_points);
|
wkb->write_at_position(np_pos, n_points);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -2214,6 +2231,15 @@ bool Gis_multi_line_string::init_from_json(json_engine_t *je, bool er_on_3D,
|
|||||||
|
|
||||||
n_line_strings++;
|
n_line_strings++;
|
||||||
}
|
}
|
||||||
|
if (je->s.error)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (n_line_strings == 0)
|
||||||
|
{
|
||||||
|
je->s.error= Geometry::GEOJ_EMPTY_COORDINATES;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
wkb->write_at_position(ls_pos, n_line_strings);
|
wkb->write_at_position(ls_pos, n_line_strings);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -2603,6 +2629,13 @@ bool Gis_multi_polygon::init_from_json(json_engine_t *je, bool er_on_3D,
|
|||||||
|
|
||||||
n_polygons++;
|
n_polygons++;
|
||||||
}
|
}
|
||||||
|
if (je->s.error)
|
||||||
|
return TRUE;
|
||||||
|
if (n_polygons == 0)
|
||||||
|
{
|
||||||
|
je->s.error= Geometry::GEOJ_EMPTY_COORDINATES;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
wkb->write_at_position(np_pos, n_polygons);
|
wkb->write_at_position(np_pos, n_polygons);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -256,6 +256,7 @@ public:
|
|||||||
GEOJ_TOO_FEW_POINTS= 2,
|
GEOJ_TOO_FEW_POINTS= 2,
|
||||||
GEOJ_POLYGON_NOT_CLOSED= 3,
|
GEOJ_POLYGON_NOT_CLOSED= 3,
|
||||||
GEOJ_DIMENSION_NOT_SUPPORTED= 4,
|
GEOJ_DIMENSION_NOT_SUPPORTED= 4,
|
||||||
|
GEOJ_EMPTY_COORDINATES= 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -7593,6 +7593,11 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
|||||||
INSERT_ACL : SELECT_ACL);
|
INSERT_ACL : SELECT_ACL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tl->with ||
|
||||||
|
(tl->select_lex &&
|
||||||
|
(tl->with= tl->select_lex->find_table_def_in_with_clauses(tl))))
|
||||||
|
continue;
|
||||||
|
|
||||||
const ACL_internal_table_access *access=
|
const ACL_internal_table_access *access=
|
||||||
get_cached_table_access(&t_ref->grant.m_internal,
|
get_cached_table_access(&t_ref->grant.m_internal,
|
||||||
t_ref->get_db_name(),
|
t_ref->get_db_name(),
|
||||||
|
@ -822,9 +822,10 @@ st_select_lex_unit *With_element::clone_parsed_spec(THD *thd,
|
|||||||
tbl;
|
tbl;
|
||||||
tbl= tbl->next_global)
|
tbl= tbl->next_global)
|
||||||
{
|
{
|
||||||
tbl->grant.privilege= with_table->grant.privilege;
|
|
||||||
spec_tables_tail= tbl;
|
spec_tables_tail= tbl;
|
||||||
}
|
}
|
||||||
|
if (check_table_access(thd, SELECT_ACL, spec_tables, FALSE, UINT_MAX, FALSE))
|
||||||
|
goto err;
|
||||||
if (spec_tables)
|
if (spec_tables)
|
||||||
{
|
{
|
||||||
if (with_table->next_global)
|
if (with_table->next_global)
|
||||||
|
@ -3698,6 +3698,14 @@ mysql_execute_command(THD *thd)
|
|||||||
ulong privileges_requested= lex->exchange ? SELECT_ACL | FILE_ACL :
|
ulong privileges_requested= lex->exchange ? SELECT_ACL | FILE_ACL :
|
||||||
SELECT_ACL;
|
SELECT_ACL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The same function must be called for DML commands
|
||||||
|
when CTEs are supported in DML statements
|
||||||
|
*/
|
||||||
|
res= check_dependencies_in_with_clauses(thd->lex->with_clauses_list);
|
||||||
|
if (res)
|
||||||
|
break;
|
||||||
|
|
||||||
if (all_tables)
|
if (all_tables)
|
||||||
res= check_table_access(thd,
|
res= check_table_access(thd,
|
||||||
privileges_requested,
|
privileges_requested,
|
||||||
|
@ -12848,8 +12848,37 @@ remove_const(JOIN *join,ORDER *first_order, COND *cond,
|
|||||||
can be used without tmp. table.
|
can be used without tmp. table.
|
||||||
*/
|
*/
|
||||||
bool can_subst_to_first_table= false;
|
bool can_subst_to_first_table= false;
|
||||||
|
bool first_is_in_sjm_nest= false;
|
||||||
|
if (first_is_base_table)
|
||||||
|
{
|
||||||
|
TABLE_LIST *tbl_for_first=
|
||||||
|
join->join_tab[join->const_tables].table->pos_in_table_list;
|
||||||
|
first_is_in_sjm_nest= tbl_for_first->sj_mat_info &&
|
||||||
|
tbl_for_first->sj_mat_info->is_used;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Currently we do not employ the optimization that uses multiple
|
||||||
|
equalities for ORDER BY to remove tmp table in the case when
|
||||||
|
the first table happens to be the result of materialization of
|
||||||
|
a semi-join nest ( <=> first_is_in_sjm_nest == true).
|
||||||
|
|
||||||
|
When a semi-join nest is materialized and scanned to look for
|
||||||
|
possible matches in the remaining tables for every its row
|
||||||
|
the fields from the result of materialization are copied
|
||||||
|
into the record buffers of tables from the semi-join nest.
|
||||||
|
So these copies are used to access the remaining tables rather
|
||||||
|
than the fields from the result of materialization.
|
||||||
|
|
||||||
|
Unfortunately now this so-called 'copy back' technique is
|
||||||
|
supported only if the rows are scanned with the rr_sequential
|
||||||
|
function, but not with other rr_* functions that are employed
|
||||||
|
when the result of materialization is required to be sorted.
|
||||||
|
|
||||||
|
TODO: either to support 'copy back' technique for the above case,
|
||||||
|
or to get rid of this technique altogether.
|
||||||
|
*/
|
||||||
if (optimizer_flag(join->thd, OPTIMIZER_SWITCH_ORDERBY_EQ_PROP) &&
|
if (optimizer_flag(join->thd, OPTIMIZER_SWITCH_ORDERBY_EQ_PROP) &&
|
||||||
first_is_base_table &&
|
first_is_base_table && !first_is_in_sjm_nest &&
|
||||||
order->item[0]->real_item()->type() == Item::FIELD_ITEM &&
|
order->item[0]->real_item()->type() == Item::FIELD_ITEM &&
|
||||||
join->cond_equal)
|
join->cond_equal)
|
||||||
{
|
{
|
||||||
|
@ -2212,7 +2212,7 @@ buf_resize_status(
|
|||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
|
|
||||||
ut_vsnprintf(
|
vsnprintf(
|
||||||
export_vars.innodb_buffer_pool_resize_status,
|
export_vars.innodb_buffer_pool_resize_status,
|
||||||
sizeof(export_vars.innodb_buffer_pool_resize_status),
|
sizeof(export_vars.innodb_buffer_pool_resize_status),
|
||||||
fmt, ap);
|
fmt, ap);
|
||||||
@ -4298,10 +4298,8 @@ loop:
|
|||||||
case BUF_GET_IF_IN_POOL_OR_WATCH:
|
case BUF_GET_IF_IN_POOL_OR_WATCH:
|
||||||
case BUF_PEEK_IF_IN_POOL:
|
case BUF_PEEK_IF_IN_POOL:
|
||||||
case BUF_EVICT_IF_IN_POOL:
|
case BUF_EVICT_IF_IN_POOL:
|
||||||
#ifdef UNIV_SYNC_DEBUG
|
|
||||||
ut_ad(!rw_lock_own(hash_lock, RW_LOCK_X));
|
ut_ad(!rw_lock_own(hash_lock, RW_LOCK_X));
|
||||||
ut_ad(!rw_lock_own(hash_lock, RW_LOCK_S));
|
ut_ad(!rw_lock_own(hash_lock, RW_LOCK_S));
|
||||||
#endif /* UNIV_SYNC_DEBUG */
|
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,6 @@ Created April 08, 2011 Vasil Dimov
|
|||||||
#include "mysql/service_wsrep.h" /* wsrep_recovery */
|
#include "mysql/service_wsrep.h" /* wsrep_recovery */
|
||||||
|
|
||||||
enum status_severity {
|
enum status_severity {
|
||||||
STATUS_VERBOSE,
|
|
||||||
STATUS_INFO,
|
STATUS_INFO,
|
||||||
STATUS_ERR
|
STATUS_ERR
|
||||||
};
|
};
|
||||||
@ -120,7 +119,7 @@ buf_dump_status(
|
|||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
|
|
||||||
ut_vsnprintf(
|
vsnprintf(
|
||||||
export_vars.innodb_buffer_pool_dump_status,
|
export_vars.innodb_buffer_pool_dump_status,
|
||||||
sizeof(export_vars.innodb_buffer_pool_dump_status),
|
sizeof(export_vars.innodb_buffer_pool_dump_status),
|
||||||
fmt, ap);
|
fmt, ap);
|
||||||
@ -133,9 +132,6 @@ buf_dump_status(
|
|||||||
case STATUS_ERR:
|
case STATUS_ERR:
|
||||||
ib::error() << export_vars.innodb_buffer_pool_dump_status;
|
ib::error() << export_vars.innodb_buffer_pool_dump_status;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATUS_VERBOSE:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@ -162,7 +158,7 @@ buf_load_status(
|
|||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
|
|
||||||
ut_vsnprintf(
|
vsnprintf(
|
||||||
export_vars.innodb_buffer_pool_load_status,
|
export_vars.innodb_buffer_pool_load_status,
|
||||||
sizeof(export_vars.innodb_buffer_pool_load_status),
|
sizeof(export_vars.innodb_buffer_pool_load_status),
|
||||||
fmt, ap);
|
fmt, ap);
|
||||||
@ -175,9 +171,6 @@ buf_load_status(
|
|||||||
case STATUS_ERR:
|
case STATUS_ERR:
|
||||||
ib::error() << export_vars.innodb_buffer_pool_load_status;
|
ib::error() << export_vars.innodb_buffer_pool_load_status;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATUS_VERBOSE:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@ -213,8 +206,8 @@ buf_dump_generate_path(
|
|||||||
{
|
{
|
||||||
char buf[FN_REFLEN];
|
char buf[FN_REFLEN];
|
||||||
|
|
||||||
ut_snprintf(buf, sizeof(buf), "%s%c%s", get_buf_dump_dir(),
|
snprintf(buf, sizeof(buf), "%s%c%s", get_buf_dump_dir(),
|
||||||
OS_PATH_SEPARATOR, srv_buf_dump_filename);
|
OS_PATH_SEPARATOR, srv_buf_dump_filename);
|
||||||
|
|
||||||
os_file_type_t type;
|
os_file_type_t type;
|
||||||
bool exists = false;
|
bool exists = false;
|
||||||
@ -240,14 +233,14 @@ buf_dump_generate_path(
|
|||||||
if (srv_data_home_full[strlen(srv_data_home_full) - 1]
|
if (srv_data_home_full[strlen(srv_data_home_full) - 1]
|
||||||
== OS_PATH_SEPARATOR) {
|
== OS_PATH_SEPARATOR) {
|
||||||
|
|
||||||
ut_snprintf(path, path_size, "%s%s",
|
snprintf(path, path_size, "%s%s",
|
||||||
srv_data_home_full,
|
srv_data_home_full,
|
||||||
srv_buf_dump_filename);
|
srv_buf_dump_filename);
|
||||||
} else {
|
} else {
|
||||||
ut_snprintf(path, path_size, "%s%c%s",
|
snprintf(path, path_size, "%s%c%s",
|
||||||
srv_data_home_full,
|
srv_data_home_full,
|
||||||
OS_PATH_SEPARATOR,
|
OS_PATH_SEPARATOR,
|
||||||
srv_buf_dump_filename);
|
srv_buf_dump_filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -276,8 +269,8 @@ buf_dump(
|
|||||||
|
|
||||||
buf_dump_generate_path(full_filename, sizeof(full_filename));
|
buf_dump_generate_path(full_filename, sizeof(full_filename));
|
||||||
|
|
||||||
ut_snprintf(tmp_filename, sizeof(tmp_filename),
|
snprintf(tmp_filename, sizeof(tmp_filename),
|
||||||
"%s.incomplete", full_filename);
|
"%s.incomplete", full_filename);
|
||||||
|
|
||||||
buf_dump_status(STATUS_INFO, "Dumping buffer pool(s) to %s",
|
buf_dump_status(STATUS_INFO, "Dumping buffer pool(s) to %s",
|
||||||
full_filename);
|
full_filename);
|
||||||
@ -298,8 +291,6 @@ buf_dump(
|
|||||||
buf_dump_t* dump;
|
buf_dump_t* dump;
|
||||||
ulint n_pages;
|
ulint n_pages;
|
||||||
ulint j;
|
ulint j;
|
||||||
ulint limit;
|
|
||||||
ulint counter;
|
|
||||||
|
|
||||||
buf_pool = buf_pool_from_array(i);
|
buf_pool = buf_pool_from_array(i);
|
||||||
|
|
||||||
@ -368,9 +359,6 @@ buf_dump(
|
|||||||
|
|
||||||
buf_pool_mutex_exit(buf_pool);
|
buf_pool_mutex_exit(buf_pool);
|
||||||
|
|
||||||
limit = (ulint)((double)n_pages * ((double)srv_buf_dump_status_frequency / (double)100));
|
|
||||||
counter = 0;
|
|
||||||
|
|
||||||
for (j = 0; j < n_pages && !SHOULD_QUIT(); j++) {
|
for (j = 0; j < n_pages && !SHOULD_QUIT(); j++) {
|
||||||
ret = fprintf(f, ULINTPF "," ULINTPF "\n",
|
ret = fprintf(f, ULINTPF "," ULINTPF "\n",
|
||||||
BUF_DUMP_SPACE(dump[j]),
|
BUF_DUMP_SPACE(dump[j]),
|
||||||
@ -384,23 +372,6 @@ buf_dump(
|
|||||||
/* leave tmp_filename to exist */
|
/* leave tmp_filename to exist */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
counter++;
|
|
||||||
|
|
||||||
/* Print buffer pool dump status only if
|
|
||||||
srv_buf_dump_status_frequency is > 0 and
|
|
||||||
we have processed that amount of pages. */
|
|
||||||
if (srv_buf_dump_status_frequency &&
|
|
||||||
counter == limit) {
|
|
||||||
counter = 0;
|
|
||||||
buf_dump_status(
|
|
||||||
STATUS_VERBOSE,
|
|
||||||
"Dumping buffer pool"
|
|
||||||
" " ULINTPF "/%lu,"
|
|
||||||
" page " ULINTPF "/" ULINTPF,
|
|
||||||
i + 1, srv_buf_pool_instances,
|
|
||||||
j + 1, n_pages);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_free(dump);
|
ut_free(dump);
|
||||||
@ -718,21 +689,6 @@ buf_load()
|
|||||||
os_aio_simulated_wake_handler_threads();
|
os_aio_simulated_wake_handler_threads();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the progress every 32 MiB, which is every Nth page,
|
|
||||||
where N = 32*1024^2 / page_size. */
|
|
||||||
static const ulint update_status_every_n_mb = 32;
|
|
||||||
static const ulint update_status_every_n_pages
|
|
||||||
= update_status_every_n_mb * 1024 * 1024
|
|
||||||
/ page_size.physical();
|
|
||||||
|
|
||||||
if (i % update_status_every_n_pages == 0) {
|
|
||||||
buf_load_status(STATUS_VERBOSE,
|
|
||||||
"Loaded " ULINTPF "/" ULINTPF " pages",
|
|
||||||
i + 1, dump_n);
|
|
||||||
/* mysql_stage_set_work_completed(pfs_stage_progress,
|
|
||||||
i); */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buf_load_abort_flag) {
|
if (buf_load_abort_flag) {
|
||||||
if (space != NULL) {
|
if (space != NULL) {
|
||||||
fil_space_release(space);
|
fil_space_release(space);
|
||||||
@ -805,9 +761,6 @@ DECLARE_THREAD(buf_dump_thread)(void*)
|
|||||||
pfs_register_thread(buf_dump_thread_key);
|
pfs_register_thread(buf_dump_thread_key);
|
||||||
#endif */ /* UNIV_PFS_THREAD */
|
#endif */ /* UNIV_PFS_THREAD */
|
||||||
|
|
||||||
buf_dump_status(STATUS_VERBOSE, "Dumping of buffer pool not started");
|
|
||||||
buf_load_status(STATUS_VERBOSE, "Loading of buffer pool not started");
|
|
||||||
|
|
||||||
if (srv_buffer_pool_load_at_startup) {
|
if (srv_buffer_pool_load_at_startup) {
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
|
@ -6513,7 +6513,7 @@ dict_table_schema_check(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (should_print) {
|
if (should_print) {
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"Table %s not found.",
|
"Table %s not found.",
|
||||||
ut_format_name(req_schema->table_name,
|
ut_format_name(req_schema->table_name,
|
||||||
buf, sizeof(buf)));
|
buf, sizeof(buf)));
|
||||||
@ -6527,7 +6527,7 @@ dict_table_schema_check(
|
|||||||
fil_space_get(table->space) == NULL) {
|
fil_space_get(table->space) == NULL) {
|
||||||
/* missing tablespace */
|
/* missing tablespace */
|
||||||
|
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"Tablespace for table %s is missing.",
|
"Tablespace for table %s is missing.",
|
||||||
ut_format_name(req_schema->table_name,
|
ut_format_name(req_schema->table_name,
|
||||||
buf, sizeof(buf)));
|
buf, sizeof(buf)));
|
||||||
@ -6538,13 +6538,13 @@ dict_table_schema_check(
|
|||||||
ulint n_sys_cols = dict_table_get_n_sys_cols(table);
|
ulint n_sys_cols = dict_table_get_n_sys_cols(table);
|
||||||
if ((ulint) table->n_def - n_sys_cols != req_schema->n_cols) {
|
if ((ulint) table->n_def - n_sys_cols != req_schema->n_cols) {
|
||||||
/* the table has a different number of columns than required */
|
/* the table has a different number of columns than required */
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"%s has " ULINTPF " columns but should have "
|
"%s has " ULINTPF " columns but should have "
|
||||||
ULINTPF ".",
|
ULINTPF ".",
|
||||||
ut_format_name(req_schema->table_name,
|
ut_format_name(req_schema->table_name, buf,
|
||||||
buf, sizeof(buf)),
|
sizeof buf),
|
||||||
table->n_def - n_sys_cols,
|
table->n_def - n_sys_cols,
|
||||||
req_schema->n_cols);
|
req_schema->n_cols);
|
||||||
|
|
||||||
return(DB_ERROR);
|
return(DB_ERROR);
|
||||||
}
|
}
|
||||||
@ -6560,7 +6560,7 @@ dict_table_schema_check(
|
|||||||
|
|
||||||
if (j == table->n_def) {
|
if (j == table->n_def) {
|
||||||
|
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"required column %s"
|
"required column %s"
|
||||||
" not found in table %s.",
|
" not found in table %s.",
|
||||||
req_schema->columns[i].name,
|
req_schema->columns[i].name,
|
||||||
@ -6579,7 +6579,7 @@ dict_table_schema_check(
|
|||||||
|
|
||||||
CREATE_TYPES_NAMES();
|
CREATE_TYPES_NAMES();
|
||||||
|
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"Column %s in table %s is %s"
|
"Column %s in table %s is %s"
|
||||||
" but should be %s (length mismatch).",
|
" but should be %s (length mismatch).",
|
||||||
req_schema->columns[i].name,
|
req_schema->columns[i].name,
|
||||||
@ -6603,7 +6603,7 @@ dict_table_schema_check(
|
|||||||
{
|
{
|
||||||
CREATE_TYPES_NAMES();
|
CREATE_TYPES_NAMES();
|
||||||
|
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"Column %s in table %s is %s"
|
"Column %s in table %s is %s"
|
||||||
" but should be %s (type mismatch).",
|
" but should be %s (type mismatch).",
|
||||||
req_schema->columns[i].name,
|
req_schema->columns[i].name,
|
||||||
@ -6622,7 +6622,7 @@ dict_table_schema_check(
|
|||||||
|
|
||||||
CREATE_TYPES_NAMES();
|
CREATE_TYPES_NAMES();
|
||||||
|
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"Column %s in table %s is %s"
|
"Column %s in table %s is %s"
|
||||||
" but should be %s (flags mismatch).",
|
" but should be %s (flags mismatch).",
|
||||||
req_schema->columns[i].name,
|
req_schema->columns[i].name,
|
||||||
@ -6635,7 +6635,7 @@ dict_table_schema_check(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (req_schema->n_foreign != table->foreign_set.size()) {
|
if (req_schema->n_foreign != table->foreign_set.size()) {
|
||||||
ut_snprintf(
|
snprintf(
|
||||||
errstr, errstr_sz,
|
errstr, errstr_sz,
|
||||||
"Table %s has " ULINTPF " foreign key(s) pointing"
|
"Table %s has " ULINTPF " foreign key(s) pointing"
|
||||||
" to other tables, but it must have " ULINTPF ".",
|
" to other tables, but it must have " ULINTPF ".",
|
||||||
@ -6647,7 +6647,7 @@ dict_table_schema_check(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (req_schema->n_referenced != table->referenced_set.size()) {
|
if (req_schema->n_referenced != table->referenced_set.size()) {
|
||||||
ut_snprintf(
|
snprintf(
|
||||||
errstr, errstr_sz,
|
errstr, errstr_sz,
|
||||||
"There are " ULINTPF " foreign key(s) pointing to %s, "
|
"There are " ULINTPF " foreign key(s) pointing to %s, "
|
||||||
"but there must be " ULINTPF ".",
|
"but there must be " ULINTPF ".",
|
||||||
@ -6721,7 +6721,7 @@ dict_fs2utf8(
|
|||||||
&errors);
|
&errors);
|
||||||
|
|
||||||
if (errors != 0) {
|
if (errors != 0) {
|
||||||
ut_snprintf(table_utf8, table_utf8_size, "%s%s",
|
snprintf(table_utf8, table_utf8_size, "%s%s",
|
||||||
srv_mysql50_table_name_prefix, table);
|
srv_mysql50_table_name_prefix, table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1067,7 +1067,7 @@ dict_mem_create_temporary_tablename(
|
|||||||
size = dblen + (sizeof(TEMP_FILE_PREFIX) + 3 + 20 + 1 + 10);
|
size = dblen + (sizeof(TEMP_FILE_PREFIX) + 3 + 20 + 1 + 10);
|
||||||
name = static_cast<char*>(mem_heap_alloc(heap, size));
|
name = static_cast<char*>(mem_heap_alloc(heap, size));
|
||||||
memcpy(name, dbtab, dblen);
|
memcpy(name, dbtab, dblen);
|
||||||
ut_snprintf(name + dblen, size - dblen,
|
snprintf(name + dblen, size - dblen,
|
||||||
TEMP_FILE_PREFIX_INNODB UINT64PF "-" UINT32PF,
|
TEMP_FILE_PREFIX_INNODB UINT64PF "-" UINT32PF,
|
||||||
id, dict_temp_file_num);
|
id, dict_temp_file_num);
|
||||||
|
|
||||||
|
@ -2578,21 +2578,20 @@ dict_stats_save(
|
|||||||
char stat_name[16];
|
char stat_name[16];
|
||||||
char stat_description[1024];
|
char stat_description[1024];
|
||||||
|
|
||||||
ut_snprintf(stat_name, sizeof(stat_name),
|
snprintf(stat_name, sizeof(stat_name),
|
||||||
"n_diff_pfx%02u", i + 1);
|
"n_diff_pfx%02u", i + 1);
|
||||||
|
|
||||||
/* craft a string that contains the column names */
|
/* craft a string that contains the column names */
|
||||||
ut_snprintf(stat_description,
|
snprintf(stat_description, sizeof(stat_description),
|
||||||
sizeof(stat_description),
|
"%s", index->fields[0].name());
|
||||||
"%s", index->fields[0].name());
|
|
||||||
for (unsigned j = 1; j <= i; j++) {
|
for (unsigned j = 1; j <= i; j++) {
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
len = strlen(stat_description);
|
len = strlen(stat_description);
|
||||||
|
|
||||||
ut_snprintf(stat_description + len,
|
snprintf(stat_description + len,
|
||||||
sizeof(stat_description) - len,
|
sizeof(stat_description) - len,
|
||||||
",%s", index->fields[j].name());
|
",%s", index->fields[j].name());
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = dict_stats_save_index_stat(
|
ret = dict_stats_save_index_stat(
|
||||||
@ -3461,23 +3460,23 @@ dict_stats_drop_index(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ret != DB_SUCCESS) {
|
if (ret != DB_SUCCESS) {
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"Unable to delete statistics for index %s"
|
"Unable to delete statistics for index %s"
|
||||||
" from %s%s: %s. They can be deleted later using"
|
" from %s%s: %s. They can be deleted later using"
|
||||||
" DELETE FROM %s WHERE"
|
" DELETE FROM %s WHERE"
|
||||||
" database_name = '%s' AND"
|
" database_name = '%s' AND"
|
||||||
" table_name = '%s' AND"
|
" table_name = '%s' AND"
|
||||||
" index_name = '%s';",
|
" index_name = '%s';",
|
||||||
iname,
|
iname,
|
||||||
INDEX_STATS_NAME_PRINT,
|
INDEX_STATS_NAME_PRINT,
|
||||||
(ret == DB_LOCK_WAIT_TIMEOUT
|
(ret == DB_LOCK_WAIT_TIMEOUT
|
||||||
? " because the rows are locked"
|
? " because the rows are locked"
|
||||||
: ""),
|
: ""),
|
||||||
ut_strerr(ret),
|
ut_strerr(ret),
|
||||||
INDEX_STATS_NAME_PRINT,
|
INDEX_STATS_NAME_PRINT,
|
||||||
db_utf8,
|
db_utf8,
|
||||||
table_utf8,
|
table_utf8,
|
||||||
iname);
|
iname);
|
||||||
|
|
||||||
ut_print_timestamp(stderr);
|
ut_print_timestamp(stderr);
|
||||||
fprintf(stderr, " InnoDB: %s\n", errstr);
|
fprintf(stderr, " InnoDB: %s\n", errstr);
|
||||||
@ -3607,26 +3606,26 @@ dict_stats_drop_table(
|
|||||||
|
|
||||||
if (ret != DB_SUCCESS) {
|
if (ret != DB_SUCCESS) {
|
||||||
|
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"Unable to delete statistics for table %s.%s: %s."
|
"Unable to delete statistics for table %s.%s: %s."
|
||||||
" They can be deleted later using"
|
" They can be deleted later using"
|
||||||
|
|
||||||
" DELETE FROM %s WHERE"
|
" DELETE FROM %s WHERE"
|
||||||
" database_name = '%s' AND"
|
" database_name = '%s' AND"
|
||||||
" table_name = '%s';"
|
" table_name = '%s';"
|
||||||
|
|
||||||
" DELETE FROM %s WHERE"
|
" DELETE FROM %s WHERE"
|
||||||
" database_name = '%s' AND"
|
" database_name = '%s' AND"
|
||||||
" table_name = '%s';",
|
" table_name = '%s';",
|
||||||
|
|
||||||
db_utf8, table_utf8,
|
db_utf8, table_utf8,
|
||||||
ut_strerr(ret),
|
ut_strerr(ret),
|
||||||
|
|
||||||
INDEX_STATS_NAME_PRINT,
|
INDEX_STATS_NAME_PRINT,
|
||||||
db_utf8, table_utf8,
|
db_utf8, table_utf8,
|
||||||
|
|
||||||
TABLE_STATS_NAME_PRINT,
|
TABLE_STATS_NAME_PRINT,
|
||||||
db_utf8, table_utf8);
|
db_utf8, table_utf8);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(ret);
|
return(ret);
|
||||||
@ -3790,26 +3789,26 @@ dict_stats_rename_table(
|
|||||||
&& n_attempts < 5);
|
&& n_attempts < 5);
|
||||||
|
|
||||||
if (ret != DB_SUCCESS) {
|
if (ret != DB_SUCCESS) {
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"Unable to rename statistics from"
|
"Unable to rename statistics from"
|
||||||
" %s.%s to %s.%s in %s: %s."
|
" %s.%s to %s.%s in %s: %s."
|
||||||
" They can be renamed later using"
|
" They can be renamed later using"
|
||||||
|
|
||||||
" UPDATE %s SET"
|
" UPDATE %s SET"
|
||||||
" database_name = '%s',"
|
" database_name = '%s',"
|
||||||
" table_name = '%s'"
|
" table_name = '%s'"
|
||||||
" WHERE"
|
" WHERE"
|
||||||
" database_name = '%s' AND"
|
" database_name = '%s' AND"
|
||||||
" table_name = '%s';",
|
" table_name = '%s';",
|
||||||
|
|
||||||
old_db_utf8, old_table_utf8,
|
old_db_utf8, old_table_utf8,
|
||||||
new_db_utf8, new_table_utf8,
|
new_db_utf8, new_table_utf8,
|
||||||
TABLE_STATS_NAME_PRINT,
|
TABLE_STATS_NAME_PRINT,
|
||||||
ut_strerr(ret),
|
ut_strerr(ret),
|
||||||
|
|
||||||
TABLE_STATS_NAME_PRINT,
|
TABLE_STATS_NAME_PRINT,
|
||||||
new_db_utf8, new_table_utf8,
|
new_db_utf8, new_table_utf8,
|
||||||
old_db_utf8, old_table_utf8);
|
old_db_utf8, old_table_utf8);
|
||||||
mutex_exit(&dict_sys->mutex);
|
mutex_exit(&dict_sys->mutex);
|
||||||
rw_lock_x_unlock(dict_operation_lock);
|
rw_lock_x_unlock(dict_operation_lock);
|
||||||
return(ret);
|
return(ret);
|
||||||
@ -3849,26 +3848,26 @@ dict_stats_rename_table(
|
|||||||
rw_lock_x_unlock(dict_operation_lock);
|
rw_lock_x_unlock(dict_operation_lock);
|
||||||
|
|
||||||
if (ret != DB_SUCCESS) {
|
if (ret != DB_SUCCESS) {
|
||||||
ut_snprintf(errstr, errstr_sz,
|
snprintf(errstr, errstr_sz,
|
||||||
"Unable to rename statistics from"
|
"Unable to rename statistics from"
|
||||||
" %s.%s to %s.%s in %s: %s."
|
" %s.%s to %s.%s in %s: %s."
|
||||||
" They can be renamed later using"
|
" They can be renamed later using"
|
||||||
|
|
||||||
" UPDATE %s SET"
|
" UPDATE %s SET"
|
||||||
" database_name = '%s',"
|
" database_name = '%s',"
|
||||||
" table_name = '%s'"
|
" table_name = '%s'"
|
||||||
" WHERE"
|
" WHERE"
|
||||||
" database_name = '%s' AND"
|
" database_name = '%s' AND"
|
||||||
" table_name = '%s';",
|
" table_name = '%s';",
|
||||||
|
|
||||||
old_db_utf8, old_table_utf8,
|
old_db_utf8, old_table_utf8,
|
||||||
new_db_utf8, new_table_utf8,
|
new_db_utf8, new_table_utf8,
|
||||||
INDEX_STATS_NAME_PRINT,
|
INDEX_STATS_NAME_PRINT,
|
||||||
ut_strerr(ret),
|
ut_strerr(ret),
|
||||||
|
|
||||||
INDEX_STATS_NAME_PRINT,
|
INDEX_STATS_NAME_PRINT,
|
||||||
new_db_utf8, new_table_utf8,
|
new_db_utf8, new_table_utf8,
|
||||||
old_db_utf8, old_table_utf8);
|
old_db_utf8, old_table_utf8);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(ret);
|
return(ret);
|
||||||
@ -3971,7 +3970,7 @@ test_dict_table_schema_check()
|
|||||||
};
|
};
|
||||||
char errstr[512];
|
char errstr[512];
|
||||||
|
|
||||||
ut_snprintf(errstr, sizeof(errstr), "Table not found");
|
snprintf(errstr, sizeof(errstr), "Table not found");
|
||||||
|
|
||||||
/* prevent any data dictionary modifications while we are checking
|
/* prevent any data dictionary modifications while we are checking
|
||||||
the tables' structure */
|
the tables' structure */
|
||||||
|
@ -349,7 +349,7 @@ fts_config_set_index_ulint(
|
|||||||
// FIXME: Get rid of snprintf
|
// FIXME: Get rid of snprintf
|
||||||
ut_a(FTS_MAX_INT_LEN < FTS_MAX_CONFIG_VALUE_LEN);
|
ut_a(FTS_MAX_INT_LEN < FTS_MAX_CONFIG_VALUE_LEN);
|
||||||
|
|
||||||
value.f_len = ut_snprintf(
|
value.f_len = snprintf(
|
||||||
(char*) value.f_str, FTS_MAX_INT_LEN, ULINTPF, int_value);
|
(char*) value.f_str, FTS_MAX_INT_LEN, ULINTPF, int_value);
|
||||||
|
|
||||||
error = fts_config_set_index_value(trx, index, name, &value);
|
error = fts_config_set_index_value(trx, index, name, &value);
|
||||||
@ -422,7 +422,7 @@ fts_config_set_ulint(
|
|||||||
|
|
||||||
ut_a(FTS_MAX_INT_LEN < FTS_MAX_CONFIG_VALUE_LEN);
|
ut_a(FTS_MAX_INT_LEN < FTS_MAX_CONFIG_VALUE_LEN);
|
||||||
|
|
||||||
value.f_len = my_snprintf(
|
value.f_len = snprintf(
|
||||||
(char*) value.f_str, FTS_MAX_INT_LEN, ULINTPF, int_value);
|
(char*) value.f_str, FTS_MAX_INT_LEN, ULINTPF, int_value);
|
||||||
|
|
||||||
error = fts_config_set_value(trx, fts_table, name, &value);
|
error = fts_config_set_value(trx, fts_table, name, &value);
|
||||||
|
@ -2827,7 +2827,7 @@ fts_update_sync_doc_id(
|
|||||||
|
|
||||||
info = pars_info_create();
|
info = pars_info_create();
|
||||||
|
|
||||||
id_len = ut_snprintf(
|
id_len = snprintf(
|
||||||
(char*) id, sizeof(id), FTS_DOC_ID_FORMAT, doc_id + 1);
|
(char*) id, sizeof(id), FTS_DOC_ID_FORMAT, doc_id + 1);
|
||||||
|
|
||||||
pars_info_bind_varchar_literal(info, "doc_id", id, id_len);
|
pars_info_bind_varchar_literal(info, "doc_id", id, id_len);
|
||||||
|
@ -14851,9 +14851,9 @@ ha_innobase::info_low(
|
|||||||
dict_table_stats_unlock(ib_table, RW_S_LATCH);
|
dict_table_stats_unlock(ib_table, RW_S_LATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
my_snprintf(path, sizeof(path), "%s/%s%s",
|
snprintf(path, sizeof(path), "%s/%s%s",
|
||||||
mysql_data_home, table->s->normalized_path.str,
|
mysql_data_home, table->s->normalized_path.str,
|
||||||
reg_ext);
|
reg_ext);
|
||||||
|
|
||||||
unpack_filename(path,path);
|
unpack_filename(path,path);
|
||||||
|
|
||||||
@ -16704,13 +16704,13 @@ ShowStatus::to_string(
|
|||||||
int name_len;
|
int name_len;
|
||||||
char name_buf[IO_SIZE];
|
char name_buf[IO_SIZE];
|
||||||
|
|
||||||
name_len = ut_snprintf(
|
name_len = snprintf(
|
||||||
name_buf, sizeof(name_buf), "%s", it->m_name.c_str());
|
name_buf, sizeof(name_buf), "%s", it->m_name.c_str());
|
||||||
|
|
||||||
int status_len;
|
int status_len;
|
||||||
char status_buf[IO_SIZE];
|
char status_buf[IO_SIZE];
|
||||||
|
|
||||||
status_len = ut_snprintf(
|
status_len = snprintf(
|
||||||
status_buf, sizeof(status_buf),
|
status_buf, sizeof(status_buf),
|
||||||
"spins=%lu,waits=%lu,calls=%llu",
|
"spins=%lu,waits=%lu,calls=%llu",
|
||||||
static_cast<ulong>(it->m_spins),
|
static_cast<ulong>(it->m_spins),
|
||||||
@ -16797,7 +16797,7 @@ innodb_show_rwlock_status(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf1len = ut_snprintf(
|
buf1len = snprintf(
|
||||||
buf1, sizeof buf1, "rwlock: %s:%u",
|
buf1, sizeof buf1, "rwlock: %s:%u",
|
||||||
innobase_basename(rw_lock->cfile_name),
|
innobase_basename(rw_lock->cfile_name),
|
||||||
rw_lock->cline);
|
rw_lock->cline);
|
||||||
@ -16805,7 +16805,7 @@ innodb_show_rwlock_status(
|
|||||||
int buf2len;
|
int buf2len;
|
||||||
char buf2[IO_SIZE];
|
char buf2[IO_SIZE];
|
||||||
|
|
||||||
buf2len = ut_snprintf(
|
buf2len = snprintf(
|
||||||
buf2, sizeof buf2, "waits=%u",
|
buf2, sizeof buf2, "waits=%u",
|
||||||
rw_lock->count_os_wait);
|
rw_lock->count_os_wait);
|
||||||
|
|
||||||
@ -16825,7 +16825,7 @@ innodb_show_rwlock_status(
|
|||||||
int buf1len;
|
int buf1len;
|
||||||
char buf1[IO_SIZE];
|
char buf1[IO_SIZE];
|
||||||
|
|
||||||
buf1len = ut_snprintf(
|
buf1len = snprintf(
|
||||||
buf1, sizeof buf1, "sum rwlock: %s:%u",
|
buf1, sizeof buf1, "sum rwlock: %s:%u",
|
||||||
innobase_basename(block_rwlock->cfile_name),
|
innobase_basename(block_rwlock->cfile_name),
|
||||||
block_rwlock->cline);
|
block_rwlock->cline);
|
||||||
@ -16833,7 +16833,7 @@ innodb_show_rwlock_status(
|
|||||||
int buf2len;
|
int buf2len;
|
||||||
char buf2[IO_SIZE];
|
char buf2[IO_SIZE];
|
||||||
|
|
||||||
buf2len = ut_snprintf(
|
buf2len = snprintf(
|
||||||
buf2, sizeof buf2, "waits=" ULINTPF,
|
buf2, sizeof buf2, "waits=" ULINTPF,
|
||||||
block_rwlock_oswait_count);
|
block_rwlock_oswait_count);
|
||||||
|
|
||||||
@ -17586,7 +17586,7 @@ ha_innobase::get_foreign_dup_key(
|
|||||||
child_table_name[len] = '\0';
|
child_table_name[len] = '\0';
|
||||||
|
|
||||||
/* copy index name */
|
/* copy index name */
|
||||||
ut_snprintf(child_key_name, child_key_name_len, "%s",
|
snprintf(child_key_name, child_key_name_len, "%s",
|
||||||
err_index->name());
|
err_index->name());
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
@ -18490,7 +18490,7 @@ innodb_buffer_pool_size_update(
|
|||||||
{
|
{
|
||||||
longlong in_val = *static_cast<const longlong*>(save);
|
longlong in_val = *static_cast<const longlong*>(save);
|
||||||
|
|
||||||
ut_snprintf(export_vars.innodb_buffer_pool_resize_status,
|
snprintf(export_vars.innodb_buffer_pool_resize_status,
|
||||||
sizeof(export_vars.innodb_buffer_pool_resize_status),
|
sizeof(export_vars.innodb_buffer_pool_resize_status),
|
||||||
"Requested to resize buffer pool.");
|
"Requested to resize buffer pool.");
|
||||||
|
|
||||||
@ -22510,7 +22510,7 @@ ib_errf(
|
|||||||
if (vasprintf(&str, format, args) == -1) {
|
if (vasprintf(&str, format, args) == -1) {
|
||||||
/* In case of failure use a fixed length string */
|
/* In case of failure use a fixed length string */
|
||||||
str = static_cast<char*>(malloc(BUFSIZ));
|
str = static_cast<char*>(malloc(BUFSIZ));
|
||||||
my_vsnprintf(str, BUFSIZ, format, args);
|
vsnprintf(str, BUFSIZ, format, args);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
/* Use a fixed length string. */
|
/* Use a fixed length string. */
|
||||||
@ -22519,7 +22519,7 @@ ib_errf(
|
|||||||
va_end(args);
|
va_end(args);
|
||||||
return; /* Watch for Out-Of-Memory */
|
return; /* Watch for Out-Of-Memory */
|
||||||
}
|
}
|
||||||
my_vsnprintf(str, BUFSIZ, format, args);
|
vsnprintf(str, BUFSIZ, format, args);
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
ib_senderrf(thd, level, code, str);
|
ib_senderrf(thd, level, code, str);
|
||||||
|
@ -8367,7 +8367,7 @@ alter_stats_rebuild(
|
|||||||
# define DBUG_INJECT_CRASH(prefix, count) \
|
# define DBUG_INJECT_CRASH(prefix, count) \
|
||||||
do { \
|
do { \
|
||||||
char buf[32]; \
|
char buf[32]; \
|
||||||
ut_snprintf(buf, sizeof buf, prefix "_%u", count); \
|
snprintf(buf, sizeof buf, prefix "_%u", count); \
|
||||||
DBUG_EXECUTE_IF(buf, DBUG_SUICIDE();); \
|
DBUG_EXECUTE_IF(buf, DBUG_SUICIDE();); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
@ -8649,7 +8649,7 @@ ha_innobase::commit_inplace_alter_table(
|
|||||||
/* Generate a dynamic dbug text. */
|
/* Generate a dynamic dbug text. */
|
||||||
char buf[32];
|
char buf[32];
|
||||||
|
|
||||||
ut_snprintf(buf, sizeof buf,
|
snprintf(buf, sizeof buf,
|
||||||
"ib_commit_inplace_fail_%u",
|
"ib_commit_inplace_fail_%u",
|
||||||
failure_inject_count++);
|
failure_inject_count++);
|
||||||
|
|
||||||
|
@ -597,7 +597,7 @@ fill_innodb_trx_from_cache(
|
|||||||
cache, I_S_INNODB_TRX, i);
|
cache, I_S_INNODB_TRX, i);
|
||||||
|
|
||||||
/* trx_id */
|
/* trx_id */
|
||||||
ut_snprintf(trx_id, sizeof(trx_id), TRX_ID_FMT, row->trx_id);
|
snprintf(trx_id, sizeof(trx_id), TRX_ID_FMT, row->trx_id);
|
||||||
OK(field_store_string(fields[IDX_TRX_ID], trx_id));
|
OK(field_store_string(fields[IDX_TRX_ID], trx_id));
|
||||||
|
|
||||||
/* trx_state */
|
/* trx_state */
|
||||||
@ -931,8 +931,8 @@ fill_innodb_locks_from_cache(
|
|||||||
lock_id));
|
lock_id));
|
||||||
|
|
||||||
/* lock_trx_id */
|
/* lock_trx_id */
|
||||||
ut_snprintf(lock_trx_id, sizeof(lock_trx_id),
|
snprintf(lock_trx_id, sizeof(lock_trx_id),
|
||||||
TRX_ID_FMT, row->lock_trx_id);
|
TRX_ID_FMT, row->lock_trx_id);
|
||||||
OK(field_store_string(fields[IDX_LOCK_TRX_ID], lock_trx_id));
|
OK(field_store_string(fields[IDX_LOCK_TRX_ID], lock_trx_id));
|
||||||
|
|
||||||
/* lock_mode */
|
/* lock_mode */
|
||||||
@ -1131,8 +1131,8 @@ fill_innodb_lock_waits_from_cache(
|
|||||||
cache, I_S_INNODB_LOCK_WAITS, i);
|
cache, I_S_INNODB_LOCK_WAITS, i);
|
||||||
|
|
||||||
/* requesting_trx_id */
|
/* requesting_trx_id */
|
||||||
ut_snprintf(requesting_trx_id, sizeof(requesting_trx_id),
|
snprintf(requesting_trx_id, sizeof(requesting_trx_id),
|
||||||
TRX_ID_FMT, row->requested_lock_row->lock_trx_id);
|
TRX_ID_FMT, row->requested_lock_row->lock_trx_id);
|
||||||
OK(field_store_string(fields[IDX_REQUESTING_TRX_ID],
|
OK(field_store_string(fields[IDX_REQUESTING_TRX_ID],
|
||||||
requesting_trx_id));
|
requesting_trx_id));
|
||||||
|
|
||||||
@ -1145,8 +1145,8 @@ fill_innodb_lock_waits_from_cache(
|
|||||||
sizeof(requested_lock_id))));
|
sizeof(requested_lock_id))));
|
||||||
|
|
||||||
/* blocking_trx_id */
|
/* blocking_trx_id */
|
||||||
ut_snprintf(blocking_trx_id, sizeof(blocking_trx_id),
|
snprintf(blocking_trx_id, sizeof(blocking_trx_id),
|
||||||
TRX_ID_FMT, row->blocking_lock_row->lock_trx_id);
|
TRX_ID_FMT, row->blocking_lock_row->lock_trx_id);
|
||||||
OK(field_store_string(fields[IDX_BLOCKING_TRX_ID],
|
OK(field_store_string(fields[IDX_BLOCKING_TRX_ID],
|
||||||
blocking_trx_id));
|
blocking_trx_id));
|
||||||
|
|
||||||
@ -1748,8 +1748,8 @@ i_s_cmp_per_index_fill_low(
|
|||||||
index->name);
|
index->name);
|
||||||
} else {
|
} else {
|
||||||
/* index not found */
|
/* index not found */
|
||||||
ut_snprintf(name, sizeof(name),
|
snprintf(name, sizeof(name),
|
||||||
"index_id:" IB_ID_FMT, iter->first);
|
"index_id:" IB_ID_FMT, iter->first);
|
||||||
field_store_string(fields[IDX_DATABASE_NAME],
|
field_store_string(fields[IDX_DATABASE_NAME],
|
||||||
"unknown");
|
"unknown");
|
||||||
field_store_string(fields[IDX_TABLE_NAME],
|
field_store_string(fields[IDX_TABLE_NAME],
|
||||||
@ -9221,8 +9221,8 @@ i_s_innodb_mutexes_fill_table(
|
|||||||
if (block_mutex) {
|
if (block_mutex) {
|
||||||
char buf1[IO_SIZE];
|
char buf1[IO_SIZE];
|
||||||
|
|
||||||
my_snprintf(buf1, sizeof buf1, "combined %s",
|
snprintf(buf1, sizeof buf1, "combined %s",
|
||||||
innobase_basename(block_mutex->cfile_name));
|
innobase_basename(block_mutex->cfile_name));
|
||||||
|
|
||||||
OK(field_store_string(fields[MUTEXES_NAME], block_mutex->cmutex_name));
|
OK(field_store_string(fields[MUTEXES_NAME], block_mutex->cmutex_name));
|
||||||
OK(field_store_string(fields[MUTEXES_CREATE_FILE], buf1));
|
OK(field_store_string(fields[MUTEXES_CREATE_FILE], buf1));
|
||||||
@ -9260,8 +9260,8 @@ i_s_innodb_mutexes_fill_table(
|
|||||||
if (block_lock) {
|
if (block_lock) {
|
||||||
char buf1[IO_SIZE];
|
char buf1[IO_SIZE];
|
||||||
|
|
||||||
my_snprintf(buf1, sizeof buf1, "combined %s",
|
snprintf(buf1, sizeof buf1, "combined %s",
|
||||||
innobase_basename(block_lock->cfile_name));
|
innobase_basename(block_lock->cfile_name));
|
||||||
|
|
||||||
//OK(field_store_string(fields[MUTEXES_NAME], block_lock->lock_name));
|
//OK(field_store_string(fields[MUTEXES_NAME], block_lock->lock_name));
|
||||||
OK(field_store_string(fields[MUTEXES_CREATE_FILE], buf1));
|
OK(field_store_string(fields[MUTEXES_CREATE_FILE], buf1));
|
||||||
|
@ -387,79 +387,79 @@ dtype_sql_name(
|
|||||||
#define APPEND_UNSIGNED() \
|
#define APPEND_UNSIGNED() \
|
||||||
do { \
|
do { \
|
||||||
if (prtype & DATA_UNSIGNED) { \
|
if (prtype & DATA_UNSIGNED) { \
|
||||||
ut_snprintf(name + strlen(name), \
|
snprintf(name + strlen(name), \
|
||||||
name_sz - strlen(name), \
|
name_sz - strlen(name), \
|
||||||
" UNSIGNED"); \
|
" UNSIGNED"); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
ut_snprintf(name, name_sz, "UNKNOWN");
|
snprintf(name, name_sz, "UNKNOWN");
|
||||||
|
|
||||||
switch (mtype) {
|
switch (mtype) {
|
||||||
case DATA_INT:
|
case DATA_INT:
|
||||||
switch (len) {
|
switch (len) {
|
||||||
case 1:
|
case 1:
|
||||||
ut_snprintf(name, name_sz, "TINYINT");
|
snprintf(name, name_sz, "TINYINT");
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
ut_snprintf(name, name_sz, "SMALLINT");
|
snprintf(name, name_sz, "SMALLINT");
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
ut_snprintf(name, name_sz, "MEDIUMINT");
|
snprintf(name, name_sz, "MEDIUMINT");
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
ut_snprintf(name, name_sz, "INT");
|
snprintf(name, name_sz, "INT");
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
ut_snprintf(name, name_sz, "BIGINT");
|
snprintf(name, name_sz, "BIGINT");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
APPEND_UNSIGNED();
|
APPEND_UNSIGNED();
|
||||||
break;
|
break;
|
||||||
case DATA_FLOAT:
|
case DATA_FLOAT:
|
||||||
ut_snprintf(name, name_sz, "FLOAT");
|
snprintf(name, name_sz, "FLOAT");
|
||||||
APPEND_UNSIGNED();
|
APPEND_UNSIGNED();
|
||||||
break;
|
break;
|
||||||
case DATA_DOUBLE:
|
case DATA_DOUBLE:
|
||||||
ut_snprintf(name, name_sz, "DOUBLE");
|
snprintf(name, name_sz, "DOUBLE");
|
||||||
APPEND_UNSIGNED();
|
APPEND_UNSIGNED();
|
||||||
break;
|
break;
|
||||||
case DATA_FIXBINARY:
|
case DATA_FIXBINARY:
|
||||||
ut_snprintf(name, name_sz, "BINARY(%u)", len);
|
snprintf(name, name_sz, "BINARY(%u)", len);
|
||||||
break;
|
break;
|
||||||
case DATA_CHAR:
|
case DATA_CHAR:
|
||||||
case DATA_MYSQL:
|
case DATA_MYSQL:
|
||||||
ut_snprintf(name, name_sz, "CHAR(%u)", len);
|
snprintf(name, name_sz, "CHAR(%u)", len);
|
||||||
break;
|
break;
|
||||||
case DATA_VARCHAR:
|
case DATA_VARCHAR:
|
||||||
case DATA_VARMYSQL:
|
case DATA_VARMYSQL:
|
||||||
ut_snprintf(name, name_sz, "VARCHAR(%u)", len);
|
snprintf(name, name_sz, "VARCHAR(%u)", len);
|
||||||
break;
|
break;
|
||||||
case DATA_BINARY:
|
case DATA_BINARY:
|
||||||
ut_snprintf(name, name_sz, "VARBINARY(%u)", len);
|
snprintf(name, name_sz, "VARBINARY(%u)", len);
|
||||||
break;
|
break;
|
||||||
case DATA_GEOMETRY:
|
case DATA_GEOMETRY:
|
||||||
ut_snprintf(name, name_sz, "GEOMETRY");
|
snprintf(name, name_sz, "GEOMETRY");
|
||||||
break;
|
break;
|
||||||
case DATA_BLOB:
|
case DATA_BLOB:
|
||||||
switch (len) {
|
switch (len) {
|
||||||
case 9:
|
case 9:
|
||||||
ut_snprintf(name, name_sz, "TINYBLOB");
|
snprintf(name, name_sz, "TINYBLOB");
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
ut_snprintf(name, name_sz, "BLOB");
|
snprintf(name, name_sz, "BLOB");
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
ut_snprintf(name, name_sz, "MEDIUMBLOB");
|
snprintf(name, name_sz, "MEDIUMBLOB");
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
ut_snprintf(name, name_sz, "LONGBLOB");
|
snprintf(name, name_sz, "LONGBLOB");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prtype & DATA_NOT_NULL) {
|
if (prtype & DATA_NOT_NULL) {
|
||||||
ut_snprintf(name + strlen(name),
|
snprintf(name + strlen(name),
|
||||||
name_sz - strlen(name),
|
name_sz - strlen(name),
|
||||||
" NOT NULL");
|
" NOT NULL");
|
||||||
}
|
}
|
||||||
|
@ -395,50 +395,6 @@ ut_copy_file(
|
|||||||
FILE* dest, /*!< in: output file */
|
FILE* dest, /*!< in: output file */
|
||||||
FILE* src); /*!< in: input file to be appended to output */
|
FILE* src); /*!< in: input file to be appended to output */
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
/**********************************************************************//**
|
|
||||||
A substitute for vsnprintf(3), formatted output conversion into
|
|
||||||
a limited buffer. Note: this function DOES NOT return the number of
|
|
||||||
characters that would have been printed if the buffer was unlimited because
|
|
||||||
VC's _vsnprintf() returns -1 in this case and we would need to call
|
|
||||||
_vscprintf() in addition to estimate that but we would need another copy
|
|
||||||
of "ap" for that and VC does not provide va_copy(). */
|
|
||||||
void
|
|
||||||
ut_vsnprintf(
|
|
||||||
/*=========*/
|
|
||||||
char* str, /*!< out: string */
|
|
||||||
size_t size, /*!< in: str size */
|
|
||||||
const char* fmt, /*!< in: format */
|
|
||||||
va_list ap); /*!< in: format values */
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
A substitute for snprintf(3), formatted output conversion into
|
|
||||||
a limited buffer.
|
|
||||||
@return number of characters that would have been printed if the size
|
|
||||||
were unlimited, not including the terminating '\0'. */
|
|
||||||
int
|
|
||||||
ut_snprintf(
|
|
||||||
/*========*/
|
|
||||||
char* str, /*!< out: string */
|
|
||||||
size_t size, /*!< in: str size */
|
|
||||||
const char* fmt, /*!< in: format */
|
|
||||||
...); /*!< in: format values */
|
|
||||||
#else
|
|
||||||
/**********************************************************************//**
|
|
||||||
A wrapper for vsnprintf(3), formatted output conversion into
|
|
||||||
a limited buffer. Note: this function DOES NOT return the number of
|
|
||||||
characters that would have been printed if the buffer was unlimited because
|
|
||||||
VC's _vsnprintf() returns -1 in this case and we would need to call
|
|
||||||
_vscprintf() in addition to estimate that but we would need another copy
|
|
||||||
of "ap" for that and VC does not provide va_copy(). */
|
|
||||||
# define ut_vsnprintf(buf, size, fmt, ap) \
|
|
||||||
((void) vsnprintf(buf, size, fmt, ap))
|
|
||||||
/**********************************************************************//**
|
|
||||||
A wrapper for snprintf(3), formatted output conversion into
|
|
||||||
a limited buffer. */
|
|
||||||
# define ut_snprintf snprintf
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
|
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
Convert an error number to a human readable text message. The
|
Convert an error number to a human readable text message. The
|
||||||
returned string is static and should not be freed or modified.
|
returned string is static and should not be freed or modified.
|
||||||
|
@ -622,6 +622,8 @@ log_group_read_log_seg(
|
|||||||
lsn_t source_offset;
|
lsn_t source_offset;
|
||||||
|
|
||||||
ut_ad(log_mutex_own());
|
ut_ad(log_mutex_own());
|
||||||
|
ut_ad(!(start_lsn % OS_FILE_LOG_BLOCK_SIZE));
|
||||||
|
ut_ad(!(end_lsn % OS_FILE_LOG_BLOCK_SIZE));
|
||||||
|
|
||||||
loop:
|
loop:
|
||||||
source_offset = log_group_calc_lsn_offset(start_lsn, group);
|
source_offset = log_group_calc_lsn_offset(start_lsn, group);
|
||||||
@ -2899,7 +2901,8 @@ recv_group_scan_log_recs(
|
|||||||
recv_apply_hashed_log_recs(false);
|
recv_apply_hashed_log_recs(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
start_lsn = end_lsn;
|
start_lsn = ut_uint64_align_down(end_lsn,
|
||||||
|
OS_FILE_LOG_BLOCK_SIZE);
|
||||||
end_lsn = log_group_read_log_seg(
|
end_lsn = log_group_read_log_seg(
|
||||||
log_sys->buf, group, start_lsn,
|
log_sys->buf, group, start_lsn,
|
||||||
start_lsn + RECV_SCAN_SIZE);
|
start_lsn + RECV_SCAN_SIZE);
|
||||||
|
@ -1305,11 +1305,8 @@ os_file_make_new_pathname(
|
|||||||
new_path = static_cast<char*>(ut_malloc_nokey(new_path_len));
|
new_path = static_cast<char*>(ut_malloc_nokey(new_path_len));
|
||||||
memcpy(new_path, old_path, dir_len);
|
memcpy(new_path, old_path, dir_len);
|
||||||
|
|
||||||
ut_snprintf(new_path + dir_len,
|
snprintf(new_path + dir_len, new_path_len - dir_len,
|
||||||
new_path_len - dir_len,
|
"%c%s.ibd", OS_PATH_SEPARATOR, base_name);
|
||||||
"%c%s.ibd",
|
|
||||||
OS_PATH_SEPARATOR,
|
|
||||||
base_name);
|
|
||||||
|
|
||||||
return(new_path);
|
return(new_path);
|
||||||
}
|
}
|
||||||
|
@ -1340,8 +1340,8 @@ page_zip_compress(
|
|||||||
if (UNIV_UNLIKELY(page_zip_compress_log)) {
|
if (UNIV_UNLIKELY(page_zip_compress_log)) {
|
||||||
/* Create a log file for every compression attempt. */
|
/* Create a log file for every compression attempt. */
|
||||||
char logfilename[9];
|
char logfilename[9];
|
||||||
ut_snprintf(logfilename, sizeof logfilename,
|
snprintf(logfilename, sizeof logfilename,
|
||||||
"%08x", page_zip_compress_log++);
|
"%08x", page_zip_compress_log++);
|
||||||
logfile = fopen(logfilename, "wb");
|
logfile = fopen(logfilename, "wb");
|
||||||
|
|
||||||
if (logfile) {
|
if (logfile) {
|
||||||
|
@ -725,7 +725,7 @@ FetchIndexRootPages::build_row_import(row_import* cfg) const UNIV_NOTHROW
|
|||||||
|
|
||||||
char name[BUFSIZ];
|
char name[BUFSIZ];
|
||||||
|
|
||||||
ut_snprintf(name, sizeof(name), "index" IB_ID_FMT, it->m_id);
|
snprintf(name, sizeof(name), "index" IB_ID_FMT, it->m_id);
|
||||||
|
|
||||||
ulint len = strlen(name) + 1;
|
ulint len = strlen(name) + 1;
|
||||||
|
|
||||||
@ -2561,11 +2561,11 @@ row_import_read_index_data(
|
|||||||
if (n_bytes != sizeof(row)) {
|
if (n_bytes != sizeof(row)) {
|
||||||
char msg[BUFSIZ];
|
char msg[BUFSIZ];
|
||||||
|
|
||||||
ut_snprintf(msg, sizeof(msg),
|
snprintf(msg, sizeof(msg),
|
||||||
"while reading index meta-data, expected "
|
"while reading index meta-data, expected "
|
||||||
"to read " ULINTPF
|
"to read " ULINTPF
|
||||||
" bytes but read only " ULINTPF " bytes",
|
" bytes but read only " ULINTPF " bytes",
|
||||||
sizeof(row), n_bytes);
|
sizeof(row), n_bytes);
|
||||||
|
|
||||||
ib_senderrf(
|
ib_senderrf(
|
||||||
thd, IB_LOG_LEVEL_ERROR, ER_IO_READ_ERROR,
|
thd, IB_LOG_LEVEL_ERROR, ER_IO_READ_ERROR,
|
||||||
@ -3084,9 +3084,9 @@ row_import_read_cfg(
|
|||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
char msg[BUFSIZ];
|
char msg[BUFSIZ];
|
||||||
|
|
||||||
ut_snprintf(msg, sizeof(msg),
|
snprintf(msg, sizeof(msg),
|
||||||
"Error opening '%s', will attempt to import"
|
"Error opening '%s', will attempt to import"
|
||||||
" without schema verification", name);
|
" without schema verification", name);
|
||||||
|
|
||||||
ib_senderrf(
|
ib_senderrf(
|
||||||
thd, IB_LOG_LEVEL_WARN, ER_IO_READ_ERROR,
|
thd, IB_LOG_LEVEL_WARN, ER_IO_READ_ERROR,
|
||||||
|
@ -3608,6 +3608,11 @@ row_ins(
|
|||||||
switch (err) {
|
switch (err) {
|
||||||
case DB_SUCCESS:
|
case DB_SUCCESS:
|
||||||
break;
|
break;
|
||||||
|
case DB_NO_REFERENCED_ROW:
|
||||||
|
if (!dict_index_is_unique(node->index)) {
|
||||||
|
DBUG_RETURN(err);
|
||||||
|
}
|
||||||
|
/* fall through */
|
||||||
case DB_DUPLICATE_KEY:
|
case DB_DUPLICATE_KEY:
|
||||||
ut_ad(dict_index_is_unique(node->index));
|
ut_ad(dict_index_is_unique(node->index));
|
||||||
|
|
||||||
@ -3624,7 +3629,55 @@ row_ins(
|
|||||||
secondary indexes to block concurrent
|
secondary indexes to block concurrent
|
||||||
transactions from inserting the
|
transactions from inserting the
|
||||||
searched records. */
|
searched records. */
|
||||||
if (!node->duplicate) {
|
if (err == DB_NO_REFERENCED_ROW
|
||||||
|
&& node->duplicate) {
|
||||||
|
/* A foreign key check on a
|
||||||
|
unique index may fail to
|
||||||
|
find the record.
|
||||||
|
|
||||||
|
Consider as a example
|
||||||
|
following:
|
||||||
|
create table child(a int not null
|
||||||
|
primary key, b int not null,
|
||||||
|
c int,
|
||||||
|
unique key (b),
|
||||||
|
foreign key (b) references
|
||||||
|
parent (id)) engine=innodb;
|
||||||
|
|
||||||
|
insert into child values
|
||||||
|
(1,1,2);
|
||||||
|
|
||||||
|
insert into child(a) values
|
||||||
|
(1) on duplicate key update
|
||||||
|
c = 3;
|
||||||
|
|
||||||
|
Now primary key value 1
|
||||||
|
naturally causes duplicate
|
||||||
|
key error that will be
|
||||||
|
stored on node->duplicate.
|
||||||
|
If there was no duplicate
|
||||||
|
key error, we should return
|
||||||
|
the actual no referenced
|
||||||
|
row error.
|
||||||
|
|
||||||
|
As value for
|
||||||
|
column b used in both unique
|
||||||
|
key and foreign key is not
|
||||||
|
provided, server uses 0 as a
|
||||||
|
search value. This is
|
||||||
|
naturally, not found leading
|
||||||
|
to DB_NO_REFERENCED_ROW.
|
||||||
|
But, we should update the
|
||||||
|
row with primay key value 1
|
||||||
|
anyway.
|
||||||
|
|
||||||
|
Return the
|
||||||
|
original DB_DUPLICATE_KEY
|
||||||
|
error after
|
||||||
|
placing all gaplocks. */
|
||||||
|
err = DB_DUPLICATE_KEY;
|
||||||
|
break;
|
||||||
|
} else if (!node->duplicate) {
|
||||||
/* Save 1st dup error. Ignore
|
/* Save 1st dup error. Ignore
|
||||||
subsequent dup errors. */
|
subsequent dup errors. */
|
||||||
node->duplicate = node->index;
|
node->duplicate = node->index;
|
||||||
|
@ -454,8 +454,7 @@ row_quiesce_write_cfg(
|
|||||||
|
|
||||||
char msg[BUFSIZ];
|
char msg[BUFSIZ];
|
||||||
|
|
||||||
ut_snprintf(msg, sizeof(msg), "%s flush() failed",
|
snprintf(msg, sizeof(msg), "%s flush() failed", name);
|
||||||
name);
|
|
||||||
|
|
||||||
ib_senderrf(
|
ib_senderrf(
|
||||||
thd, IB_LOG_LEVEL_WARN, ER_IO_WRITE_ERROR,
|
thd, IB_LOG_LEVEL_WARN, ER_IO_WRITE_ERROR,
|
||||||
@ -465,8 +464,7 @@ row_quiesce_write_cfg(
|
|||||||
if (fclose(file) != 0) {
|
if (fclose(file) != 0) {
|
||||||
char msg[BUFSIZ];
|
char msg[BUFSIZ];
|
||||||
|
|
||||||
ut_snprintf(msg, sizeof(msg), "%s flose() failed",
|
snprintf(msg, sizeof(msg), "%s flose() failed", name);
|
||||||
name);
|
|
||||||
|
|
||||||
ib_senderrf(
|
ib_senderrf(
|
||||||
thd, IB_LOG_LEVEL_WARN, ER_IO_WRITE_ERROR,
|
thd, IB_LOG_LEVEL_WARN, ER_IO_WRITE_ERROR,
|
||||||
|
@ -1137,7 +1137,7 @@ row_raw_format_int(
|
|||||||
value = mach_read_int_type(
|
value = mach_read_int_type(
|
||||||
(const byte*) data, data_len, unsigned_type);
|
(const byte*) data, data_len, unsigned_type);
|
||||||
|
|
||||||
ret = ut_snprintf(
|
ret = snprintf(
|
||||||
buf, buf_size,
|
buf, buf_size,
|
||||||
unsigned_type ? "%llu" : "%lld", (longlong) value)+1;
|
unsigned_type ? "%llu" : "%lld", (longlong) value)+1;
|
||||||
} else {
|
} else {
|
||||||
@ -1234,7 +1234,7 @@ row_raw_format(
|
|||||||
|
|
||||||
if (data_len == UNIV_SQL_NULL) {
|
if (data_len == UNIV_SQL_NULL) {
|
||||||
|
|
||||||
ret = ut_snprintf((char*) buf, buf_size, "NULL") + 1;
|
ret = snprintf((char*) buf, buf_size, "NULL") + 1;
|
||||||
|
|
||||||
return(ut_min(ret, buf_size));
|
return(ut_min(ret, buf_size));
|
||||||
}
|
}
|
||||||
|
@ -293,13 +293,13 @@ public:
|
|||||||
log_file_name_len = strlen(m_log_file_name);
|
log_file_name_len = strlen(m_log_file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_snprintf(m_log_file_name + log_file_name_len,
|
snprintf(m_log_file_name + log_file_name_len,
|
||||||
log_file_name_buf_sz - log_file_name_len,
|
log_file_name_buf_sz - log_file_name_len,
|
||||||
"%s%lu_%lu_%s",
|
"%s%lu_%lu_%s",
|
||||||
TruncateLogger::s_log_prefix,
|
TruncateLogger::s_log_prefix,
|
||||||
(ulong) m_table->space,
|
(ulong) m_table->space,
|
||||||
(ulong) m_table->id,
|
(ulong) m_table->id,
|
||||||
TruncateLogger::s_log_ext);
|
TruncateLogger::s_log_ext);
|
||||||
|
|
||||||
return(DB_SUCCESS);
|
return(DB_SUCCESS);
|
||||||
|
|
||||||
|
@ -687,8 +687,8 @@ srv_undo_tablespace_open(
|
|||||||
dberr_t err = DB_ERROR;
|
dberr_t err = DB_ERROR;
|
||||||
char undo_name[sizeof "innodb_undo000"];
|
char undo_name[sizeof "innodb_undo000"];
|
||||||
|
|
||||||
ut_snprintf(undo_name, sizeof(undo_name),
|
snprintf(undo_name, sizeof(undo_name),
|
||||||
"innodb_undo%03u", static_cast<unsigned>(space_id));
|
"innodb_undo%03u", static_cast<unsigned>(space_id));
|
||||||
|
|
||||||
if (!srv_file_check_mode(name)) {
|
if (!srv_file_check_mode(name)) {
|
||||||
ib::error() << "UNDO tablespaces must be " <<
|
ib::error() << "UNDO tablespaces must be " <<
|
||||||
@ -766,7 +766,7 @@ srv_check_undo_redo_logs_exists()
|
|||||||
/* Check if any undo tablespaces exist */
|
/* Check if any undo tablespaces exist */
|
||||||
for (ulint i = 1; i <= srv_undo_tablespaces; ++i) {
|
for (ulint i = 1; i <= srv_undo_tablespaces; ++i) {
|
||||||
|
|
||||||
ut_snprintf(
|
snprintf(
|
||||||
name, sizeof(name),
|
name, sizeof(name),
|
||||||
"%s%cundo%03zu",
|
"%s%cundo%03zu",
|
||||||
srv_undo_dir, OS_PATH_SEPARATOR,
|
srv_undo_dir, OS_PATH_SEPARATOR,
|
||||||
@ -863,7 +863,7 @@ srv_undo_tablespaces_init(bool create_new_db)
|
|||||||
DBUG_EXECUTE_IF("innodb_undo_upgrade",
|
DBUG_EXECUTE_IF("innodb_undo_upgrade",
|
||||||
space_id = i + 3;);
|
space_id = i + 3;);
|
||||||
|
|
||||||
ut_snprintf(
|
snprintf(
|
||||||
name, sizeof(name),
|
name, sizeof(name),
|
||||||
"%s%cundo%03zu",
|
"%s%cundo%03zu",
|
||||||
srv_undo_dir, OS_PATH_SEPARATOR, space_id);
|
srv_undo_dir, OS_PATH_SEPARATOR, space_id);
|
||||||
@ -925,10 +925,10 @@ srv_undo_tablespaces_init(bool create_new_db)
|
|||||||
|
|
||||||
char name[OS_FILE_MAX_PATH];
|
char name[OS_FILE_MAX_PATH];
|
||||||
|
|
||||||
ut_snprintf(name, sizeof(name),
|
snprintf(name, sizeof(name),
|
||||||
"%s%cundo%03zu",
|
"%s%cundo%03zu",
|
||||||
srv_undo_dir, OS_PATH_SEPARATOR,
|
srv_undo_dir, OS_PATH_SEPARATOR,
|
||||||
undo_tablespace_ids[i]);
|
undo_tablespace_ids[i]);
|
||||||
|
|
||||||
os_file_delete(innodb_data_file_key, name);
|
os_file_delete(innodb_data_file_key, name);
|
||||||
|
|
||||||
@ -958,7 +958,7 @@ srv_undo_tablespaces_init(bool create_new_db)
|
|||||||
for (i = 0; i < n_undo_tablespaces; ++i) {
|
for (i = 0; i < n_undo_tablespaces; ++i) {
|
||||||
char name[OS_FILE_MAX_PATH];
|
char name[OS_FILE_MAX_PATH];
|
||||||
|
|
||||||
ut_snprintf(
|
snprintf(
|
||||||
name, sizeof(name),
|
name, sizeof(name),
|
||||||
"%s%cundo%03zu",
|
"%s%cundo%03zu",
|
||||||
srv_undo_dir, OS_PATH_SEPARATOR,
|
srv_undo_dir, OS_PATH_SEPARATOR,
|
||||||
@ -996,7 +996,7 @@ srv_undo_tablespaces_init(bool create_new_db)
|
|||||||
for (i = prev_space_id + 1; i < TRX_SYS_N_RSEGS; ++i) {
|
for (i = prev_space_id + 1; i < TRX_SYS_N_RSEGS; ++i) {
|
||||||
char name[OS_FILE_MAX_PATH];
|
char name[OS_FILE_MAX_PATH];
|
||||||
|
|
||||||
ut_snprintf(
|
snprintf(
|
||||||
name, sizeof(name),
|
name, sizeof(name),
|
||||||
"%s%cundo%03zu", srv_undo_dir, OS_PATH_SEPARATOR, i);
|
"%s%cundo%03zu", srv_undo_dir, OS_PATH_SEPARATOR, i);
|
||||||
|
|
||||||
|
@ -1607,17 +1607,17 @@ trx_i_s_create_lock_id(
|
|||||||
|
|
||||||
if (row->lock_space != ULINT_UNDEFINED) {
|
if (row->lock_space != ULINT_UNDEFINED) {
|
||||||
/* record lock */
|
/* record lock */
|
||||||
res_len = ut_snprintf(lock_id, lock_id_size,
|
res_len = snprintf(lock_id, lock_id_size,
|
||||||
TRX_ID_FMT
|
TRX_ID_FMT
|
||||||
":" ULINTPF ":" ULINTPF ":" ULINTPF,
|
":" ULINTPF ":" ULINTPF ":" ULINTPF,
|
||||||
row->lock_trx_id, row->lock_space,
|
row->lock_trx_id, row->lock_space,
|
||||||
row->lock_page, row->lock_rec);
|
row->lock_page, row->lock_rec);
|
||||||
} else {
|
} else {
|
||||||
/* table lock */
|
/* table lock */
|
||||||
res_len = ut_snprintf(lock_id, lock_id_size,
|
res_len = snprintf(lock_id, lock_id_size,
|
||||||
TRX_ID_FMT":" UINT64PF,
|
TRX_ID_FMT":" UINT64PF,
|
||||||
row->lock_trx_id,
|
row->lock_trx_id,
|
||||||
row->lock_table_id);
|
row->lock_table_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the typecast is safe because snprintf(3) never returns
|
/* the typecast is safe because snprintf(3) never returns
|
||||||
|
@ -567,10 +567,10 @@ namespace undo {
|
|||||||
log_file_name_len = strlen(log_file_name);
|
log_file_name_len = strlen(log_file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_snprintf(log_file_name + log_file_name_len,
|
snprintf(log_file_name + log_file_name_len,
|
||||||
log_file_name_sz - log_file_name_len,
|
log_file_name_sz - log_file_name_len,
|
||||||
"%s%lu_%s", undo::s_log_prefix,
|
"%s%lu_%s", undo::s_log_prefix,
|
||||||
(ulong) space_id, s_log_ext);
|
(ulong) space_id, s_log_ext);
|
||||||
|
|
||||||
return(DB_SUCCESS);
|
return(DB_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,10 @@ mysys/my_perf.c, contributed by Facebook under the following license.
|
|||||||
#include "univ.i"
|
#include "univ.i"
|
||||||
#include "ut0crc32.h"
|
#include "ut0crc32.h"
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Pointer to CRC32 calculation function. */
|
/** Pointer to CRC32 calculation function. */
|
||||||
ut_crc32_func_t ut_crc32;
|
ut_crc32_func_t ut_crc32;
|
||||||
|
|
||||||
@ -135,7 +139,7 @@ ut_crc32_power8(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(__x86_64__)
|
#if (defined(__GNUC__) && defined(__x86_64__)) || defined(_MSC_VER)
|
||||||
/********************************************************************//**
|
/********************************************************************//**
|
||||||
Fetches CPU info */
|
Fetches CPU info */
|
||||||
static
|
static
|
||||||
@ -150,10 +154,29 @@ ut_cpuid(
|
|||||||
uint32_t* features_edx) /*!< out: CPU features edx */
|
uint32_t* features_edx) /*!< out: CPU features edx */
|
||||||
{
|
{
|
||||||
uint32_t sig;
|
uint32_t sig;
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
int data[4];
|
||||||
|
__cpuid(data, 0);
|
||||||
|
/* ebx */
|
||||||
|
vend[0] = data[1];
|
||||||
|
/* edx */
|
||||||
|
vend[1] = data[3];
|
||||||
|
/* ecx */
|
||||||
|
vend[2] = data[2];
|
||||||
|
|
||||||
|
__cpuid(data, 1);
|
||||||
|
/* eax */
|
||||||
|
sig = data[0];
|
||||||
|
/* ecx */
|
||||||
|
*features_ecx = data[2];
|
||||||
|
/* edx */
|
||||||
|
*features_edx = data[3];
|
||||||
|
#else
|
||||||
asm("cpuid" : "=b" (vend[0]), "=c" (vend[2]), "=d" (vend[1]) : "a" (0));
|
asm("cpuid" : "=b" (vend[0]), "=c" (vend[2]), "=d" (vend[1]) : "a" (0));
|
||||||
asm("cpuid" : "=a" (sig), "=c" (*features_ecx), "=d" (*features_edx)
|
asm("cpuid" : "=a" (sig), "=c" (*features_ecx), "=d" (*features_edx)
|
||||||
: "a" (1)
|
: "a" (1)
|
||||||
: "ebx");
|
: "ebx");
|
||||||
|
#endif
|
||||||
|
|
||||||
*model = ((sig >> 4) & 0xF);
|
*model = ((sig >> 4) & 0xF);
|
||||||
*family = ((sig >> 8) & 0xF);
|
*family = ((sig >> 8) & 0xF);
|
||||||
@ -180,11 +203,15 @@ ut_crc32_8_hw(
|
|||||||
const byte** data,
|
const byte** data,
|
||||||
ulint* len)
|
ulint* len)
|
||||||
{
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
*crc = _mm_crc32_u8(*crc, (*data)[0]);
|
||||||
|
#else
|
||||||
asm("crc32b %1, %0"
|
asm("crc32b %1, %0"
|
||||||
/* output operands */
|
/* output operands */
|
||||||
: "+r" (*crc)
|
: "+r" (*crc)
|
||||||
/* input operands */
|
/* input operands */
|
||||||
: "rm" ((*data)[0]));
|
: "rm" ((*data)[0]));
|
||||||
|
#endif
|
||||||
|
|
||||||
(*data)++;
|
(*data)++;
|
||||||
(*len)--;
|
(*len)--;
|
||||||
@ -201,12 +228,22 @@ ut_crc32_64_low_hw(
|
|||||||
uint64_t data)
|
uint64_t data)
|
||||||
{
|
{
|
||||||
uint64_t crc_64bit = crc;
|
uint64_t crc_64bit = crc;
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#ifdef _M_X64
|
||||||
|
crc_64bit = _mm_crc32_u64(crc_64bit, data);
|
||||||
|
#elif defined(_M_IX86)
|
||||||
|
crc = _mm_crc32_u32(crc, static_cast<uint32_t>(data));
|
||||||
|
crc_64bit = _mm_crc32_u32(crc, static_cast<uint32_t>(data >> 32));
|
||||||
|
#else
|
||||||
|
#error Not Supported processors type.
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
asm("crc32q %1, %0"
|
asm("crc32q %1, %0"
|
||||||
/* output operands */
|
/* output operands */
|
||||||
: "+r" (crc_64bit)
|
: "+r" (crc_64bit)
|
||||||
/* input operands */
|
/* input operands */
|
||||||
: "rm" (data));
|
: "rm" (data));
|
||||||
|
#endif
|
||||||
|
|
||||||
return(static_cast<uint32_t>(crc_64bit));
|
return(static_cast<uint32_t>(crc_64bit));
|
||||||
}
|
}
|
||||||
@ -429,7 +466,7 @@ ut_crc32_byte_by_byte_hw(
|
|||||||
|
|
||||||
return(~crc);
|
return(~crc);
|
||||||
}
|
}
|
||||||
#endif /* defined(__GNUC__) && defined(__x86_64__) */
|
#endif /* defined(__GNUC__) && defined(__x86_64__) || (_WIN64) */
|
||||||
|
|
||||||
/* CRC32 software implementation. */
|
/* CRC32 software implementation. */
|
||||||
|
|
||||||
@ -704,7 +741,7 @@ ut_crc32_init()
|
|||||||
ut_crc32_byte_by_byte = ut_crc32_byte_by_byte_sw;
|
ut_crc32_byte_by_byte = ut_crc32_byte_by_byte_sw;
|
||||||
ut_crc32_implementation = "Using generic crc32 instructions";
|
ut_crc32_implementation = "Using generic crc32 instructions";
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(__x86_64__)
|
#if (defined(__GNUC__) && defined(__x86_64__)) || defined(_MSC_VER)
|
||||||
uint32_t vend[3];
|
uint32_t vend[3];
|
||||||
uint32_t model;
|
uint32_t model;
|
||||||
uint32_t family;
|
uint32_t family;
|
||||||
|
@ -522,65 +522,6 @@ ut_copy_file(
|
|||||||
} while (len > 0);
|
} while (len > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# include <stdarg.h>
|
|
||||||
/**********************************************************************//**
|
|
||||||
A substitute for vsnprintf(3), formatted output conversion into
|
|
||||||
a limited buffer. Note: this function DOES NOT return the number of
|
|
||||||
characters that would have been printed if the buffer was unlimited because
|
|
||||||
VC's _vsnprintf() returns -1 in this case and we would need to call
|
|
||||||
_vscprintf() in addition to estimate that but we would need another copy
|
|
||||||
of "ap" for that and VC does not provide va_copy(). */
|
|
||||||
void
|
|
||||||
ut_vsnprintf(
|
|
||||||
/*=========*/
|
|
||||||
char* str, /*!< out: string */
|
|
||||||
size_t size, /*!< in: str size */
|
|
||||||
const char* fmt, /*!< in: format */
|
|
||||||
va_list ap) /*!< in: format values */
|
|
||||||
{
|
|
||||||
_vsnprintf(str, size, fmt, ap);
|
|
||||||
str[size - 1] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************//**
|
|
||||||
A substitute for snprintf(3), formatted output conversion into
|
|
||||||
a limited buffer.
|
|
||||||
@return number of characters that would have been printed if the size
|
|
||||||
were unlimited, not including the terminating '\0'. */
|
|
||||||
int
|
|
||||||
ut_snprintf(
|
|
||||||
/*========*/
|
|
||||||
char* str, /*!< out: string */
|
|
||||||
size_t size, /*!< in: str size */
|
|
||||||
const char* fmt, /*!< in: format */
|
|
||||||
...) /*!< in: format values */
|
|
||||||
{
|
|
||||||
int res;
|
|
||||||
va_list ap1;
|
|
||||||
va_list ap2;
|
|
||||||
|
|
||||||
va_start(ap1, fmt);
|
|
||||||
va_start(ap2, fmt);
|
|
||||||
|
|
||||||
res = _vscprintf(fmt, ap1);
|
|
||||||
ut_a(res != -1);
|
|
||||||
|
|
||||||
if (size > 0) {
|
|
||||||
_vsnprintf(str, size, fmt, ap2);
|
|
||||||
|
|
||||||
if ((size_t) res >= size) {
|
|
||||||
str[size - 1] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
va_end(ap1);
|
|
||||||
va_end(ap2);
|
|
||||||
|
|
||||||
return(res);
|
|
||||||
}
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
|
|
||||||
/** Convert an error number to a human readable text message.
|
/** Convert an error number to a human readable text message.
|
||||||
The returned string is static and should not be freed or modified.
|
The returned string is static and should not be freed or modified.
|
||||||
@param[in] num InnoDB internal error number
|
@param[in] num InnoDB internal error number
|
||||||
|
@ -11,6 +11,11 @@ INCLUDE_DIRECTORIES(
|
|||||||
${ROCKSDB_SOURCE_DIR}/third-party/gtest-1.7.0/fused-src
|
${ROCKSDB_SOURCE_DIR}/third-party/gtest-1.7.0/fused-src
|
||||||
)
|
)
|
||||||
|
|
||||||
|
IF(WIN32)
|
||||||
|
INCLUDE_DIRECTORIES(BEFORE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/patch)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${ROCKSDB_SOURCE_DIR}/cmake/modules/")
|
list(APPEND CMAKE_MODULE_PATH "${ROCKSDB_SOURCE_DIR}/cmake/modules/")
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
|
@ -23,7 +23,6 @@ $ENV{MARIAROCKS_SST_DUMP}="$sst_dump";
|
|||||||
# Temporarily disable testing under valgrind, due to MDEV-12439
|
# Temporarily disable testing under valgrind, due to MDEV-12439
|
||||||
return "RocksDB tests disabled under valgrind" if ($::opt_valgrind);
|
return "RocksDB tests disabled under valgrind" if ($::opt_valgrind);
|
||||||
|
|
||||||
return "Temporarily disabled on Windows due to MDEV-13852" if (My::SysInfo::IS_WINDOWS);
|
|
||||||
|
|
||||||
bless { };
|
bless { };
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--source include/have_rocksdb.inc
|
--source include/have_rocksdb.inc
|
||||||
--source include/have_log_bin.inc
|
--source include/have_log_bin.inc
|
||||||
|
--source include/not_windows.inc
|
||||||
--echo # Disable for valgrind because this takes too long
|
--echo # Disable for valgrind because this takes too long
|
||||||
--source include/not_valgrind.inc
|
--source include/not_valgrind.inc
|
||||||
|
|
||||||
|
@ -82,6 +82,7 @@ eval CREATE TABLE t3(a INT, b INT, PRIMARY KEY(a) COMMENT "$pk_cf")
|
|||||||
perl;
|
perl;
|
||||||
my $fn = $ENV{'ROCKSDB_INFILE'};
|
my $fn = $ENV{'ROCKSDB_INFILE'};
|
||||||
open(my $fh, '>', $fn) || die "perl open($fn): $!";
|
open(my $fh, '>', $fn) || die "perl open($fn): $!";
|
||||||
|
binmode $fh;
|
||||||
my $max = 5000000;
|
my $max = 5000000;
|
||||||
my $sign = 1;
|
my $sign = 1;
|
||||||
for (my $ii = 0; $ii < $max; $ii++)
|
for (my $ii = 0; $ii < $max; $ii++)
|
||||||
|
446
storage/rocksdb/patch/port/win/io_win.h
Normal file
446
storage/rocksdb/patch/port/win/io_win.h
Normal file
@ -0,0 +1,446 @@
|
|||||||
|
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under both the GPLv2 (found in the
|
||||||
|
// COPYING file in the root directory) and Apache 2.0 License
|
||||||
|
// (found in the LICENSE.Apache file in the root directory).
|
||||||
|
//
|
||||||
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "rocksdb/status.h"
|
||||||
|
#include "rocksdb/env.h"
|
||||||
|
#include "util/aligned_buffer.h"
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace rocksdb {
|
||||||
|
namespace port {
|
||||||
|
|
||||||
|
std::string GetWindowsErrSz(DWORD err);
|
||||||
|
|
||||||
|
inline Status IOErrorFromWindowsError(const std::string& context, DWORD err) {
|
||||||
|
return ((err == ERROR_HANDLE_DISK_FULL) || (err == ERROR_DISK_FULL))
|
||||||
|
? Status::NoSpace(context, GetWindowsErrSz(err))
|
||||||
|
: Status::IOError(context, GetWindowsErrSz(err));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Status IOErrorFromLastWindowsError(const std::string& context) {
|
||||||
|
return IOErrorFromWindowsError(context, GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Status IOError(const std::string& context, int err_number) {
|
||||||
|
return (err_number == ENOSPC)
|
||||||
|
? Status::NoSpace(context, strerror(err_number))
|
||||||
|
: Status::IOError(context, strerror(err_number));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note the below two do not set errno because they are used only here in this
|
||||||
|
// file
|
||||||
|
// on a Windows handle and, therefore, not necessary. Translating GetLastError()
|
||||||
|
// to errno
|
||||||
|
// is a sad business
|
||||||
|
inline int fsync(HANDLE hFile) {
|
||||||
|
if (!FlushFileBuffers(hFile)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSIZE_T pwrite(HANDLE hFile, const char* src, size_t numBytes, uint64_t offset);
|
||||||
|
|
||||||
|
SSIZE_T pread(HANDLE hFile, char* src, size_t numBytes, uint64_t offset);
|
||||||
|
|
||||||
|
Status fallocate(const std::string& filename, HANDLE hFile, uint64_t to_size);
|
||||||
|
|
||||||
|
Status ftruncate(const std::string& filename, HANDLE hFile, uint64_t toSize);
|
||||||
|
|
||||||
|
size_t GetUniqueIdFromFile(HANDLE hFile, char* id, size_t max_size);
|
||||||
|
|
||||||
|
class WinFileData {
|
||||||
|
protected:
|
||||||
|
const std::string filename_;
|
||||||
|
HANDLE hFile_;
|
||||||
|
// If ture, the I/O issued would be direct I/O which the buffer
|
||||||
|
// will need to be aligned (not sure there is a guarantee that the buffer
|
||||||
|
// passed in is aligned).
|
||||||
|
const bool use_direct_io_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// We want this class be usable both for inheritance (prive
|
||||||
|
// or protected) and for containment so __ctor and __dtor public
|
||||||
|
WinFileData(const std::string& filename, HANDLE hFile, bool direct_io)
|
||||||
|
: filename_(filename), hFile_(hFile), use_direct_io_(direct_io) {}
|
||||||
|
|
||||||
|
virtual ~WinFileData() { this->CloseFile(); }
|
||||||
|
|
||||||
|
bool CloseFile() {
|
||||||
|
bool result = true;
|
||||||
|
|
||||||
|
if (hFile_ != NULL && hFile_ != INVALID_HANDLE_VALUE) {
|
||||||
|
result = ::CloseHandle(hFile_);
|
||||||
|
assert(result);
|
||||||
|
hFile_ = NULL;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& GetName() const { return filename_; }
|
||||||
|
|
||||||
|
HANDLE GetFileHandle() const { return hFile_; }
|
||||||
|
|
||||||
|
bool use_direct_io() const { return use_direct_io_; }
|
||||||
|
|
||||||
|
WinFileData(const WinFileData&) = delete;
|
||||||
|
WinFileData& operator=(const WinFileData&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WinSequentialFile : protected WinFileData, public SequentialFile {
|
||||||
|
|
||||||
|
// Override for behavior change when creating a custom env
|
||||||
|
virtual SSIZE_T PositionedReadInternal(char* src, size_t numBytes,
|
||||||
|
uint64_t offset) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
WinSequentialFile(const std::string& fname, HANDLE f,
|
||||||
|
const EnvOptions& options);
|
||||||
|
|
||||||
|
~WinSequentialFile();
|
||||||
|
|
||||||
|
WinSequentialFile(const WinSequentialFile&) = delete;
|
||||||
|
WinSequentialFile& operator=(const WinSequentialFile&) = delete;
|
||||||
|
|
||||||
|
virtual Status Read(size_t n, Slice* result, char* scratch) override;
|
||||||
|
virtual Status PositionedRead(uint64_t offset, size_t n, Slice* result,
|
||||||
|
char* scratch) override;
|
||||||
|
|
||||||
|
virtual Status Skip(uint64_t n) override;
|
||||||
|
|
||||||
|
virtual Status InvalidateCache(size_t offset, size_t length) override;
|
||||||
|
|
||||||
|
virtual bool use_direct_io() const override { return WinFileData::use_direct_io(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
// mmap() based random-access
|
||||||
|
class WinMmapReadableFile : private WinFileData, public RandomAccessFile {
|
||||||
|
HANDLE hMap_;
|
||||||
|
|
||||||
|
const void* mapped_region_;
|
||||||
|
const size_t length_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// mapped_region_[0,length-1] contains the mmapped contents of the file.
|
||||||
|
WinMmapReadableFile(const std::string& fileName, HANDLE hFile, HANDLE hMap,
|
||||||
|
const void* mapped_region, size_t length);
|
||||||
|
|
||||||
|
~WinMmapReadableFile();
|
||||||
|
|
||||||
|
WinMmapReadableFile(const WinMmapReadableFile&) = delete;
|
||||||
|
WinMmapReadableFile& operator=(const WinMmapReadableFile&) = delete;
|
||||||
|
|
||||||
|
virtual Status Read(uint64_t offset, size_t n, Slice* result,
|
||||||
|
char* scratch) const override;
|
||||||
|
|
||||||
|
virtual Status InvalidateCache(size_t offset, size_t length) override;
|
||||||
|
|
||||||
|
virtual size_t GetUniqueId(char* id, size_t max_size) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
// We preallocate and use memcpy to append new
|
||||||
|
// data to the file. This is safe since we either properly close the
|
||||||
|
// file before reading from it, or for log files, the reading code
|
||||||
|
// knows enough to skip zero suffixes.
|
||||||
|
class WinMmapFile : private WinFileData, public WritableFile {
|
||||||
|
private:
|
||||||
|
HANDLE hMap_;
|
||||||
|
|
||||||
|
const size_t page_size_; // We flush the mapping view in page_size
|
||||||
|
// increments. We may decide if this is a memory
|
||||||
|
// page size or SSD page size
|
||||||
|
const size_t
|
||||||
|
allocation_granularity_; // View must start at such a granularity
|
||||||
|
|
||||||
|
size_t reserved_size_; // Preallocated size
|
||||||
|
|
||||||
|
size_t mapping_size_; // The max size of the mapping object
|
||||||
|
// we want to guess the final file size to minimize the remapping
|
||||||
|
size_t view_size_; // How much memory to map into a view at a time
|
||||||
|
|
||||||
|
char* mapped_begin_; // Must begin at the file offset that is aligned with
|
||||||
|
// allocation_granularity_
|
||||||
|
char* mapped_end_;
|
||||||
|
char* dst_; // Where to write next (in range [mapped_begin_,mapped_end_])
|
||||||
|
char* last_sync_; // Where have we synced up to
|
||||||
|
|
||||||
|
uint64_t file_offset_; // Offset of mapped_begin_ in file
|
||||||
|
|
||||||
|
// Do we have unsynced writes?
|
||||||
|
bool pending_sync_;
|
||||||
|
|
||||||
|
// Can only truncate or reserve to a sector size aligned if
|
||||||
|
// used on files that are opened with Unbuffered I/O
|
||||||
|
Status TruncateFile(uint64_t toSize);
|
||||||
|
|
||||||
|
Status UnmapCurrentRegion();
|
||||||
|
|
||||||
|
Status MapNewRegion();
|
||||||
|
|
||||||
|
virtual Status PreallocateInternal(uint64_t spaceToReserve);
|
||||||
|
|
||||||
|
public:
|
||||||
|
WinMmapFile(const std::string& fname, HANDLE hFile, size_t page_size,
|
||||||
|
size_t allocation_granularity, const EnvOptions& options);
|
||||||
|
|
||||||
|
~WinMmapFile();
|
||||||
|
|
||||||
|
WinMmapFile(const WinMmapFile&) = delete;
|
||||||
|
WinMmapFile& operator=(const WinMmapFile&) = delete;
|
||||||
|
|
||||||
|
virtual Status Append(const Slice& data) override;
|
||||||
|
|
||||||
|
// Means Close() will properly take care of truncate
|
||||||
|
// and it does not need any additional information
|
||||||
|
virtual Status Truncate(uint64_t size) override;
|
||||||
|
|
||||||
|
virtual Status Close() override;
|
||||||
|
|
||||||
|
virtual Status Flush() override;
|
||||||
|
|
||||||
|
// Flush only data
|
||||||
|
virtual Status Sync() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flush data as well as metadata to stable storage.
|
||||||
|
*/
|
||||||
|
virtual Status Fsync() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the size of valid data in the file. This will not match the
|
||||||
|
* size that is returned from the filesystem because we use mmap
|
||||||
|
* to extend file by map_size every time.
|
||||||
|
*/
|
||||||
|
virtual uint64_t GetFileSize() override;
|
||||||
|
|
||||||
|
virtual Status InvalidateCache(size_t offset, size_t length) override;
|
||||||
|
|
||||||
|
virtual Status Allocate(uint64_t offset, uint64_t len) override;
|
||||||
|
|
||||||
|
virtual size_t GetUniqueId(char* id, size_t max_size) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WinRandomAccessImpl {
|
||||||
|
protected:
|
||||||
|
WinFileData* file_base_;
|
||||||
|
size_t alignment_;
|
||||||
|
|
||||||
|
// Override for behavior change when creating a custom env
|
||||||
|
virtual SSIZE_T PositionedReadInternal(char* src, size_t numBytes,
|
||||||
|
uint64_t offset) const;
|
||||||
|
|
||||||
|
WinRandomAccessImpl(WinFileData* file_base, size_t alignment,
|
||||||
|
const EnvOptions& options);
|
||||||
|
|
||||||
|
virtual ~WinRandomAccessImpl() {}
|
||||||
|
|
||||||
|
Status ReadImpl(uint64_t offset, size_t n, Slice* result,
|
||||||
|
char* scratch) const;
|
||||||
|
|
||||||
|
size_t GetAlignment() const { return alignment_; }
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
WinRandomAccessImpl(const WinRandomAccessImpl&) = delete;
|
||||||
|
WinRandomAccessImpl& operator=(const WinRandomAccessImpl&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
// pread() based random-access
|
||||||
|
class WinRandomAccessFile
|
||||||
|
: private WinFileData,
|
||||||
|
protected WinRandomAccessImpl, // Want to be able to override
|
||||||
|
// PositionedReadInternal
|
||||||
|
public RandomAccessFile {
|
||||||
|
public:
|
||||||
|
WinRandomAccessFile(const std::string& fname, HANDLE hFile, size_t alignment,
|
||||||
|
const EnvOptions& options);
|
||||||
|
|
||||||
|
~WinRandomAccessFile();
|
||||||
|
|
||||||
|
virtual Status Read(uint64_t offset, size_t n, Slice* result,
|
||||||
|
char* scratch) const override;
|
||||||
|
|
||||||
|
virtual size_t GetUniqueId(char* id, size_t max_size) const override;
|
||||||
|
|
||||||
|
virtual bool use_direct_io() const override { return WinFileData::use_direct_io(); }
|
||||||
|
|
||||||
|
virtual Status InvalidateCache(size_t offset, size_t length) override;
|
||||||
|
|
||||||
|
virtual size_t GetRequiredBufferAlignment() const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
// This is a sequential write class. It has been mimicked (as others) after
|
||||||
|
// the original Posix class. We add support for unbuffered I/O on windows as
|
||||||
|
// well
|
||||||
|
// we utilize the original buffer as an alignment buffer to write directly to
|
||||||
|
// file with no buffering.
|
||||||
|
// No buffering requires that the provided buffer is aligned to the physical
|
||||||
|
// sector size (SSD page size) and
|
||||||
|
// that all SetFilePointer() operations to occur with such an alignment.
|
||||||
|
// We thus always write in sector/page size increments to the drive and leave
|
||||||
|
// the tail for the next write OR for Close() at which point we pad with zeros.
|
||||||
|
// No padding is required for
|
||||||
|
// buffered access.
|
||||||
|
class WinWritableImpl {
|
||||||
|
protected:
|
||||||
|
WinFileData* file_data_;
|
||||||
|
const uint64_t alignment_;
|
||||||
|
uint64_t next_write_offset_; // Needed because Windows does not support O_APPEND
|
||||||
|
uint64_t reservedsize_; // how far we have reserved space
|
||||||
|
|
||||||
|
virtual Status PreallocateInternal(uint64_t spaceToReserve);
|
||||||
|
|
||||||
|
WinWritableImpl(WinFileData* file_data, size_t alignment);
|
||||||
|
|
||||||
|
~WinWritableImpl() {}
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t GetAlignement() const { return alignment_; }
|
||||||
|
|
||||||
|
Status AppendImpl(const Slice& data);
|
||||||
|
|
||||||
|
// Requires that the data is aligned as specified by
|
||||||
|
// GetRequiredBufferAlignment()
|
||||||
|
Status PositionedAppendImpl(const Slice& data, uint64_t offset);
|
||||||
|
|
||||||
|
Status TruncateImpl(uint64_t size);
|
||||||
|
|
||||||
|
Status CloseImpl();
|
||||||
|
|
||||||
|
Status SyncImpl();
|
||||||
|
|
||||||
|
uint64_t GetFileNextWriteOffset() {
|
||||||
|
// Double accounting now here with WritableFileWriter
|
||||||
|
// and this size will be wrong when unbuffered access is used
|
||||||
|
// but tests implement their own writable files and do not use
|
||||||
|
// WritableFileWrapper
|
||||||
|
// so we need to squeeze a square peg through
|
||||||
|
// a round hole here.
|
||||||
|
return next_write_offset_;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status AllocateImpl(uint64_t offset, uint64_t len);
|
||||||
|
|
||||||
|
public:
|
||||||
|
WinWritableImpl(const WinWritableImpl&) = delete;
|
||||||
|
WinWritableImpl& operator=(const WinWritableImpl&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WinWritableFile : private WinFileData,
|
||||||
|
protected WinWritableImpl,
|
||||||
|
public WritableFile {
|
||||||
|
public:
|
||||||
|
WinWritableFile(const std::string& fname, HANDLE hFile, size_t alignment,
|
||||||
|
size_t capacity, const EnvOptions& options);
|
||||||
|
|
||||||
|
~WinWritableFile();
|
||||||
|
|
||||||
|
bool IsSyncThreadSafe() const override {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual Status Append(const Slice& data) override;
|
||||||
|
|
||||||
|
// Requires that the data is aligned as specified by
|
||||||
|
// GetRequiredBufferAlignment()
|
||||||
|
virtual Status PositionedAppend(const Slice& data, uint64_t offset) override;
|
||||||
|
|
||||||
|
// Need to implement this so the file is truncated correctly
|
||||||
|
// when buffered and unbuffered mode
|
||||||
|
virtual Status Truncate(uint64_t size) override;
|
||||||
|
|
||||||
|
virtual Status Close() override;
|
||||||
|
|
||||||
|
// write out the cached data to the OS cache
|
||||||
|
// This is now taken care of the WritableFileWriter
|
||||||
|
virtual Status Flush() override;
|
||||||
|
|
||||||
|
virtual Status Sync() override;
|
||||||
|
|
||||||
|
virtual Status Fsync() override;
|
||||||
|
|
||||||
|
// Indicates if the class makes use of direct I/O
|
||||||
|
// Use PositionedAppend
|
||||||
|
virtual bool use_direct_io() const override;
|
||||||
|
|
||||||
|
virtual size_t GetRequiredBufferAlignment() const override;
|
||||||
|
|
||||||
|
virtual uint64_t GetFileSize() override;
|
||||||
|
|
||||||
|
virtual Status Allocate(uint64_t offset, uint64_t len) override;
|
||||||
|
|
||||||
|
virtual size_t GetUniqueId(char* id, size_t max_size) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WinRandomRWFile : private WinFileData,
|
||||||
|
protected WinRandomAccessImpl,
|
||||||
|
protected WinWritableImpl,
|
||||||
|
public RandomRWFile {
|
||||||
|
public:
|
||||||
|
WinRandomRWFile(const std::string& fname, HANDLE hFile, size_t alignment,
|
||||||
|
const EnvOptions& options);
|
||||||
|
|
||||||
|
~WinRandomRWFile() {}
|
||||||
|
|
||||||
|
// Indicates if the class makes use of direct I/O
|
||||||
|
// If false you must pass aligned buffer to Write()
|
||||||
|
virtual bool use_direct_io() const override;
|
||||||
|
|
||||||
|
// Use the returned alignment value to allocate aligned
|
||||||
|
// buffer for Write() when use_direct_io() returns true
|
||||||
|
virtual size_t GetRequiredBufferAlignment() const override;
|
||||||
|
|
||||||
|
// Write bytes in `data` at offset `offset`, Returns Status::OK() on success.
|
||||||
|
// Pass aligned buffer when use_direct_io() returns true.
|
||||||
|
virtual Status Write(uint64_t offset, const Slice& data) override;
|
||||||
|
|
||||||
|
// Read up to `n` bytes starting from offset `offset` and store them in
|
||||||
|
// result, provided `scratch` size should be at least `n`.
|
||||||
|
// Returns Status::OK() on success.
|
||||||
|
virtual Status Read(uint64_t offset, size_t n, Slice* result,
|
||||||
|
char* scratch) const override;
|
||||||
|
|
||||||
|
virtual Status Flush() override;
|
||||||
|
|
||||||
|
virtual Status Sync() override;
|
||||||
|
|
||||||
|
virtual Status Fsync() { return Sync(); }
|
||||||
|
|
||||||
|
virtual Status Close() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WinDirectory : public Directory {
|
||||||
|
public:
|
||||||
|
WinDirectory() {}
|
||||||
|
|
||||||
|
virtual Status Fsync() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WinFileLock : public FileLock {
|
||||||
|
public:
|
||||||
|
explicit WinFileLock(HANDLE hFile) : hFile_(hFile) {
|
||||||
|
assert(hFile != NULL);
|
||||||
|
assert(hFile != INVALID_HANDLE_VALUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
~WinFileLock();
|
||||||
|
|
||||||
|
private:
|
||||||
|
HANDLE hFile_;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -503,7 +503,7 @@ static int skip_num_constant(json_engine_t *j)
|
|||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
j->num_flags|= json_num_state_flags[state];
|
j->num_flags|= json_num_state_flags[state];
|
||||||
if ((c_len= json_next_char(&j->s)) > 0)
|
if ((c_len= json_next_char(&j->s)) > 0 && j->s.c_next < 128)
|
||||||
{
|
{
|
||||||
if ((state= json_num_states[state][json_num_chr_map[j->s.c_next]]) > 0)
|
if ((state= json_num_states[state][json_num_chr_map[j->s.c_next]]) > 0)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user