mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 18:41:56 +01:00
e01d33d773
1. Removing data type specific constants from enum_item_param_state, adding SHORT_DATA_VALUE instead. 2. Replacing tests for Item_param::state for the removed constants to tests for Type_handler::cmp_type() against {INT|REAL|TIME|DECIAML}_RESULT. Deriving Item_param::PValue from Type_handler_hybrid_field_type, to store the data type handler of the current value of the parameter. 3. Moving Item_param::decimal_value and Item_param::str_value_ptr to Item_param::PValue. Adding Item_param::PValue::m_string and changing Item_param to use it to store string values, instead of Item::str_value. The intent is to replace Item_param::value to a st_value based implementation in the future, to avoid duplicate code. Adding a sub-class Item::PValue_simple, to implement Item_param::PValue::swap() easier. Remaming Item_basic_value::fix_charset_and_length_from_str_value() to fix_charset_and_length() and adding the "CHARSET_INFO" pointer parameter, instead of getting it directly from item->str_value.charset(). Changing Item_param to pass value.m_string.charset() instead of str_value.charset(). Adding a String argument to the overloaded fix_charset_and_length_from_str_value() and changing Item_param to pass value.m_string instead of str_value. 4. Replacing the case in Item_param::save_in_field() to a call for Type_handler::Item_save_in_field(). 5. Adding new methods into Item_param::PValue: val_real(), val_int(), val_decimal(), val_str(). Changing the corresponding Item_param methods to use these new Item_param::PValue methods internally. Adding a helper method Item_param::can_return_value() and removing duplicate code in Item_param::val_xxx(). 6. Removing value.set_handler() from Item_param::set_conversion() and Type_handler_xxx::Item_param_set_from_value(). It's now done inside Item_param::set_param_func(), Item_param::set_value() and Item_param::set_limit_clause_param(). 7. Changing Type_handler_int_result::Item_param_set_from_value() to set max_length using attr->max_length instead of MY_INT64_NUM_DECIMAL_DIGITS, to preserve the data type of the assigned expression more precisely. 8. Adding Type_handler_hybrid_field_type::swap(), using it in Item_param::PValue::swap(). 9. Moving the data-type specific code from Item_param::query_val_str(), Item_param::eq(), Item_param::clone_item() to Item_param::value_query_type_str(), Item_param::value_eq(), Item_param::value_clone_item(), to split the "state" dependent code and the data type dependent code. Later we'll split the data type related code further and add new methods in Type_handler. This will be done after we replace Item_param::PValue to st_value. 10. Adding asserts into set_int(), set_double(), set_decimal(), set_time(), set_str(), set_longdata() to make sure that the value set to Item_param corresponds to the previously set data type handler. 11. Adding tests into t/ps.test and suite/binlog/t/binlog_stm_ps.test, to cover Item_param::print() and Item_param::append_for_log() for LIMIT clause parameters. Note, the patch does not change the behavior covered by the new tests. Adding for better code coverage. 12. Adding tests for more precise integer data type in queries like this: EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 AS SELECT 999999999 AS a,? AS b' USING 999999999; The explicit integer literal and the same integer literal passed as a PS parameter now produce columns of the same data type. Re-recording old results in ps.result, gis.result, func_hybrid_type.result accordingly.
230 lines
10 KiB
Text
230 lines
10 KiB
Text
drop table if exists t1;
|
|
reset master;
|
|
create table t1 (a int);
|
|
prepare s from "insert into t1 values (@a),(?)";
|
|
set @a=98;
|
|
execute s using @a;
|
|
prepare s from "insert into t1 values (?)";
|
|
set @a=99;
|
|
execute s using @a;
|
|
prepare s from "insert into t1 select 100 limit ?";
|
|
set @a=100;
|
|
execute s using @a;
|
|
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
|
|
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)
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # User var # # @`a`=98
|
|
master-bin.000001 # Query # # use `test`; insert into t1 values (@a),(98)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; insert into t1 values (99)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000001 # Query # # use `test`; insert into t1 select 100 limit 100
|
|
master-bin.000001 # Query # # COMMIT
|
|
drop table t1;
|
|
#
|
|
# MDEV-10709 Expressions as parameters to Dynamic SQL
|
|
#
|
|
FLUSH LOGS;
|
|
SET TIMESTAMP=UNIX_TIMESTAMP('2001-01-02 10:20:30.123456');
|
|
CREATE TABLE t1 (a DECIMAL(30,8));
|
|
PREPARE stmt FROM 'INSERT INTO t1 VALUES (?)';
|
|
EXECUTE stmt USING 10;
|
|
EXECUTE stmt USING 11e0;
|
|
EXECUTE stmt USING 12.1;
|
|
EXECUTE stmt USING '13';
|
|
EXECUTE stmt USING CURRENT_DATE;
|
|
EXECUTE stmt USING MAKETIME(10,20,30);
|
|
EXECUTE stmt USING CURRENT_TIME;
|
|
EXECUTE stmt USING CURRENT_TIME(3);
|
|
EXECUTE stmt USING CURRENT_TIME(6);
|
|
EXECUTE stmt USING CURRENT_TIMESTAMP;
|
|
EXECUTE stmt USING CURRENT_TIMESTAMP(3);
|
|
EXECUTE stmt USING CURRENT_TIMESTAMP(6);
|
|
SELECT * FROM t1;
|
|
a
|
|
10.00000000
|
|
11.00000000
|
|
12.10000000
|
|
13.00000000
|
|
20010102.00000000
|
|
102030.00000000
|
|
102030.00000000
|
|
102030.12300000
|
|
102030.12345600
|
|
20010102102030.00000000
|
|
20010102102030.12300000
|
|
20010102102030.12345600
|
|
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 DECIMAL(30,8))
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (10)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (11)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (12.1)
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES ('13')
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (DATE'2001-01-02')
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (TIME'10:20:30')
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (TIME'10:20:30')
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (TIME'10:20:30.123')
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (TIME'10:20:30.123456')
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (TIMESTAMP'2001-01-02 10:20:30')
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (TIMESTAMP'2001-01-02 10:20:30.123')
|
|
master-bin.000002 # Query # # COMMIT
|
|
master-bin.000002 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (TIMESTAMP'2001-01-02 10:20:30.123456')
|
|
master-bin.000002 # Query # # COMMIT
|
|
DROP TABLE t1;
|
|
SET TIMESTAMP=DEFAULT;
|
|
#
|
|
# MDEV-10585 EXECUTE IMMEDIATE statement
|
|
#
|
|
FLUSH LOGS;
|
|
CREATE TABLE t1 (a INT);
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (101)';
|
|
SET @a=102;
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING @a;
|
|
SET @a=103;
|
|
SET @stmt='INSERT INTO t1 VALUES (?)';
|
|
EXECUTE IMMEDIATE @stmt USING @a;
|
|
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)
|
|
master-bin.000003 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; INSERT INTO t1 VALUES (101)
|
|
master-bin.000003 # Query # # COMMIT
|
|
master-bin.000003 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; INSERT INTO t1 VALUES (102)
|
|
master-bin.000003 # Query # # COMMIT
|
|
master-bin.000003 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000003 # Query # # use `test`; INSERT INTO t1 VALUES (103)
|
|
master-bin.000003 # Query # # COMMIT
|
|
DROP TABLE t1;
|
|
#
|
|
# MDEV-11360 Dynamic SQL: DEFAULT as a bind parameter
|
|
#
|
|
FLUSH LOGS;
|
|
CREATE TABLE t1 (a INT DEFAULT 10);
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (Default)';
|
|
# The output of this query in 'Note' is a syntactically incorrect query.
|
|
# But as it's never logged, it's ok. It should be human readable only.
|
|
EXECUTE IMMEDIATE 'EXPLAIN EXTENDED SELECT ?' USING Default;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
|
Warnings:
|
|
Note 1003 select default AS `?`
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING Default;
|
|
CREATE PROCEDURE p1 ()
|
|
BEGIN
|
|
INSERT INTO t1 VALUES (Default);
|
|
# EXPLAIN should not be logged
|
|
EXECUTE IMMEDIATE 'EXPLAIN EXTENDED SELECT ?' USING Default;
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING Default;
|
|
END;
|
|
$$
|
|
CALL p1;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
|
DROP PROCEDURE p1;
|
|
DROP TABLE t1;
|
|
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 DEFAULT 10)
|
|
master-bin.000004 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; INSERT INTO t1 VALUES (Default)
|
|
master-bin.000004 # Query # # COMMIT
|
|
master-bin.000004 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; INSERT INTO t1 VALUES (DEFAULT)
|
|
master-bin.000004 # Query # # COMMIT
|
|
master-bin.000004 # Gtid # # GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
|
|
BEGIN
|
|
INSERT INTO t1 VALUES (Default);
|
|
# EXPLAIN should not be logged
|
|
EXECUTE IMMEDIATE 'EXPLAIN EXTENDED SELECT ?' USING Default;
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (?)' USING Default;
|
|
END
|
|
master-bin.000004 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; INSERT INTO t1 VALUES (Default)
|
|
master-bin.000004 # Query # # COMMIT
|
|
master-bin.000004 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; INSERT INTO t1 VALUES (DEFAULT)
|
|
master-bin.000004 # Query # # COMMIT
|
|
master-bin.000004 # Gtid # # GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; DROP PROCEDURE p1
|
|
master-bin.000004 # Gtid # # GTID #-#-#
|
|
master-bin.000004 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
|
|
#
|
|
#MDEV-14467 Item_param: replace {INT|DECIMAL|REAL|STRING|TIME}_VALUE with Type_handler
|
|
#
|
|
FLUSH LOGS;
|
|
CREATE TABLE t1 (a INT);
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 SELECT 1 LIMIT ?' USING 10;
|
|
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
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 SELECT 1 LIMIT ?' USING 10.1;
|
|
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
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 SELECT 1 LIMIT ?' USING 10.1e0;
|
|
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
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 SELECT 1 LIMIT ?' USING '10';
|
|
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
|
|
EXECUTE IMMEDIATE 'INSERT INTO t1 SELECT 1 LIMIT ?' USING TIME'10:10:10';
|
|
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;
|
|
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)
|
|
master-bin.000005 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; INSERT INTO t1 SELECT 1 LIMIT 10
|
|
master-bin.000005 # Query # # COMMIT
|
|
master-bin.000005 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; INSERT INTO t1 SELECT 1 LIMIT 10
|
|
master-bin.000005 # Query # # COMMIT
|
|
master-bin.000005 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; INSERT INTO t1 SELECT 1 LIMIT 10
|
|
master-bin.000005 # Query # # COMMIT
|
|
master-bin.000005 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; INSERT INTO t1 SELECT 1 LIMIT 10
|
|
master-bin.000005 # Query # # COMMIT
|
|
master-bin.000005 # Gtid # # BEGIN GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; INSERT INTO t1 SELECT 1 LIMIT 101010
|
|
master-bin.000005 # Query # # COMMIT
|
|
master-bin.000005 # Gtid # # GTID #-#-#
|
|
master-bin.000005 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
|