mirror of
https://github.com/MariaDB/server.git
synced 2025-07-20 10:24:14 +03:00
The code passing positions in the query to constructors of Rewritable_query_parameter descendants (e.g. Item_splocal) was not reliable. It used various Lex_input_stream methods: - get_tok_start() - get_tok_start_prev() - get_tok_end() - get_ptr() to find positions of the recently scanned tokens. The challenge was mostly to choose between get_tok_start() and get_tok_start_prev(), taking into account to the current grammar (depending if lookahead takes place before or after we read the positions in every particular rule). But this approach did not work at all in combination with token contractions, when MYSQLlex() translates two tokens into one token ID, for example: WITH ROLLUP -> WITH_ROLLUP_SYM As a result, the tokenizer is already one more token ahead. So in query fragment: "GROUP BY d, spvar WITH ROLLUP" get_tok_start() points to "ROLLUP". get_tok_start_prev() points to "WITH". As a result, it was "WITH" who was erroneously replaced to NAME_CONST() instead of "spvar". This patch modifies the code to do it a different way. Changes: 1. For keywords and identifiers, the tokenizer now returns LEX_CTRING pointing directly to the query fragment. So query positions are now just available using: - $1.str - for the beginning of a token - $1.str+$1.length - for the end of a token 2. Identifiers are not allocated on the THD memory root in the tokenizer any more. Allocation is now done on later stages, in methods like LEX::create_item_ident(). 3. Two LEX_CSTRING based structures were added: - Lex_ident_cli_st - used to store the "client side" identifier representation, pointing to the query fragment. Note, these identifiers are encoded in @@character_set_client and can have broken byte sequences. - Lex_ident_sys_st - used to store the "server side" identifier representation, pointing to the THD allocated memory. This representation guarantees that the identifier was checked for being well-formed, and is encoded in utf8. 4. To distinguish between two identifier types in the grammar, two Bison types were added: <ident_cli> and <ident_sys> 5. All non-reserved keywords were marked as being of the type <ident_cli>. All reserved keywords are still of the type NONE. 6. All curly brackets in rules collecting non-reserved keywords into non-terminal symbols were removed, e.g.: Was: keyword_sp_data_type: BIT_SYM {} | BOOLEAN_SYM {} Now: keyword_sp_data_type: BIT_SYM | BOOLEAN_SYM This is important NOT to have brackets here!!!! This is needed to make sure that the underlying Lex_ident_cli_ststructure correctly passes up to the calling rule. 6. The code to scan identifiers and keywords was moved from lex_one_token() into new Lex_input_stream methods: scan_ident_sysvar() scan_ident_start() scan_ident_middle() scan_ident_delimited() This was done to: - get rid of enormous amount of references to &yylval->lex_str - and remove a lot of references like lip->xxx 7. The allocating functionality which puts identifiers on the THD memory root now resides in methods of Lex_ident_sys_st, and in THD::to_ident_sys_alloc(). get_quoted_token() was removed. 8. Cleanup: check_simple_select() was moved as a method to LEX. 9. Cleanup: Some more functionality was moved from *.yy to new methods were added to LEX: make_item_colon_ident_ident() make_item_func_call_generic() create_item_qualified_asterisk()
511 lines
20 KiB
Plaintext
511 lines
20 KiB
Plaintext
SET sql_mode=ORACLE;
|
|
#
|
|
# MDEV-10914 ROW data type for stored routine variables
|
|
#
|
|
CREATE TABLE t1 (a INT, b INT);
|
|
CREATE PROCEDURE p1
|
|
AS
|
|
rec ROW(a INT,b INT);
|
|
BEGIN
|
|
rec.a:=100;
|
|
rec.b:=200;
|
|
INSERT INTO t1 VALUES (rec.a,rec.b);
|
|
INSERT INTO t1 VALUES (10, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (10, ROW(100,200)=rec);
|
|
INSERT INTO t1 SELECT 10, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 10, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
rec.a:=NULL;
|
|
INSERT INTO t1 VALUES (11, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (11, rec=ROW(100,201));
|
|
INSERT INTO t1 VALUES (11, ROW(100,200)=rec);
|
|
INSERT INTO t1 VALUES (11, ROW(100,201)=rec);
|
|
INSERT INTO t1 SELECT 11, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 11, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
rec.b:=NULL;
|
|
INSERT INTO t1 VALUES (12, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (12, ROW(100,200)=rec);
|
|
INSERT INTO t1 SELECT 12, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 12, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
END;
|
|
$$
|
|
CALL p1();
|
|
SELECT * FROM t1;
|
|
a b
|
|
100 200
|
|
10 1
|
|
10 1
|
|
10 20
|
|
10 21
|
|
11 NULL
|
|
11 0
|
|
11 NULL
|
|
11 0
|
|
12 NULL
|
|
12 NULL
|
|
DROP TABLE t1;
|
|
DROP PROCEDURE p1;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Gtid # # GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a INT, b INT)
|
|
master-bin.000001 # Gtid # # GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
|
|
AS
|
|
rec ROW(a INT,b INT);
|
|
BEGIN
|
|
rec.a:=100;
|
|
rec.b:=200;
|
|
INSERT INTO t1 VALUES (rec.a,rec.b);
|
|
INSERT INTO t1 VALUES (10, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (10, ROW(100,200)=rec);
|
|
INSERT INTO t1 SELECT 10, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 10, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
rec.a:=NULL;
|
|
INSERT INTO t1 VALUES (11, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (11, rec=ROW(100,201));
|
|
INSERT INTO t1 VALUES (11, ROW(100,200)=rec);
|
|
INSERT INTO t1 VALUES (11, ROW(100,201)=rec);
|
|
INSERT INTO t1 SELECT 11, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 11, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
rec.b:=NULL;
|
|
INSERT INTO t1 VALUES (12, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (12, ROW(100,200)=rec);
|
|
INSERT INTO t1 SELECT 12, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 12, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
END
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES ( NAME_CONST('rec.a',100), NAME_CONST('rec.b',200))
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (10, ROW(100,200)=ROW(100,200))
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (10, ROW(100,200)=ROW(100,200))
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 10, 20 FROM DUAL WHERE ROW(100,200)=ROW(100,200)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 10, 21 FROM DUAL WHERE ROW(100,200)=ROW(100,200)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(NULL,200)=ROW(100,200))
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(NULL,200)=ROW(100,201))
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(100,200)=ROW(NULL,200))
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(100,201)=ROW(NULL,200))
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 11, 20 FROM DUAL WHERE ROW(NULL,200)=ROW(100,200)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 11, 21 FROM DUAL WHERE ROW(100,200)=ROW(NULL,200)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (12, ROW(NULL,NULL)=ROW(100,200))
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (12, ROW(100,200)=ROW(NULL,NULL))
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 12, 20 FROM DUAL WHERE ROW(NULL,NULL)=ROW(100,200)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; INSERT INTO t1 SELECT 12, 21 FROM DUAL WHERE ROW(100,200)=ROW(NULL,NULL)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; DROP TABLE "t1" /* generated by server */
|
|
master-bin.000001 # Gtid # # GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; DROP PROCEDURE p1
|
|
#
|
|
# Testing ROW fields in LIMIT
|
|
#
|
|
FLUSH LOGS;
|
|
CREATE TABLE t1 (a INT);
|
|
INSERT INTO t1 VALUES (10),(10);
|
|
CREATE TABLE t2 (a INT);
|
|
CREATE PROCEDURE p1()
|
|
AS
|
|
a INT:= 1;
|
|
rec ROW(a INT);
|
|
BEGIN
|
|
rec.a:= 1;
|
|
INSERT INTO t2 SELECT 1 FROM t1 LIMIT a;
|
|
INSERT INTO t2 SELECT 2 FROM t1 LIMIT rec.a;
|
|
END;
|
|
$$
|
|
CALL p1();
|
|
Warnings:
|
|
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted
|
|
DROP TABLE t1,t2;
|
|
DROP PROCEDURE p1;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000002 # Binlog_checkpoint # # master-bin.000002
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; CREATE TABLE t1 (a INT)
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (10),(10)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; CREATE TABLE t2 (a INT)
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
|
|
AS
|
|
a INT:= 1;
|
|
rec ROW(a INT);
|
|
BEGIN
|
|
rec.a:= 1;
|
|
INSERT INTO t2 SELECT 1 FROM t1 LIMIT a;
|
|
INSERT INTO t2 SELECT 2 FROM t1 LIMIT rec.a;
|
|
END
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT 1 FROM t1 LIMIT 1
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT 2 FROM t1 LIMIT 1
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; DROP TABLE "t1","t2" /* generated by server */
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; DROP PROCEDURE p1
|
|
#
|
|
# End of MDEV-10914 ROW data type for stored routine variables
|
|
#
|
|
#
|
|
# MDEV-12133 sql_mode=ORACLE: table%ROWTYPE in variable declarations
|
|
#
|
|
CREATE TABLE t1 (a INT, b INT);
|
|
CREATE PROCEDURE p1
|
|
AS
|
|
rec t1%ROWTYPE;
|
|
BEGIN
|
|
rec.a:=100;
|
|
rec.b:=200;
|
|
SELECT rec=ROW(100,200) AS true1, ROW(100,200)=rec AS true2;
|
|
INSERT INTO t1 VALUES (rec.a,rec.b);
|
|
INSERT INTO t1 VALUES (10, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (10, ROW(100,200)=rec);
|
|
INSERT INTO t1 SELECT 10, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 10, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
rec.a:=NULL;
|
|
INSERT INTO t1 VALUES (11, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (11, rec=ROW(100,201));
|
|
INSERT INTO t1 VALUES (11, ROW(100,200)=rec);
|
|
INSERT INTO t1 VALUES (11, ROW(100,201)=rec);
|
|
INSERT INTO t1 SELECT 11, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 11, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
rec.b:=NULL;
|
|
INSERT INTO t1 VALUES (12, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (12, ROW(100,200)=rec);
|
|
INSERT INTO t1 SELECT 12, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 12, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
END;
|
|
$$
|
|
CALL p1();
|
|
true1 true2
|
|
1 1
|
|
SELECT * FROM t1;
|
|
a b
|
|
100 200
|
|
10 1
|
|
10 1
|
|
10 20
|
|
10 21
|
|
11 NULL
|
|
11 0
|
|
11 NULL
|
|
11 0
|
|
12 NULL
|
|
12 NULL
|
|
DROP TABLE t1;
|
|
DROP PROCEDURE p1;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000002 # Binlog_checkpoint # # master-bin.000002
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; CREATE TABLE t1 (a INT)
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (10),(10)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; CREATE TABLE t2 (a INT)
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
|
|
AS
|
|
a INT:= 1;
|
|
rec ROW(a INT);
|
|
BEGIN
|
|
rec.a:= 1;
|
|
INSERT INTO t2 SELECT 1 FROM t1 LIMIT a;
|
|
INSERT INTO t2 SELECT 2 FROM t1 LIMIT rec.a;
|
|
END
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT 1 FROM t1 LIMIT 1
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT 2 FROM t1 LIMIT 1
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; DROP TABLE "t1","t2" /* generated by server */
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; DROP PROCEDURE p1
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; CREATE TABLE t1 (a INT, b INT)
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
|
|
AS
|
|
rec t1%ROWTYPE;
|
|
BEGIN
|
|
rec.a:=100;
|
|
rec.b:=200;
|
|
SELECT rec=ROW(100,200) AS true1, ROW(100,200)=rec AS true2;
|
|
INSERT INTO t1 VALUES (rec.a,rec.b);
|
|
INSERT INTO t1 VALUES (10, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (10, ROW(100,200)=rec);
|
|
INSERT INTO t1 SELECT 10, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 10, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
rec.a:=NULL;
|
|
INSERT INTO t1 VALUES (11, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (11, rec=ROW(100,201));
|
|
INSERT INTO t1 VALUES (11, ROW(100,200)=rec);
|
|
INSERT INTO t1 VALUES (11, ROW(100,201)=rec);
|
|
INSERT INTO t1 SELECT 11, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 11, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
rec.b:=NULL;
|
|
INSERT INTO t1 VALUES (12, rec=ROW(100,200));
|
|
INSERT INTO t1 VALUES (12, ROW(100,200)=rec);
|
|
INSERT INTO t1 SELECT 12, 20 FROM DUAL WHERE rec=ROW(100,200);
|
|
INSERT INTO t1 SELECT 12, 21 FROM DUAL WHERE ROW(100,200)=rec;
|
|
END
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES ( NAME_CONST('rec.a',100), NAME_CONST('rec.b',200))
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (10, ROW(100,200)=ROW(100,200))
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (10, ROW(100,200)=ROW(100,200))
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 SELECT 10, 20 FROM DUAL WHERE ROW(100,200)=ROW(100,200)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 SELECT 10, 21 FROM DUAL WHERE ROW(100,200)=ROW(100,200)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(NULL,200)=ROW(100,200))
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(NULL,200)=ROW(100,201))
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(100,200)=ROW(NULL,200))
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (11, ROW(100,201)=ROW(NULL,200))
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 SELECT 11, 20 FROM DUAL WHERE ROW(NULL,200)=ROW(100,200)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 SELECT 11, 21 FROM DUAL WHERE ROW(100,200)=ROW(NULL,200)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (12, ROW(NULL,NULL)=ROW(100,200))
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (12, ROW(100,200)=ROW(NULL,NULL))
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 SELECT 12, 20 FROM DUAL WHERE ROW(NULL,NULL)=ROW(100,200)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 SELECT 12, 21 FROM DUAL WHERE ROW(100,200)=ROW(NULL,NULL)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; DROP TABLE "t1" /* generated by server */
|
|
master-bin.000002 # Gtid # # GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; DROP PROCEDURE p1
|
|
#
|
|
# MDEV-12291 Allow ROW variables as SELECT INTO targets
|
|
#
|
|
FLUSH LOGS;
|
|
CREATE TABLE t1 (a INT, b VARCHAR(32));
|
|
INSERT INTO t1 VALUES (10, 'b10');
|
|
CREATE TABLE t2 LIKE t1;
|
|
CREATE PROCEDURE p1
|
|
AS
|
|
rec1 ROW(a INT, b VARCHAR(32));
|
|
BEGIN
|
|
SELECT * INTO rec1 FROM t1;
|
|
INSERT INTO t2 VALUES (rec1.a, rec1.b);
|
|
END;
|
|
$$
|
|
CALL p1();
|
|
SELECT * FROM t1;
|
|
a b
|
|
10 b10
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
DROP PROCEDURE p1;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000003 # Binlog_checkpoint # # master-bin.000003
|
|
master-bin.000003 # Gtid # # GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; CREATE TABLE t1 (a INT, b VARCHAR(32))
|
|
master-bin.000003 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; INSERT INTO t1 VALUES (10, 'b10')
|
|
master-bin.000003 # Query # # COMMIT
|
|
master-bin.000003 # Gtid # # GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; CREATE TABLE t2 LIKE t1
|
|
master-bin.000003 # Gtid # # GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
|
|
AS
|
|
rec1 ROW(a INT, b VARCHAR(32));
|
|
BEGIN
|
|
SELECT * INTO rec1 FROM t1;
|
|
INSERT INTO t2 VALUES (rec1.a, rec1.b);
|
|
END
|
|
master-bin.000003 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; INSERT INTO t2 VALUES ( NAME_CONST('rec1.a',10), NAME_CONST('rec1.b',_latin1'b10' COLLATE 'latin1_swedish_ci'))
|
|
master-bin.000003 # Query # # COMMIT
|
|
master-bin.000003 # Gtid # # GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; DROP TABLE "t1" /* generated by server */
|
|
master-bin.000003 # Gtid # # GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; DROP TABLE "t2" /* generated by server */
|
|
master-bin.000003 # Gtid # # GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; DROP PROCEDURE p1
|
|
FLUSH LOGS;
|
|
CREATE TABLE t1 (a INT, b VARCHAR(32));
|
|
INSERT INTO t1 VALUES (10, 'b10');
|
|
CREATE TABLE t2 LIKE t1;
|
|
CREATE PROCEDURE p1
|
|
AS
|
|
rec1 t1%ROWTYPE;
|
|
BEGIN
|
|
SELECT * INTO rec1 FROM t1;
|
|
INSERT INTO t2 VALUES (rec1.a, rec1.b);
|
|
END;
|
|
$$
|
|
CALL p1();
|
|
SELECT * FROM t1;
|
|
a b
|
|
10 b10
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
DROP PROCEDURE p1;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000004 # Binlog_checkpoint # # master-bin.000004
|
|
master-bin.000004 # Gtid # # GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; CREATE TABLE t1 (a INT, b VARCHAR(32))
|
|
master-bin.000004 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; INSERT INTO t1 VALUES (10, 'b10')
|
|
master-bin.000004 # Query # # COMMIT
|
|
master-bin.000004 # Gtid # # GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; CREATE TABLE t2 LIKE t1
|
|
master-bin.000004 # Gtid # # GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
|
|
AS
|
|
rec1 t1%ROWTYPE;
|
|
BEGIN
|
|
SELECT * INTO rec1 FROM t1;
|
|
INSERT INTO t2 VALUES (rec1.a, rec1.b);
|
|
END
|
|
master-bin.000004 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; INSERT INTO t2 VALUES ( NAME_CONST('rec1.a',10), NAME_CONST('rec1.b',_latin1'b10' COLLATE 'latin1_swedish_ci'))
|
|
master-bin.000004 # Query # # COMMIT
|
|
master-bin.000004 # Gtid # # GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; DROP TABLE "t1" /* generated by server */
|
|
master-bin.000004 # Gtid # # GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; DROP TABLE "t2" /* generated by server */
|
|
master-bin.000004 # Gtid # # GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; DROP PROCEDURE p1
|
|
FLUSH LOGS;
|
|
CREATE TABLE t1 (a INT, b VARCHAR(32));
|
|
INSERT INTO t1 VALUES (10, 'b10');
|
|
CREATE TABLE t2 LIKE t1;
|
|
CREATE PROCEDURE p1
|
|
AS
|
|
CURSOR cur1 IS SELECT * FROM t1;
|
|
rec1 cur1%ROWTYPE;
|
|
BEGIN
|
|
SELECT * INTO rec1 FROM t1;
|
|
INSERT INTO t2 VALUES (rec1.a, rec1.b);
|
|
END;
|
|
$$
|
|
CALL p1();
|
|
SELECT * FROM t1;
|
|
a b
|
|
10 b10
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
DROP PROCEDURE p1;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000005 # Binlog_checkpoint # # master-bin.000005
|
|
master-bin.000005 # Gtid # # GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; CREATE TABLE t1 (a INT, b VARCHAR(32))
|
|
master-bin.000005 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; INSERT INTO t1 VALUES (10, 'b10')
|
|
master-bin.000005 # Query # # COMMIT
|
|
master-bin.000005 # Gtid # # GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; CREATE TABLE t2 LIKE t1
|
|
master-bin.000005 # Gtid # # GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
|
|
AS
|
|
CURSOR cur1 IS SELECT * FROM t1;
|
|
rec1 cur1%ROWTYPE;
|
|
BEGIN
|
|
SELECT * INTO rec1 FROM t1;
|
|
INSERT INTO t2 VALUES (rec1.a, rec1.b);
|
|
END
|
|
master-bin.000005 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; INSERT INTO t2 VALUES ( NAME_CONST('rec1.a',10), NAME_CONST('rec1.b',_latin1'b10' COLLATE 'latin1_swedish_ci'))
|
|
master-bin.000005 # Query # # COMMIT
|
|
master-bin.000005 # Gtid # # GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; DROP TABLE "t1" /* generated by server */
|
|
master-bin.000005 # Gtid # # GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; DROP TABLE "t2" /* generated by server */
|
|
master-bin.000005 # Gtid # # GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; DROP PROCEDURE p1
|
|
#
|
|
# MDEV-16020 SP variables inside GROUP BY..WITH ROLLUP break replication
|
|
#
|
|
FLUSH LOGS;
|
|
CREATE TABLE t1 (d DATE);
|
|
INSERT INTO t1 VALUES ('1985-05-13'),('1989-12-24');
|
|
CREATE TABLE t2 (d DATE, c BIGINT);
|
|
DECLARE
|
|
var INT;
|
|
BEGIN
|
|
INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, var;
|
|
INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, var WITH ROLLUP;
|
|
END;
|
|
$$
|
|
DROP TABLE t1,t2;
|
|
include/show_binlog_events.inc
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000006 # Binlog_checkpoint # # master-bin.000006
|
|
master-bin.000006 # Gtid # # GTID #-#-#
|
|
master-bin.000006 # Query # # use `test`; CREATE TABLE t1 (d DATE)
|
|
master-bin.000006 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000006 # Query # # use `test`; INSERT INTO t1 VALUES ('1985-05-13'),('1989-12-24')
|
|
master-bin.000006 # Query # # COMMIT
|
|
master-bin.000006 # Gtid # # GTID #-#-#
|
|
master-bin.000006 # Query # # use `test`; CREATE TABLE t2 (d DATE, c BIGINT)
|
|
master-bin.000006 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000006 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('var',NULL)
|
|
master-bin.000006 # Query # # COMMIT
|
|
master-bin.000006 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000006 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('var',NULL) WITH ROLLUP
|
|
master-bin.000006 # Query # # COMMIT
|
|
master-bin.000006 # Gtid # # GTID #-#-#
|
|
master-bin.000006 # Query # # use `test`; DROP TABLE "t1","t2" /* generated by server */
|