diff options
121 files changed, 4304 insertions, 3771 deletions
diff --git a/dbug/dbug.c b/dbug/dbug.c index 46510fff224..847a8cc2b5d 100644 --- a/dbug/dbug.c +++ b/dbug/dbug.c @@ -515,9 +515,9 @@ static int DbugParse(CODE_STATE *cs, const char *control) { /* never share with the global parent - it can change under your feet */ stack->functions= ListCopy(init_settings.functions); - LockIfInitSettings(cs); + LockMutex(cs); stack->keywords= ListCopy(init_settings.keywords); - UnlockIfInitSettings(cs); + UnlockMutex(cs); stack->processes= ListCopy(init_settings.processes); } else @@ -1621,7 +1621,10 @@ static void FreeState(CODE_STATE *cs, int free_state) struct settings *state= cs->stack; LockIfInitSettings(cs); if (!is_shared(state, keywords)) + { FreeList(state->keywords); + state->keywords= NULL; + } UnlockIfInitSettings(cs); if (!is_shared(state, functions)) FreeList(state->functions); diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index f2628f2b96b..3cdb116c593 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -102,6 +102,7 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA #include <srv0srv.h> #include <crc_glue.h> #include <log.h> +#include <derror.h> int sys_var_init(); @@ -2760,7 +2761,7 @@ static bool xtrabackup_copy_logfile(bool last = false) log_mutex_exit(); if (!start_lsn) { - msg(recv_sys.found_corrupt_log + die(recv_sys.found_corrupt_log ? "xtrabackup_copy_logfile() failed: corrupt log." : "xtrabackup_copy_logfile() failed."); return true; @@ -4241,6 +4242,8 @@ fail_before_log_copying_thread_start: if (xtrabackup_copy_logfile()) goto fail_before_log_copying_thread_start; + DBUG_MARIABACKUP_EVENT("before_innodb_log_copy_thread_started",0); + log_copying_stop = os_event_create(0); os_thread_create(log_copying_thread, NULL, &log_copying_thread_id); @@ -5864,41 +5867,12 @@ extern void init_signals(void); #include <sql_locale.h> -/* Messages . Avoid loading errmsg.sys file */ + void setup_error_messages() { - static const char *my_msgs[ERRORS_PER_RANGE]; - static const char **all_msgs[] = { my_msgs, my_msgs, my_msgs, my_msgs }; my_default_lc_messages = &my_locale_en_US; - my_default_lc_messages->errmsgs->errmsgs = all_msgs; - - /* Populate the necessary error messages */ - struct { - int id; - const char *fmt; - } - xb_msgs[] = - { - { ER_DATABASE_NAME,"Database" }, - { ER_TABLE_NAME,"Table"}, - { ER_PARTITION_NAME, "Partition" }, - { ER_SUBPARTITION_NAME, "Subpartition" }, - { ER_TEMPORARY_NAME, "Temporary"}, - { ER_RENAMED_NAME, "Renamed"}, - { ER_CANT_FIND_DL_ENTRY, "Can't find symbol '%-.128s' in library"}, - { ER_CANT_OPEN_LIBRARY, "Can't open shared library '%-.192s' (errno: %d, %-.128s)" }, - { ER_OUTOFMEMORY, "Out of memory; restart server and try again (needed %d bytes)" }, - { ER_CANT_OPEN_LIBRARY, "Can't open shared library '%-.192s' (errno: %d, %-.128s)" }, - { ER_UDF_NO_PATHS, "No paths allowed for shared library" }, - { ER_CANT_INITIALIZE_UDF,"Can't initialize function '%-.192s'; %-.80s"}, - { ER_PLUGIN_IS_NOT_LOADED,"Plugin '%-.192s' is not loaded" } - }; - - for (int i = 0; i < (int)array_elements(all_msgs); i++) - all_msgs[0][i] = "Unknown error"; - - for (int i = 0; i < (int)array_elements(xb_msgs); i++) - all_msgs[0][xb_msgs[i].id - ER_ERROR_FIRST] = xb_msgs[i].fmt; + if (init_errmessage()) + die("could not initialize error messages"); } void @@ -6170,6 +6144,8 @@ int main(int argc, char **argv) (void) pthread_key_delete(THR_THD); logger.cleanup_base(); + cleanup_errmsgs(); + free_error_messages(); mysql_mutex_destroy(&LOCK_error_log); if (status == EXIT_SUCCESS) { diff --git a/include/sslopt-case.h b/include/sslopt-case.h index 87eeff28231..72881a266ab 100644 --- a/include/sslopt-case.h +++ b/include/sslopt-case.h @@ -29,8 +29,8 @@ One can disable SSL later by using --skip-ssl or --ssl=0 */ opt_use_ssl= 1; -#ifdef HAVE_WOLFSSL - /* CRL does not work with WolfSSL */ +#if defined (HAVE_WOLFSSL) && (!defined (_WIN32) || defined (MYSQL_SERVER)) + /* CRL does not work with WolfSSL */ opt_ssl_crl= NULL; opt_ssl_crlpath= NULL; #endif diff --git a/libmariadb b/libmariadb -Subproject c8833751cf48d0085d9d7a4285aafdc967a63a4 +Subproject 63df45ce3df3fbc04d8fab9bceb77f9d1cccd4a diff --git a/mysql-test/main/cte_nonrecursive.result b/mysql-test/main/cte_nonrecursive.result index 91f67e34749..53d9d5ecc8f 100644 --- a/mysql-test/main/cte_nonrecursive.result +++ b/mysql-test/main/cte_nonrecursive.result @@ -1674,6 +1674,24 @@ t 1 use test; # +# MDEV-18460: Server crashed in strmake / tdc_create_key / +# THD::create_tmp_table_def_key +# +connect con1,localhost,root,,; +CREATE TEMPORARY TABLE test.t (a INT); +WITH cte AS (SELECT 1) SELECT * FROM cte; +1 +1 +WITH t AS (SELECT 1) SELECT * FROM t; +1 +1 +WITH cte AS (SELECT 1) SELECT * FROM t; +ERROR 3D000: No database selected +DROP TABLE test.t; +connection default; +disconnect con1; +# End of 10.2 tests +# # MDEV-20730: Syntax error on SELECT INTO @variable with CTE # with data as (select 1 as id) diff --git a/mysql-test/main/cte_nonrecursive.test b/mysql-test/main/cte_nonrecursive.test index 5626f720adf..f311271d4d2 100644 --- a/mysql-test/main/cte_nonrecursive.test +++ b/mysql-test/main/cte_nonrecursive.test @@ -1183,6 +1183,25 @@ with columns as (select 1 as t) select * from columns; use test; +--echo # +--echo # MDEV-18460: Server crashed in strmake / tdc_create_key / +--echo # THD::create_tmp_table_def_key +--echo # + +--connect con1,localhost,root,, +--change_user root,, + +CREATE TEMPORARY TABLE test.t (a INT); +WITH cte AS (SELECT 1) SELECT * FROM cte; +WITH t AS (SELECT 1) SELECT * FROM t; +--error ER_NO_DB_ERROR +WITH cte AS (SELECT 1) SELECT * FROM t; +DROP TABLE test.t; + +--connection default +--disconnect con1 + +--echo # End of 10.2 tests --echo # --echo # MDEV-20730: Syntax error on SELECT INTO @variable with CTE diff --git a/mysql-test/main/delete_use_source.result b/mysql-test/main/delete_use_source.result index 0ce010eb415..22972d0aa4a 100644 --- a/mysql-test/main/delete_use_source.result +++ b/mysql-test/main/delete_use_source.result @@ -1,4 +1,5 @@ -create table t1(c1 integer not null,c2 integer not null, key (c1)) engine=InnoDb; +create table t1(c1 integer not null,c2 integer not null, key (c1)) +ENGINE=InnoDB STATS_PERSISTENT=1; create view v1 as select * from t1 where c1 in (0,1); insert t1 select 0,seq from seq_1_to_500; insert t1 select 1,seq from seq_1_to_100; @@ -48,7 +49,7 @@ rollback; start transaction; explain delete from v1 where (select count(*) from t1 b where b.c1=v1.c1) = 500 limit 1; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t1 range c1 c1 4 NULL 502 Using where +1 PRIMARY t1 range c1 c1 4 NULL 600 Using where 2 DEPENDENT SUBQUERY b ref c1 c1 4 test.t1.c1 167 Using index delete from v1 where (select count(*) from t1 b where b.c1=v1.c1) = 500 limit 1; affected rows: 1 diff --git a/mysql-test/main/delete_use_source.test b/mysql-test/main/delete_use_source.test index 9b7b1f8650c..ed4c62b090c 100644 --- a/mysql-test/main/delete_use_source.test +++ b/mysql-test/main/delete_use_source.test @@ -2,7 +2,8 @@ --source include/have_innodb.inc # This test is slow on buildbot. --source include/big_test.inc -create table t1(c1 integer not null,c2 integer not null, key (c1)) engine=InnoDb; +create table t1(c1 integer not null,c2 integer not null, key (c1)) +ENGINE=InnoDB STATS_PERSISTENT=1; create view v1 as select * from t1 where c1 in (0,1); insert t1 select 0,seq from seq_1_to_500; diff --git a/mysql-test/main/foreign_key.result b/mysql-test/main/foreign_key.result index a82151ddec0..c412be6bbdb 100644 --- a/mysql-test/main/foreign_key.result +++ b/mysql-test/main/foreign_key.result @@ -82,3 +82,29 @@ add foreign key (a) references t3 (a) on update set default on update set default); 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 'update set default)' at line 3 drop table t_34455; +# +# MDEV-18460 Don't allow multiple table CONSTRAINTs with the same name. +# +CREATE TABLE tpk (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL) ENGINE=Innodb; +CREATE TABLE tfk (c1 INT, c2 INT, CONSTRAINT sid UNIQUE (c1), CONSTRAINT sid CHECK (c2>15)); +ERROR HY000: Duplicate CHECK constraint name 'sid' +CREATE TABLE tfk (c1 INT, c2 INT, CONSTRAINT sid UNIQUE (c1)); +ALTER TABLE tfk ADD CONSTRAINT sid CHECK (c2>15); +ERROR HY000: Duplicate CHECK constraint name 'sid' +DROP TABLE tfk; +CREATE TABLE tfk (c1 INT, c2 INT, +CONSTRAINT sid FOREIGN KEY (c1) REFERENCES tpk (id)) ENGINE=Innodb; +show create table tfk; +Table Create Table +tfk CREATE TABLE `tfk` ( + `c1` int(11) DEFAULT NULL, + `c2` int(11) DEFAULT NULL, + KEY `sid` (`c1`), + CONSTRAINT `sid` FOREIGN KEY (`c1`) REFERENCES `tpk` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE tfk ADD CONSTRAINT sid CHECK (c2>15); +ERROR HY000: Duplicate CHECK constraint name 'sid' +ALTER TABLE tfk ADD CONSTRAINT sid UNIQUE(c2); +ERROR 42000: Duplicate key name 'sid' +DROP TABLE tfk; +DROP TABLE tpk; diff --git a/mysql-test/main/foreign_key.test b/mysql-test/main/foreign_key.test index 17c93332cb3..3a09a544532 100644 --- a/mysql-test/main/foreign_key.test +++ b/mysql-test/main/foreign_key.test @@ -117,4 +117,28 @@ alter table t_34455 drop table t_34455; +--echo # +--echo # MDEV-18460 Don't allow multiple table CONSTRAINTs with the same name. +--echo # + +CREATE TABLE tpk (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL) ENGINE=Innodb; +--error ER_DUP_CONSTRAINT_NAME +CREATE TABLE tfk (c1 INT, c2 INT, CONSTRAINT sid UNIQUE (c1), CONSTRAINT sid CHECK (c2>15)); + +CREATE TABLE tfk (c1 INT, c2 INT, CONSTRAINT sid UNIQUE (c1)); +--error ER_DUP_CONSTRAINT_NAME +ALTER TABLE tfk ADD CONSTRAINT sid CHECK (c2>15); +DROP TABLE tfk; + +CREATE TABLE tfk (c1 INT, c2 INT, + CONSTRAINT sid FOREIGN KEY (c1) REFERENCES tpk (id)) ENGINE=Innodb; +show create table tfk; +--error ER_DUP_CONSTRAINT_NAME +ALTER TABLE tfk ADD CONSTRAINT sid CHECK (c2>15); +--error ER_DUP_KEYNAME +ALTER TABLE tfk ADD CONSTRAINT sid UNIQUE(c2); +DROP TABLE tfk; + +DROP TABLE tpk; + diff --git a/mysql-test/main/opt_tvc.result b/mysql-test/main/opt_tvc.result index 5329a9f64be..a68e70e8a25 100644 --- a/mysql-test/main/opt_tvc.result +++ b/mysql-test/main/opt_tvc.result @@ -629,11 +629,9 @@ SELECT * FROM t1 WHERE i IN (NULL, NULL, NULL, NULL, NULL); i EXPLAIN EXTENDED SELECT * FROM t1 WHERE i IN (NULL, NULL, NULL, NULL, NULL); id select_type table type possible_keys key key_len ref rows filtered Extra -1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 -1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using where; FirstMatch(t1); Using join buffer (flat, BNL join) -3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where Warnings: -Note 1003 /* select#1 */ select `test`.`t1`.`i` AS `i` from `test`.`t1` semi join ((values (NULL),(NULL),(NULL),(NULL),(NULL)) `tvc_0`) where `test`.`t1`.`i` = `tvc_0`.`_col_1` +Note 1003 select `test`.`t1`.`i` AS `i` from `test`.`t1` where `test`.`t1`.`i` in (NULL,NULL,NULL,NULL,NULL) SET in_predicate_conversion_threshold= default; DROP TABLE t1; # @@ -687,3 +685,50 @@ f1 f2 1 1 DROP TABLE t1,t2,t3; SET @@in_predicate_conversion_threshold= default; +# +# MDEV-20900: IN predicate to IN subquery conversion causes performance regression +# +create table t1(a int, b int); +insert into t1 select seq-1, seq-1 from seq_1_to_10; +set in_predicate_conversion_threshold=2; +explain select * from t1 where t1.a IN ("1","2","3","4"); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where +select * from t1 where t1.a IN ("1","2","3","4"); +a b +1 1 +2 2 +3 3 +4 4 +set in_predicate_conversion_threshold=0; +explain select * from t1 where t1.a IN ("1","2","3","4"); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where +select * from t1 where t1.a IN ("1","2","3","4"); +a b +1 1 +2 2 +3 3 +4 4 +set in_predicate_conversion_threshold=2; +explain select * from t1 where (t1.a,t1.b) in (("1","1"),(2,2),(3,3),(4,4)); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where +select * from t1 where (t1.a,t1.b) in (("1","1"),(2,2),(3,3),(4,4)); +a b +1 1 +2 2 +3 3 +4 4 +set in_predicate_conversion_threshold=0; +explain select * from t1 where (t1.a,t1.b) in (("1","1"),(2,2),(3,3),(4,4)); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where +select * from t1 where (t1.a,t1.b) in (("1","1"),(2,2),(3,3),(4,4)); +a b +1 1 +2 2 +3 3 +4 4 +drop table t1; +SET @@in_predicate_conversion_threshold= default; diff --git a/mysql-test/main/opt_tvc.test b/mysql-test/main/opt_tvc.test index 7319dbdc9e8..e4e8c6d7919 100644 --- a/mysql-test/main/opt_tvc.test +++ b/mysql-test/main/opt_tvc.test @@ -3,6 +3,7 @@ # source include/have_debug.inc; source include/default_optimizer_switch.inc; +source include/have_sequence.inc; create table t1 (a int, b int); @@ -397,3 +398,33 @@ SELECT * FROM t3 WHERE (f1,f2) IN ((2, 2), (1, 2), (3, 5), (1, 1)); DROP TABLE t1,t2,t3; SET @@in_predicate_conversion_threshold= default; + +--echo # +--echo # MDEV-20900: IN predicate to IN subquery conversion causes performance regression +--echo # + +create table t1(a int, b int); +insert into t1 select seq-1, seq-1 from seq_1_to_10; + +set in_predicate_conversion_threshold=2; + +let $query= select * from t1 where t1.a IN ("1","2","3","4"); +eval explain $query; +eval $query; + +set in_predicate_conversion_threshold=0; +eval explain $query; +eval $query; + +set in_predicate_conversion_threshold=2; +let $query= select * from t1 where (t1.a,t1.b) in (("1","1"),(2,2),(3,3),(4,4)); +eval explain $query; +eval $query; + +set in_predicate_conversion_threshold=0; +eval explain $query; +eval $query; + +drop table t1; +SET @@in_predicate_conversion_threshold= default; + diff --git a/mysql-test/main/ssl_7937.test b/mysql-test/main/ssl_7937.test index 264da3a6daa..59c13107e01 100644 --- a/mysql-test/main/ssl_7937.test +++ b/mysql-test/main/ssl_7937.test @@ -21,15 +21,6 @@ create procedure have_ssl() --exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/cacert.pem --ssl-verify-server-cert -e "call test.have_ssl()" 2>&1 --echo mysql --ssl --ssl-verify-server-cert -e "call test.have_ssl()" -# this is the test where certificate verification fails. -# but client library may not support certificate verification, so -# we fake the test result for it. We assume client is openssl, when server is openssl -let client_supports_cert_verification =`select variable_value not in('Unknown','OFF') from information_schema.session_status where variable_name='Ssl_session_cache_mode'`; -if ($client_supports_cert_verification) { - --replace_result "self signed certificate in certificate chain" "Failed to verify the server certificate" "Error in the certificate." "Failed to verify the server certificate" - --exec $MYSQL --ssl --ssl-verify-server-cert -e "call test.have_ssl()" 2>&1 -} -if (!$client_supports_cert_verification) { - --echo ERROR 2026 (HY000): SSL connection error: Failed to verify the server certificate -} +--replace_regex /SSL connection error.*certificate[^\n]*/SSL connection error: Failed to verify the server certificate/ +--exec $MYSQL --ssl --ssl-verify-server-cert -e "call test.have_ssl()" 2>&1 drop procedure have_ssl; diff --git a/mysql-test/main/ssl_8k_key.test b/mysql-test/main/ssl_8k_key.test index edfead46658..88f6b963cc4 100644 --- a/mysql-test/main/ssl_8k_key.test +++ b/mysql-test/main/ssl_8k_key.test @@ -1,6 +1,3 @@ -# schannel does not support keys longer than 4k --- source include/not_windows.inc - -- source include/have_ssl_communication.inc # # Bug#29784 YaSSL assertion failure when reading 8k key. diff --git a/mysql-test/main/ssl_crl_clients.test b/mysql-test/main/ssl_crl_clients.test index fc954a2fc38..f1dc4909cc6 100644 --- a/mysql-test/main/ssl_crl_clients.test +++ b/mysql-test/main/ssl_crl_clients.test @@ -1,6 +1,12 @@ # This test should work in embedded server after we fix mysqltest -- source include/not_embedded.inc --- source include/have_openssl.inc + +if (`SELECT COUNT(*) = 0 FROM information_schema.GLOBAL_VARIABLES + WHERE (VARIABLE_NAME ='version_compile_os' AND VARIABLE_VALUE LIKE 'Win%' OR + VARIABLE_NAME='have_openssl' AND VARIABLE_VALUE='YES')`) +{ + skip Need openssl or Windows; +} --echo # Test clients with and without CRL lists @@ -14,10 +20,12 @@ copy_file $MYSQL_TEST_DIR/std_data/server-cert.crl $MYSQL_TMP_DIR/ed1f42db.r0; --echo ############ Test mysql ############## --echo # Test mysql connecting to a server with a certificate revoked by -crl +--replace_result "Server certificate validation failed. The certificate is revoked. Error 0x80092010(CRYPT_E_REVOKED)" "certificate revoked" --error 1 --exec $MYSQL $ssl_crl test -e "SHOW STATUS LIKE 'Ssl_version'" 2>&1 --echo # Test mysql connecting to a server with a certificate revoked by -crlpath +--replace_result "Server certificate validation failed. The certificate is revoked. Error 0x80092010(CRYPT_E_REVOKED)" "certificate revoked" --error 1 --exec $MYSQL $ssl_crlpath test -e "SHOW STATUS LIKE 'Ssl_version'" 2>&1 @@ -26,11 +34,11 @@ copy_file $MYSQL_TEST_DIR/std_data/server-cert.crl $MYSQL_TMP_DIR/ed1f42db.r0; let $admin_suffix = --default-character-set=latin1 -S $MASTER_MYSOCK -P $MASTER_MYPORT -u root --password= ping; --echo # Test mysqladmin connecting to a server with a certificate revoked by -crl ---replace_regex /.*mysqladmin.*:/mysqladmin:/ +--replace_regex /.*mysqladmin.*:/mysqladmin:/ /SSL connection error: .*CRYPT_E_REVOKED./SSL connection error: certificate revoked/ --error 1 --exec $MYSQLADMIN $ssl_crl $admin_suffix 2>&1 --echo # Test mysqladmin connecting to a server with a certificate revoked by -crlpath ---replace_regex /.*mysqladmin.*:/mysqladmin:/ +--replace_regex /.*mysqladmin.*:/mysqladmin:/ /SSL connection error: .*CRYPT_E_REVOKED./SSL connection error: certificate revoked/ --error 1 --exec $MYSQLADMIN $ssl_crlpath $admin_suffix 2>&1 diff --git a/mysql-test/main/win.result b/mysql-test/main/win.result index 4adb5c84f1e..fff859cfa44 100644 --- a/mysql-test/main/win.result +++ b/mysql-test/main/win.result @@ -3634,6 +3634,15 @@ rank() over (partition by 'abc' order by 'xyz') 1 drop table t1; # +# MDEV-19380: ASAN heap-use-after-free in Protocol::net_store_data +# +CREATE TABLE t1 (i int); +INSERT INTO t1 VALUES (1),(2),(3); +SELECT (SELECT MIN('foo') OVER() FROM t1 LIMIT 1) as x; +x +foo +drop table t1; +# # End of 10.2 tests # # diff --git a/mysql-test/main/win.test b/mysql-test/main/win.test index 3d5fb2240de..c6ddef94d80 100644 --- a/mysql-test/main/win.test +++ b/mysql-test/main/win.test @@ -2342,6 +2342,16 @@ select rank() over (partition by 'abc' order by 'xyz') from t1; drop table t1; --echo # +--echo # MDEV-19380: ASAN heap-use-after-free in Protocol::net_store_data +--echo # + +CREATE TABLE t1 (i int); +INSERT INTO t1 VALUES (1),(2),(3); + +SELECT (SELECT MIN('foo') OVER() FROM t1 LIMIT 1) as x; +drop table t1; + +--echo # --echo # End of 10.2 tests --echo # diff --git a/mysql-test/suite/compat/oracle/r/sp-goto-debug.result b/mysql-test/suite/compat/oracle/r/sp-goto-debug.result new file mode 100644 index 00000000000..3660bfa2d84 --- /dev/null +++ b/mysql-test/suite/compat/oracle/r/sp-goto-debug.result @@ -0,0 +1,236 @@ +SET sql_mode=ORACLE; +# +# MDEV-20667 Server crash on pop_cursor +# +CREATE PROCEDURE p1() IS +BEGIN +IF 1=2 THEN +BEGIN +DECLARE +CURSOR cur1 IS SELECT a FROM t1 ; +BEGIN +GOTO iac_err; +END; +END; +END IF; +IF 1=1 THEN +GOTO iac_err; +END IF; +<< iac_err >> +RETURN; +END// +SHOW PROCEDURE CODE p1; +Pos Instruction +0 jump_if_not 5(5) 1 = 2 +1 cpush cur1@0 +2 jump 3 +3 cpop 1 +4 jump 7 +5 jump_if_not 7(7) 1 = 1 +6 jump 7 +7 preturn +DROP PROCEDURE p1; +CREATE PROCEDURE p1() IS +BEGIN +IF 1=2 THEN +BEGIN +DECLARE +CURSOR cur1 IS SELECT a FROM t1 ; +BEGIN +GOTO iac_err; +END; +END; +END IF; +IF 1=1 THEN +GOTO iac_err; +END IF; +<< iac_err >> +RETURN ; +END// +SHOW PROCEDURE CODE p1; +Pos Instruction +0 jump_if_not 5(5) 1 = 2 +1 cpush cur1@0 +2 jump 3 +3 cpop 1 +4 jump 7 +5 jump_if_not 7(7) 1 = 1 +6 jump 7 +7 preturn +DROP PROCEDURE p1; +CREATE PROCEDURE p1() IS +BEGIN +IF 1=2 THEN +BEGIN +DECLARE +CURSOR cur1 IS SELECT a FROM t1 ; +BEGIN +GOTO iac_err; +END; +END; +END IF; +GOTO iac_err; +<< iac_err >> +RETURN ; +END// +SHOW PROCEDURE CODE p1; +Pos Instruction +0 jump_if_not 5(5) 1 = 2 +1 cpush cur1@0 +2 jump 3 +3 cpop 1 +4 jump 5 +5 preturn +DROP PROCEDURE p1; +CREATE PROCEDURE p1() IS +BEGIN +IF 1=1 THEN +DECLARE +CURSOR cur2 IS SELECT 'cur2' FROM DUAL; +BEGIN +SELECT 'cur2'; +IF 1=1 THEN +DECLARE +CURSOR cur3 IS SELECT 'cur3' FROM DUAL; +BEGIN +SELECT 'cur3'; +IF 1=1 THEN +DECLARE +CURSOR cur4 IS SELECT 'cur4' FROM DUAL; +BEGIN +SELECT 'cur4'; +GOTO ret; +END; +END IF; +GOTO ret; +END; +END IF; +GOTO ret; +END; +END IF; +<<ret>> +RETURN; +END; +// +SHOW PROCEDURE CODE p1; +Pos Instruction +0 jump_if_not 15(15) 1 = 1 +1 cpush cur2@0 +2 stmt 0 "SELECT 'cur2'" +3 jump_if_not 13(13) 1 = 1 +4 cpush cur3@1 +5 stmt 0 "SELECT 'cur3'" +6 jump_if_not 11(11) 1 = 1 +7 cpush cur4@2 +8 stmt 0 "SELECT 'cur4'" +9 cpop 3 +10 jump 15 +11 cpop 2 +12 jump 15 +13 cpop 1 +14 jump 15 +15 preturn +DROP PROCEDURE p1; +CREATE PROCEDURE p1(lab VARCHAR(32)) IS +BEGIN +IF 1=1 THEN +DECLARE +CURSOR cur2 IS SELECT 'cur2' FROM DUAL; +BEGIN +IF 1=1 THEN +DECLARE +CURSOR cur3 IS SELECT 'cur3' FROM DUAL; +BEGIN +IF 1=1 THEN +DECLARE +CURSOR cur4 IS SELECT 'cur4' FROM DUAL; +BEGIN +IF lab = 'cur4' THEN +SELECT 'goto from cur4' AS comment; +GOTO ret; +END IF; +END; +END IF; +IF lab = 'cur3' THEN +SELECT 'goto from cur3' AS comment; +GOTO ret; +END IF; +END; +END IF; +IF lab = 'cur2' THEN +SELECT 'goto from cur2' AS comment; +GOTO ret; +END IF; +END; +END IF; +<<ret>> +RETURN; +END; +// +SHOW PROCEDURE CODE p1; +Pos Instruction +0 jump_if_not 21(21) 1 = 1 +1 cpush cur2@0 +2 jump_if_not 16(16) 1 = 1 +3 cpush cur3@1 +4 jump_if_not 11(11) 1 = 1 +5 cpush cur4@2 +6 jump_if_not 10(10) lab@0 = 'cur4' +7 stmt 0 "SELECT 'goto from cur4' AS comment" +8 cpop 3 +9 jump 21 +10 cpop 1 +11 jump_if_not 15(15) lab@0 = 'cur3' +12 stmt 0 "SELECT 'goto from cur3' AS comment" +13 cpop 2 +14 jump 21 +15 cpop 1 +16 jump_if_not 20(20) lab@0 = 'cur2' +17 stmt 0 "SELECT 'goto from cur2' AS comment" +18 cpop 1 +19 jump 21 +20 cpop 1 +21 preturn +CALL p1(''); +CALL p1('cur2'); +comment +goto from cur2 +CALL p1('cur3'); +comment +goto from cur3 +CALL p1('cur4'); +comment +goto from cur4 +DROP PROCEDURE p1; +CREATE PROCEDURE p1() IS +BEGIN +IF 1=2 THEN +BEGIN +DECLARE +CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; +BEGIN +GOTO iac_err; +END; +END; +END IF; +IF 1=1 THEN +GOTO iac_err; +END IF; +<<iac_err >> +RETURN; +END// +SHOW PROCEDURE CODE p1; +Pos Instruction +0 jump_if_not 9(9) 1 = 2 +1 hpush_jump 4 0 CONTINUE +2 stmt 31 "SET @x2 = 1" +3 hreturn 0 +4 hpop 1 +5 jump 11 +6 jump 11 +7 hpop 1 +8 jump 9 +9 jump_if_not 11(11) 1 = 1 +10 jump 11 +11 preturn +DROP PROCEDURE p1; diff --git a/mysql-test/suite/compat/oracle/r/sp-goto.result b/mysql-test/suite/compat/oracle/r/sp-goto.result index 259be7a34e6..badda507ee4 100644 --- a/mysql-test/suite/compat/oracle/r/sp-goto.result +++ b/mysql-test/suite/compat/oracle/r/sp-goto.result @@ -832,3 +832,82 @@ a 15 DROP TRIGGER trg1; DROP TABLE t1; +# +# MDEV-20667 Server crash on pop_cursor +# +CREATE TABLE t1 (a VARCHAR(6)); +CREATE PROCEDURE p1() IS +BEGIN +IF 1=2 THEN +BEGIN +DECLARE +CURSOR cur1 IS SELECT a FROM t1 ; +BEGIN +GOTO iac_err; +END; +END; +END IF; +IF 1=1 THEN +GOTO iac_err; +END IF; +<< iac_err >> +RETURN; +END// +CALL p1(); +DROP PROCEDURE p1; +DROP TABLE t1; +CREATE PROCEDURE p1() IS +BEGIN +IF 1=2 THEN +BEGIN +DECLARE +CURSOR cur1 IS SELECT a FROM t1 ; +BEGIN +GOTO iac_err; +END; +END; +END IF; +IF 1=1 THEN +GOTO iac_err; +END IF; +<< iac_err >> +RETURN ; +END// +CALL p1; +DROP PROCEDURE p1; +CREATE PROCEDURE p1() IS +BEGIN +IF 1=2 THEN +BEGIN +DECLARE +CURSOR cur1 IS SELECT a FROM t1 ; +BEGIN +GOTO iac_err; +END; +END; +END IF; +GOTO iac_err; +<< iac_err >> +RETURN ; +END// +CALL p1; +DROP PROCEDURE p1; +CREATE PROCEDURE p1() IS +BEGIN +IF 1=2 THEN +BEGIN +DECLARE +CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; +BEGIN +GOTO iac_err; +END; +END; +END IF; +IF 1=1 THEN +GOTO iac_err; +END IF; +<<iac_err >> +RETURN; +END// +CALL p1; +DROP PROCEDURE p1; diff --git a/mysql-test/suite/compat/oracle/t/sp-goto-debug.test b/mysql-test/suite/compat/oracle/t/sp-goto-debug.test new file mode 100644 index 00000000000..0ded370b17a --- /dev/null +++ b/mysql-test/suite/compat/oracle/t/sp-goto-debug.test @@ -0,0 +1,178 @@ +-- source include/have_debug.inc + +SET sql_mode=ORACLE; + +--echo # +--echo # MDEV-20667 Server crash on pop_cursor +--echo # + +DELIMITER //; +CREATE PROCEDURE p1() IS +BEGIN + IF 1=2 THEN + BEGIN + DECLARE + CURSOR cur1 IS SELECT a FROM t1 ; + BEGIN + GOTO iac_err; + END; + END; + END IF; + IF 1=1 THEN + GOTO iac_err; + END IF; +<< iac_err >> + RETURN; +END// +DELIMITER ;// +SHOW PROCEDURE CODE p1; +DROP PROCEDURE p1; + + +DELIMITER //; +CREATE PROCEDURE p1() IS +BEGIN + IF 1=2 THEN + BEGIN + DECLARE + CURSOR cur1 IS SELECT a FROM t1 ; + BEGIN + GOTO iac_err; + END; + END; + END IF; + IF 1=1 THEN + GOTO iac_err; + END IF; +<< iac_err >> + RETURN ; +END// +DELIMITER ;// +SHOW PROCEDURE CODE p1; +DROP PROCEDURE p1; + + +DELIMITER //; +CREATE PROCEDURE p1() IS +BEGIN + IF 1=2 THEN + BEGIN + DECLARE + CURSOR cur1 IS SELECT a FROM t1 ; + BEGIN + GOTO iac_err; + END; + END; + END IF; + GOTO iac_err; +<< iac_err >> + RETURN ; +END// +DELIMITER ;// +SHOW PROCEDURE CODE p1; +DROP PROCEDURE p1; + + +DELIMITER //; +CREATE PROCEDURE p1() IS +BEGIN + IF 1=1 THEN + DECLARE + CURSOR cur2 IS SELECT 'cur2' FROM DUAL; + BEGIN + SELECT 'cur2'; + IF 1=1 THEN + DECLARE + CURSOR cur3 IS SELECT 'cur3' FROM DUAL; + BEGIN + SELECT 'cur3'; + IF 1=1 THEN + DECLARE + CURSOR cur4 IS SELECT 'cur4' FROM DUAL; + BEGIN + SELECT 'cur4'; + GOTO ret; + END; + END IF; + GOTO ret; + END; + END IF; + GOTO ret; + END; + END IF; +<<ret>> + RETURN; +END; +// +DELIMITER ;// +SHOW PROCEDURE CODE p1; +DROP PROCEDURE p1; + + +DELIMITER //; +CREATE PROCEDURE p1(lab VARCHAR(32)) IS +BEGIN + IF 1=1 THEN + DECLARE + CURSOR cur2 IS SELECT 'cur2' FROM DUAL; + BEGIN + IF 1=1 THEN + DECLARE + CURSOR cur3 IS SELECT 'cur3' FROM DUAL; + BEGIN + IF 1=1 THEN + DECLARE + CURSOR cur4 IS SELECT 'cur4' FROM DUAL; + BEGIN + IF lab = 'cur4' THEN + SELECT 'goto from cur4' AS comment; + GOTO ret; + END IF; + END; + END IF; + IF lab = 'cur3' THEN + SELECT 'goto from cur3' AS comment; + GOTO ret; + END IF; + END; + END IF; + IF lab = 'cur2' THEN + SELECT 'goto from cur2' AS comment; + GOTO ret; + END IF; + END; + END IF; +<<ret>> + RETURN; +END; +// +DELIMITER ;// +SHOW PROCEDURE CODE p1; +CALL p1(''); +CALL p1('cur2'); +CALL p1('cur3'); +CALL p1('cur4'); +DROP PROCEDURE p1; + + +DELIMITER //; +CREATE PROCEDURE p1() IS +BEGIN + IF 1=2 THEN + BEGIN + DECLARE + CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; + BEGIN + GOTO iac_err; + END; + END; + END IF; + IF 1=1 THEN + GOTO iac_err; + END IF; +<<iac_err >> + RETURN; +END// +DELIMITER ;// +SHOW PROCEDURE CODE p1; +DROP PROCEDURE p1; diff --git a/mysql-test/suite/compat/oracle/t/sp-goto.test b/mysql-test/suite/compat/oracle/t/sp-goto.test index df7f1132666..9c15d10b3de 100644 --- a/mysql-test/suite/compat/oracle/t/sp-goto.test +++ b/mysql-test/suite/compat/oracle/t/sp-goto.test @@ -869,4 +869,100 @@ insert into t1 values (1); insert into t1 values (null); SELECT * FROM t1; DROP TRIGGER trg1; -DROP TABLE t1;
\ No newline at end of file +DROP TABLE t1; + + +--echo # +--echo # MDEV-20667 Server crash on pop_cursor +--echo # + +CREATE TABLE t1 (a VARCHAR(6)); +DELIMITER //; +CREATE PROCEDURE p1() IS +BEGIN + IF 1=2 THEN + BEGIN + DECLARE + CURSOR cur1 IS SELECT a FROM t1 ; + BEGIN + GOTO iac_err; + END; + END; + END IF; + IF 1=1 THEN + GOTO iac_err; + END IF; +<< iac_err >> + RETURN; +END// +DELIMITER ;// +CALL p1(); +DROP PROCEDURE p1; +DROP TABLE t1; + + +DELIMITER //; +CREATE PROCEDURE p1() IS +BEGIN + IF 1=2 THEN + BEGIN + DECLARE + CURSOR cur1 IS SELECT a FROM t1 ; + BEGIN + GOTO iac_err; + END; + END; + END IF; + IF 1=1 THEN + GOTO iac_err; + END IF; +<< iac_err >> + RETURN ; +END// +DELIMITER ;// +CALL p1; +DROP PROCEDURE p1; + + +DELIMITER //; +CREATE PROCEDURE p1() IS +BEGIN + IF 1=2 THEN + BEGIN + DECLARE + CURSOR cur1 IS SELECT a FROM t1 ; + BEGIN + GOTO iac_err; + END; + END; + END IF; + GOTO iac_err; +<< iac_err >> + RETURN ; +END// +DELIMITER ;// +CALL p1; +DROP PROCEDURE p1; + + +DELIMITER //; +CREATE PROCEDURE p1() IS +BEGIN + IF 1=2 THEN + BEGIN + DECLARE + CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; + BEGIN + GOTO iac_err; + END; + END; + END IF; + IF 1=1 THEN + GOTO iac_err; + END IF; +<<iac_err >> + RETURN; +END// +DELIMITER ;// +CALL p1; +DROP PROCEDURE p1; diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 061697a7fd8..40243ad556f 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -43,5 +43,6 @@ galera_var_reject_queries : assertion in inline_mysql_socket_send galera_var_retry_autocommit: MDEV-18181 Galera test failure on galera.galera_var_retry_autocommit galera_wan : MDEV-17259 Test failure on galera.galera_wan mysql-wsrep#198 : MDEV-18935 Galera test mysql-wsrep#198 sporaric assertion transaction.cpp:362: int wsrep::transaction::before_commit(): Assertion `state() == s_executing || state() == s_committing || state() == s_must_abort || state() == s_replaying' failed. +galera_partition : MDEV-21189 test timeout partition : MDEV-19958 Galera test failure on galera.partition query_cache: MDEV-15805 Test failure on galera.query_cache diff --git a/mysql-test/suite/galera/r/galera_partition.result b/mysql-test/suite/galera/r/galera_partition.result new file mode 100644 index 00000000000..d845de12c45 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_partition.result @@ -0,0 +1,424 @@ +connection node_1; +call mtr.add_suppression("WSREP: RSU failed due to pending transactions, schema: test, query ALTER.*"); +call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); +connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; +connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4; +connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1; +CREATE TABLE t1( +id bigint unsigned NOT NULL AUTO_INCREMENT, +dt datetime NOT NULL, +PRIMARY KEY (id,dt), +KEY dt_idx (dt) +) ENGINE=InnoDB +PARTITION BY RANGE( TO_DAYS(dt) ) ( +PARTITION rx2009xx VALUES LESS THAN( TO_DAYS('2010-01-01 00:00:00') ), +PARTITION rx201001 VALUES LESS THAN( TO_DAYS('2010-02-01 00:00:00') ), +PARTITION rx201002 VALUES LESS THAN( TO_DAYS('2010-03-01 00:00:00') ), +PARTITION rx201003 VALUES LESS THAN( TO_DAYS('2010-04-01 00:00:00') ), +PARTITION rx201004 VALUES LESS THAN( TO_DAYS('2010-05-01 00:00:00') ), +PARTITION rx201005 VALUES LESS THAN( TO_DAYS('2010-06-01 00:00:00') ), +PARTITION rx201006 VALUES LESS THAN( TO_DAYS('2010-07-01 00:00:00') ), +PARTITION rx201007 VALUES LESS THAN( TO_DAYS('2010-08-01 00:00:00') ), +PARTITION rx201008 VALUES LESS THAN( TO_DAYS('2010-09-01 00:00:00') ), +PARTITION rx201009 VALUES LESS THAN( TO_DAYS('2010-10-01 00:00:00') ), +PARTITION rx201010 VALUES LESS THAN( TO_DAYS('2010-11-01 00:00:00') ), +PARTITION rx201011 VALUES LESS THAN( TO_DAYS('2010-12-01 00:00:00') ), +PARTITION rx201012 VALUES LESS THAN( TO_DAYS('2011-01-01 00:00:00') ), +PARTITION rx2011 VALUES LESS THAN MAXVALUE); +CREATE PROCEDURE p1 (repeat_count int) +BEGIN +DECLARE current_num int; +SET current_num = 0; +WHILE current_num < repeat_count do +INSERT INTO t1 VALUES (NULL, '2010-10-21 00:00:00'); +INSERT INTO t1 VALUES (NULL, '2010-02-21 00:00:00'); +INSERT INTO t1 VALUES (NULL, '2010-03-21 00:00:00'); +INSERT INTO t1 VALUES (NULL, '2010-04-21 00:00:00'); +INSERT INTO t1 VALUES (NULL, '2010-06-21 00:00:00'); +INSERT INTO t1 VALUES (NULL, '2010-10-21 00:00:00'); +INSERT INTO t1 VALUES (NULL, '2012-02-21 00:00:00'); +COMMIT; +SET current_num = current_num + 1; +END WHILE; +END| +insert into t1 (id, dt) values (1, '2010-01-02 00:00:00'); +insert into t1 (id, dt) values (2, '2010-01-03 00:00:00'); +insert into t1 (id, dt) values (3, '2010-01-04 00:00:00'); +insert into t1 (id, dt) values (4, '2010-01-05 00:00:00'); +insert into t1 (id, dt) values (5, '2010-01-06 00:00:00'); +insert into t1 (id, dt) values (6, '2010-01-07 00:00:00'); +insert into t1 (id, dt) values (7, '2010-01-08 00:00:00'); +insert into t1 (id, dt) values (8, '2010-01-09 00:00:00'); +insert into t1 (id, dt) values (9, '2010-01-10 00:00:00'); +insert into t1 (id, dt) values (10, '2010-01-11 00:00:00'); +insert into t1 (id, dt) values (11, '2010-01-12 00:00:00'); +insert into t1 (id, dt) values (12, '2010-01-13 00:00:00'); +insert into t1 (id, dt) values (13, '2010-01-14 00:00:00'); +insert into t1 (id, dt) values (14, '2010-01-15 00:00:00'); +insert into t1 (id, dt) values (15, '2010-01-16 00:00:00'); +insert into t1 (id, dt) values (16, '2010-01-17 00:00:00'); +insert into t1 (id, dt) values (17, '2010-01-18 00:00:00'); +insert into t1 (id, dt) values (18, '2010-01-19 00:00:00'); +insert into t1 (id, dt) values (19, '2010-01-20 00:00:00'); +insert into t1 (id, dt) values (20, '2010-01-21 00:00:00'); +insert into t1 (id, dt) values (21, '2010-01-22 00:00:00'); +insert into t1 (id, dt) values (22, '2010-01-23 00:00:00'); +insert into t1 (id, dt) values (23, '2010-01-24 00:00:00'); +insert into t1 (id, dt) values (24, '2010-01-25 00:00:00'); +insert into t1 (id, dt) values (25, '2010-01-26 00:00:00'); +insert into t1 (id, dt) values (26, '2010-01-27 00:00:00'); +insert into t1 (id, dt) values (27, '2010-01-28 00:00:00'); +insert into t1 (id, dt) values (28, '2010-01-29 00:00:00'); +insert into t1 (id, dt) values (29, '2010-01-30 00:00:00'); +insert into t1 (id, dt) values (30, '2010-01-31 00:00:00'); +insert into t1 (id, dt) values (31, '2010-02-01 00:00:00'); +insert into t1 (id, dt) values (32, '2010-02-02 00:00:00'); +insert into t1 (id, dt) values (33, '2010-02-03 00:00:00'); +insert into t1 (id, dt) values (34, '2010-02-04 00:00:00'); +insert into t1 (id, dt) values (35, '2010-02-05 00:00:00'); +insert into t1 (id, dt) values (36, '2010-02-06 00:00:00'); +insert into t1 (id, dt) values (37, '2010-02-07 00:00:00'); +insert into t1 (id, dt) values (38, '2010-02-08 00:00:00'); +insert into t1 (id, dt) values (39, '2010-02-09 00:00:00'); +insert into t1 (id, dt) values (40, '2010-02-10 00:00:00'); +insert into t1 (id, dt) values (41, '2010-02-11 00:00:00'); +insert into t1 (id, dt) values (42, '2010-02-12 00:00:00'); +insert into t1 (id, dt) values (43, '2010-02-13 00:00:00'); +insert into t1 (id, dt) values (44, '2010-02-14 00:00:00'); +insert into t1 (id, dt) values (45, '2010-02-15 00:00:00'); +insert into t1 (id, dt) values (46, '2010-02-16 00:00:00'); +insert into t1 (id, dt) values (47, '2010-02-17 00:00:00'); +insert into t1 (id, dt) values (48, '2010-02-18 00:00:00'); +insert into t1 (id, dt) values (49, '2010-02-19 00:00:00'); +insert into t1 (id, dt) values (50, '2010-02-20 00:00:00'); +insert into t1 (id, dt) values (51, '2010-02-21 00:00:00'); +insert into t1 (id, dt) values (52, '2010-02-22 00:00:00'); +insert into t1 (id, dt) values (53, '2010-02-23 00:00:00'); +insert into t1 (id, dt) values (54, '2010-02-24 00:00:00'); +insert into t1 (id, dt) values (55, '2010-02-25 00:00:00'); +insert into t1 (id, dt) values (56, '2010-02-26 00:00:00'); +insert into t1 (id, dt) values (57, '2010-02-27 00:00:00'); +insert into t1 (id, dt) values (58, '2010-02-28 00:00:00'); +insert into t1 (id, dt) values (59, '2010-03-01 00:00:00'); +insert into t1 (id, dt) values (60, '2010-03-02 00:00:00'); +insert into t1 (id, dt) values (61, '2010-03-03 00:00:00'); +insert into t1 (id, dt) values (62, '2010-03-04 00:00:00'); +insert into t1 (id, dt) values (63, '2010-03-05 00:00:00'); +insert into t1 (id, dt) values (64, '2010-03-06 00:00:00'); +insert into t1 (id, dt) values (65, '2010-03-07 00:00:00'); +insert into t1 (id, dt) values (66, '2010-03-08 00:00:00'); +insert into t1 (id, dt) values (67, '2010-03-09 00:00:00'); +insert into t1 (id, dt) values (68, '2010-03-10 00:00:00'); +insert into t1 (id, dt) values (69, '2010-03-11 00:00:00'); +insert into t1 (id, dt) values (70, '2010-03-12 00:00:00'); +insert into t1 (id, dt) values (71, '2010-03-13 00:00:00'); +insert into t1 (id, dt) values (72, '2010-03-14 00:00:00'); +insert into t1 (id, dt) values (73, '2010-03-15 00:00:00'); +insert into t1 (id, dt) values (74, '2010-03-16 00:00:00'); +insert into t1 (id, dt) values (75, '2010-03-17 00:00:00'); +insert into t1 (id, dt) values (76, '2010-03-18 00:00:00'); +insert into t1 (id, dt) values (77, '2010-03-19 00:00:00'); +insert into t1 (id, dt) values (78, '2010-03-20 00:00:00'); +insert into t1 (id, dt) values (79, '2010-03-21 00:00:00'); +insert into t1 (id, dt) values (80, '2010-03-22 00:00:00'); +insert into t1 (id, dt) values (81, '2010-03-23 00:00:00'); +insert into t1 (id, dt) values (82, '2010-03-24 00:00:00'); +insert into t1 (id, dt) values (83, '2010-03-25 00:00:00'); +insert into t1 (id, dt) values (84, '2010-03-26 00:00:00'); +insert into t1 (id, dt) values (85, '2010-03-27 00:00:00'); +insert into t1 (id, dt) values (86, '2010-03-28 00:00:00'); +insert into t1 (id, dt) values (87, '2010-03-29 00:00:00'); +insert into t1 (id, dt) values (88, '2010-03-30 00:00:00'); +insert into t1 (id, dt) values (89, '2010-03-31 00:00:00'); +insert into t1 (id, dt) values (90, '2010-04-01 00:00:00'); +insert into t1 (id, dt) values (91, '2010-04-02 00:00:00'); +insert into t1 (id, dt) values (92, '2010-04-03 00:00:00'); +insert into t1 (id, dt) values (93, '2010-04-04 00:00:00'); +insert into t1 (id, dt) values (94, '2010-04-05 00:00:00'); +insert into t1 (id, dt) values (95, '2010-04-06 00:00:00'); +insert into t1 (id, dt) values (96, '2010-04-07 00:00:00'); +insert into t1 (id, dt) values (97, '2010-04-08 00:00:00'); +insert into t1 (id, dt) values (98, '2010-04-09 00:00:00'); +insert into t1 (id, dt) values (99, '2010-04-10 00:00:00'); +insert into t1 (id, dt) values (100, '2010-04-11 00:00:00'); +insert into t1 (id, dt) values (101, '2010-04-12 00:00:00'); +insert into t1 (id, dt) values (102, '2010-04-13 00:00:00'); +insert into t1 (id, dt) values (103, '2010-04-14 00:00:00'); +insert into t1 (id, dt) values (104, '2010-04-15 00:00:00'); +insert into t1 (id, dt) values (105, '2010-04-16 00:00:00'); +insert into t1 (id, dt) values (106, '2010-04-17 00:00:00'); +insert into t1 (id, dt) values (107, '2010-04-18 00:00:00'); +insert into t1 (id, dt) values (108, '2010-04-19 00:00:00'); +insert into t1 (id, dt) values (109, '2010-04-20 00:00:00'); +insert into t1 (id, dt) values (110, '2010-04-21 00:00:00'); +insert into t1 (id, dt) values (111, '2010-04-22 00:00:00'); +insert into t1 (id, dt) values (112, '2010-04-23 00:00:00'); +insert into t1 (id, dt) values (113, '2010-04-24 00:00:00'); +insert into t1 (id, dt) values (114, '2010-04-25 00:00:00'); +insert into t1 (id, dt) values (115, '2010-04-26 00:00:00'); +insert into t1 (id, dt) values (116, '2010-04-27 00:00:00'); +insert into t1 (id, dt) values (117, '2010-04-28 00:00:00'); +insert into t1 (id, dt) values (118, '2010-04-29 00:00:00'); +insert into t1 (id, dt) values (119, '2010-04-30 00:00:00'); +insert into t1 (id, dt) values (120, '2010-05-01 00:00:00'); +insert into t1 (id, dt) values (121, '2010-05-02 00:00:00'); +insert into t1 (id, dt) values (122, '2010-05-03 00:00:00'); +insert into t1 (id, dt) values (123, '2010-05-04 00:00:00'); +insert into t1 (id, dt) values (124, '2010-05-05 00:00:00'); +insert into t1 (id, dt) values (125, '2010-05-06 00:00:00'); +insert into t1 (id, dt) values (126, '2010-05-07 00:00:00'); +insert into t1 (id, dt) values (127, '2010-05-08 00:00:00'); +insert into t1 (id, dt) values (128, '2010-05-09 00:00:00'); +insert into t1 (id, dt) values (129, '2010-05-10 00:00:00'); +insert into t1 (id, dt) values (130, '2010-05-11 00:00:00'); +insert into t1 (id, dt) values (131, '2010-05-12 00:00:00'); +insert into t1 (id, dt) values (132, '2010-05-13 00:00:00'); +insert into t1 (id, dt) values (133, '2010-05-14 00:00:00'); +insert into t1 (id, dt) values (134, '2010-05-15 00:00:00'); +insert into t1 (id, dt) values (135, '2010-05-16 00:00:00'); +insert into t1 (id, dt) values (136, '2010-05-17 00:00:00'); +insert into t1 (id, dt) values (137, '2010-05-18 00:00:00'); +insert into t1 (id, dt) values (138, '2010-05-19 00:00:00'); +insert into t1 (id, dt) values (139, '2010-05-20 00:00:00'); +insert into t1 (id, dt) values (140, '2010-05-21 00:00:00'); +insert into t1 (id, dt) values (141, '2010-05-22 00:00:00'); +insert into t1 (id, dt) values (142, '2010-05-23 00:00:00'); +insert into t1 (id, dt) values (143, '2010-05-24 00:00:00'); +insert into t1 (id, dt) values (144, '2010-05-25 00:00:00'); +insert into t1 (id, dt) values (145, '2010-05-26 00:00:00'); +insert into t1 (id, dt) values (146, '2010-05-27 00:00:00'); +insert into t1 (id, dt) values (147, '2010-05-28 00:00:00'); +insert into t1 (id, dt) values (148, '2010-05-29 00:00:00'); +insert into t1 (id, dt) values (149, '2010-05-30 00:00:00'); +insert into t1 (id, dt) values (150, '2010-05-31 00:00:00'); +insert into t1 (id, dt) values (151, '2010-06-01 00:00:00'); +insert into t1 (id, dt) values (152, '2010-06-02 00:00:00'); +insert into t1 (id, dt) values (153, '2010-06-03 00:00:00'); +insert into t1 (id, dt) values (154, '2010-06-04 00:00:00'); +insert into t1 (id, dt) values (155, '2010-06-05 00:00:00'); +insert into t1 (id, dt) values (156, '2010-06-06 00:00:00'); +insert into t1 (id, dt) values (157, '2010-06-07 00:00:00'); +insert into t1 (id, dt) values (158, '2010-06-08 00:00:00'); +insert into t1 (id, dt) values (159, '2010-06-09 00:00:00'); +insert into t1 (id, dt) values (160, '2010-06-10 00:00:00'); +insert into t1 (id, dt) values (161, '2010-06-11 00:00:00'); +insert into t1 (id, dt) values (162, '2010-06-12 00:00:00'); +insert into t1 (id, dt) values (163, '2010-06-13 00:00:00'); +insert into t1 (id, dt) values (164, '2010-06-14 00:00:00'); +insert into t1 (id, dt) values (165, '2010-06-15 00:00:00'); +insert into t1 (id, dt) values (166, '2010-06-16 00:00:00'); +insert into t1 (id, dt) values (167, '2010-06-17 00:00:00'); +insert into t1 (id, dt) values (168, '2010-06-18 00:00:00'); +insert into t1 (id, dt) values (169, '2010-06-19 00:00:00'); +insert into t1 (id, dt) values (170, '2010-06-20 00:00:00'); +insert into t1 (id, dt) values (171, '2010-06-21 00:00:00'); +insert into t1 (id, dt) values (172, '2010-06-22 00:00:00'); +insert into t1 (id, dt) values (173, '2010-06-23 00:00:00'); +insert into t1 (id, dt) values (174, '2010-06-24 00:00:00'); +insert into t1 (id, dt) values (175, '2010-06-25 00:00:00'); +insert into t1 (id, dt) values (176, '2010-06-26 00:00:00'); +insert into t1 (id, dt) values (177, '2010-06-27 00:00:00'); +insert into t1 (id, dt) values (178, '2010-06-28 00:00:00'); +insert into t1 (id, dt) values (179, '2010-06-29 00:00:00'); +insert into t1 (id, dt) values (180, '2010-06-30 00:00:00'); +insert into t1 (id, dt) values (181, '2010-07-01 00:00:00'); +insert into t1 (id, dt) values (182, '2010-07-02 00:00:00'); +insert into t1 (id, dt) values (183, '2010-07-03 00:00:00'); +insert into t1 (id, dt) values (184, '2010-07-04 00:00:00'); +insert into t1 (id, dt) values (185, '2010-07-05 00:00:00'); +insert into t1 (id, dt) values (186, '2010-07-06 00:00:00'); +insert into t1 (id, dt) values (187, '2010-07-07 00:00:00'); +insert into t1 (id, dt) values (188, '2010-07-08 00:00:00'); +insert into t1 (id, dt) values (189, '2010-07-09 00:00:00'); +insert into t1 (id, dt) values (190, '2010-07-10 00:00:00'); +insert into t1 (id, dt) values (191, '2010-07-11 00:00:00'); +insert into t1 (id, dt) values (192, '2010-07-12 00:00:00'); +insert into t1 (id, dt) values (193, '2010-07-13 00:00:00'); +insert into t1 (id, dt) values (194, '2010-07-14 00:00:00'); +insert into t1 (id, dt) values (195, '2010-07-15 00:00:00'); +insert into t1 (id, dt) values (196, '2010-07-16 00:00:00'); +insert into t1 (id, dt) values (197, '2010-07-17 00:00:00'); +insert into t1 (id, dt) values (198, '2010-07-18 00:00:00'); +insert into t1 (id, dt) values (199, '2010-07-19 00:00:00'); +insert into t1 (id, dt) values (200, '2010-07-20 00:00:00'); +insert into t1 (id, dt) values (201, '2010-07-21 00:00:00'); +insert into t1 (id, dt) values (202, '2010-07-22 00:00:00'); +insert into t1 (id, dt) values (203, '2010-07-23 00:00:00'); +insert into t1 (id, dt) values (204, '2010-07-24 00:00:00'); +insert into t1 (id, dt) values (205, '2010-07-25 00:00:00'); +insert into t1 (id, dt) values (206, '2010-07-26 00:00:00'); +insert into t1 (id, dt) values (207, '2010-07-27 00:00:00'); +insert into t1 (id, dt) values (208, '2010-07-28 00:00:00'); +insert into t1 (id, dt) values (209, '2010-07-29 00:00:00'); +insert into t1 (id, dt) values (210, '2010-07-30 00:00:00'); +insert into t1 (id, dt) values (211, '2010-07-31 00:00:00'); +insert into t1 (id, dt) values (212, '2010-08-01 00:00:00'); +insert into t1 (id, dt) values (213, '2010-08-02 00:00:00'); +insert into t1 (id, dt) values (214, '2010-08-03 00:00:00'); +insert into t1 (id, dt) values (215, '2010-08-04 00:00:00'); +insert into t1 (id, dt) values (216, '2010-08-05 00:00:00'); +insert into t1 (id, dt) values (217, '2010-08-06 00:00:00'); +insert into t1 (id, dt) values (218, '2010-08-07 00:00:00'); +insert into t1 (id, dt) values (219, '2010-08-08 00:00:00'); +insert into t1 (id, dt) values (220, '2010-08-09 00:00:00'); +insert into t1 (id, dt) values (221, '2010-08-10 00:00:00'); +insert into t1 (id, dt) values (222, '2010-08-11 00:00:00'); +insert into t1 (id, dt) values (223, '2010-08-12 00:00:00'); +insert into t1 (id, dt) values (224, '2010-08-13 00:00:00'); +insert into t1 (id, dt) values (225, '2010-08-14 00:00:00'); +insert into t1 (id, dt) values (226, '2010-08-15 00:00:00'); +insert into t1 (id, dt) values (227, '2010-08-16 00:00:00'); +insert into t1 (id, dt) values (228, '2010-08-17 00:00:00'); +insert into t1 (id, dt) values (229, '2010-08-18 00:00:00'); +insert into t1 (id, dt) values (230, '2010-08-19 00:00:00'); +insert into t1 (id, dt) values (231, '2010-08-20 00:00:00'); +insert into t1 (id, dt) values (232, '2010-08-21 00:00:00'); +insert into t1 (id, dt) values (233, '2010-08-22 00:00:00'); +insert into t1 (id, dt) values (234, '2010-08-23 00:00:00'); +insert into t1 (id, dt) values (235, '2010-08-24 00:00:00'); +insert into t1 (id, dt) values (236, '2010-08-25 00:00:00'); +insert into t1 (id, dt) values (237, '2010-08-26 00:00:00'); +insert into t1 (id, dt) values (238, '2010-08-27 00:00:00'); +insert into t1 (id, dt) values (239, '2010-08-28 00:00:00'); +insert into t1 (id, dt) values (240, '2010-08-29 00:00:00'); +insert into t1 (id, dt) values (241, '2010-08-30 00:00:00'); +insert into t1 (id, dt) values (242, '2010-08-31 00:00:00'); +insert into t1 (id, dt) values (243, '2010-09-01 00:00:00'); +insert into t1 (id, dt) values (244, '2010-09-02 00:00:00'); +insert into t1 (id, dt) values (245, '2010-09-03 00:00:00'); +insert into t1 (id, dt) values (246, '2010-09-04 00:00:00'); +insert into t1 (id, dt) values (247, '2010-09-05 00:00:00'); +insert into t1 (id, dt) values (248, '2010-09-06 00:00:00'); +insert into t1 (id, dt) values (249, '2010-09-07 00:00:00'); +insert into t1 (id, dt) values (250, '2010-09-08 00:00:00'); +insert into t1 (id, dt) values (251, '2010-09-09 00:00:00'); +insert into t1 (id, dt) values (252, '2010-09-10 00:00:00'); +insert into t1 (id, dt) values (253, '2010-09-11 00:00:00'); +insert into t1 (id, dt) values (254, '2010-09-12 00:00:00'); +insert into t1 (id, dt) values (255, '2010-09-13 00:00:00'); +insert into t1 (id, dt) values (256, '2010-09-14 00:00:00'); +insert into t1 (id, dt) values (257, '2010-09-15 00:00:00'); +insert into t1 (id, dt) values (258, '2010-09-16 00:00:00'); +insert into t1 (id, dt) values (259, '2010-09-17 00:00:00'); +insert into t1 (id, dt) values (260, '2010-09-18 00:00:00'); +insert into t1 (id, dt) values (261, '2010-09-19 00:00:00'); +insert into t1 (id, dt) values (262, '2010-09-20 00:00:00'); +insert into t1 (id, dt) values (263, '2010-09-21 00:00:00'); +insert into t1 (id, dt) values (264, '2010-09-22 00:00:00'); +insert into t1 (id, dt) values (265, '2010-09-23 00:00:00'); +insert into t1 (id, dt) values (266, '2010-09-24 00:00:00'); +insert into t1 (id, dt) values (267, '2010-09-25 00:00:00'); +insert into t1 (id, dt) values (268, '2010-09-26 00:00:00'); +insert into t1 (id, dt) values (269, '2010-09-27 00:00:00'); +insert into t1 (id, dt) values (270, '2010-09-28 00:00:00'); +insert into t1 (id, dt) values (271, '2010-09-29 00:00:00'); +insert into t1 (id, dt) values (272, '2010-09-30 00:00:00'); +insert into t1 (id, dt) values (273, '2010-10-01 00:00:00'); +insert into t1 (id, dt) values (274, '2010-10-02 00:00:00'); +insert into t1 (id, dt) values (275, '2010-10-03 00:00:00'); +insert into t1 (id, dt) values (276, '2010-10-04 00:00:00'); +insert into t1 (id, dt) values (277, '2010-10-05 00:00:00'); +insert into t1 (id, dt) values (278, '2010-10-06 00:00:00'); +insert into t1 (id, dt) values (279, '2010-10-07 00:00:00'); +insert into t1 (id, dt) values (280, '2010-10-08 00:00:00'); +insert into t1 (id, dt) values (281, '2010-10-09 00:00:00'); +insert into t1 (id, dt) values (282, '2010-10-10 00:00:00'); +insert into t1 (id, dt) values (283, '2010-10-11 00:00:00'); +insert into t1 (id, dt) values (284, '2010-10-12 00:00:00'); +insert into t1 (id, dt) values (285, '2010-10-13 00:00:00'); +insert into t1 (id, dt) values (286, '2010-10-14 00:00:00'); +insert into t1 (id, dt) values (287, '2010-10-15 00:00:00'); +insert into t1 (id, dt) values (288, '2010-10-16 00:00:00'); +insert into t1 (id, dt) values (289, '2010-10-17 00:00:00'); +insert into t1 (id, dt) values (290, '2010-10-18 00:00:00'); +insert into t1 (id, dt) values (291, '2010-10-19 00:00:00'); +insert into t1 (id, dt) values (292, '2010-10-20 00:00:00'); +insert into t1 (id, dt) values (293, '2010-10-21 00:00:00'); +insert into t1 (id, dt) values (294, '2010-10-22 00:00:00'); +insert into t1 (id, dt) values (295, '2010-10-23 00:00:00'); +insert into t1 (id, dt) values (296, '2010-10-24 00:00:00'); +insert into t1 (id, dt) values (297, '2010-10-25 00:00:00'); +insert into t1 (id, dt) values (298, '2010-10-26 00:00:00'); +insert into t1 (id, dt) values (299, '2010-10-27 00:00:00'); +insert into t1 (id, dt) values (300, '2010-10-28 00:00:00'); +insert into t1 (id, dt) values (301, '2010-10-29 00:00:00'); +insert into t1 (id, dt) values (302, '2010-10-30 00:00:00'); +insert into t1 (id, dt) values (303, '2010-10-31 00:00:00'); +insert into t1 (id, dt) values (304, '2010-11-01 00:00:00'); +insert into t1 (id, dt) values (305, '2010-11-02 00:00:00'); +insert into t1 (id, dt) values (306, '2010-11-03 00:00:00'); +insert into t1 (id, dt) values (307, '2010-11-04 00:00:00'); +insert into t1 (id, dt) values (308, '2010-11-05 00:00:00'); +insert into t1 (id, dt) values (309, '2010-11-06 00:00:00'); +insert into t1 (id, dt) values (310, '2010-11-07 00:00:00'); +insert into t1 (id, dt) values (311, '2010-11-08 00:00:00'); +insert into t1 (id, dt) values (312, '2010-11-09 00:00:00'); +insert into t1 (id, dt) values (313, '2010-11-10 00:00:00'); +insert into t1 (id, dt) values (314, '2010-11-11 00:00:00'); +insert into t1 (id, dt) values (315, '2010-11-12 00:00:00'); +insert into t1 (id, dt) values (316, '2010-11-13 00:00:00'); +insert into t1 (id, dt) values (317, '2010-11-14 00:00:00'); +insert into t1 (id, dt) values (318, '2010-11-15 00:00:00'); +insert into t1 (id, dt) values (319, '2010-11-16 00:00:00'); +insert into t1 (id, dt) values (320, '2010-11-17 00:00:00'); +insert into t1 (id, dt) values (321, '2010-11-18 00:00:00'); +insert into t1 (id, dt) values (322, '2010-11-19 00:00:00'); +insert into t1 (id, dt) values (323, '2010-11-20 00:00:00'); +insert into t1 (id, dt) values (324, '2010-11-21 00:00:00'); +insert into t1 (id, dt) values (325, '2010-11-22 00:00:00'); +insert into t1 (id, dt) values (326, '2010-11-23 00:00:00'); +insert into t1 (id, dt) values (327, '2010-11-24 00:00:00'); +insert into t1 (id, dt) values (328, '2010-11-25 00:00:00'); +insert into t1 (id, dt) values (329, '2010-11-26 00:00:00'); +insert into t1 (id, dt) values (330, '2010-11-27 00:00:00'); +insert into t1 (id, dt) values (331, '2010-11-28 00:00:00'); +insert into t1 (id, dt) values (332, '2010-11-29 00:00:00'); +insert into t1 (id, dt) values (333, '2010-11-30 00:00:00'); +insert into t1 (id, dt) values (334, '2010-12-01 00:00:00'); +insert into t1 (id, dt) values (335, '2010-12-02 00:00:00'); +insert into t1 (id, dt) values (336, '2010-12-03 00:00:00'); +insert into t1 (id, dt) values (337, '2010-12-04 00:00:00'); +insert into t1 (id, dt) values (338, '2010-12-05 00:00:00'); +insert into t1 (id, dt) values (339, '2010-12-06 00:00:00'); +insert into t1 (id, dt) values (340, '2010-12-07 00:00:00'); +insert into t1 (id, dt) values (341, '2010-12-08 00:00:00'); +insert into t1 (id, dt) values (342, '2010-12-09 00:00:00'); +insert into t1 (id, dt) values (343, '2010-12-10 00:00:00'); +insert into t1 (id, dt) values (344, '2010-12-11 00:00:00'); +insert into t1 (id, dt) values (345, '2010-12-12 00:00:00'); +insert into t1 (id, dt) values (346, '2010-12-13 00:00:00'); +insert into t1 (id, dt) values (347, '2010-12-14 00:00:00'); +insert into t1 (id, dt) values (348, '2010-12-15 00:00:00'); +insert into t1 (id, dt) values (349, '2010-12-16 00:00:00'); +insert into t1 (id, dt) values (350, '2010-12-17 00:00:00'); +SELECT COUNT(*) FROM t1; +COUNT(*) +350 +connection node_2; +call p1(100);; +connection node_1a; +call p1(100);; +connection node_3; +call p1(100);; +connection node_4; +call p1(100);; +connection node_1; +SET SESSION wsrep_OSU_method='RSU'; +SELECT @@wsrep_OSU_method; +@@wsrep_OSU_method +RSU +SET SESSION sql_log_bin = 0; +ALTER TABLE t1 DROP PARTITION rx2009xx; +ALTER TABLE t1 DROP PARTITION rx201004; +ALTER TABLE t1 DROP PARTITION rx201008; +SET SESSION wsrep_OSU_METHOD='TOI'; +SELECT @@wsrep_OSU_method; +@@wsrep_OSU_method +TOI +connection node_2; +connection node_3; +connection node_4; +connection node_1a; +DROP TABLE t1; +DROP PROCEDURE p1; diff --git a/mysql-test/suite/galera/t/galera_partition.cnf b/mysql-test/suite/galera/t/galera_partition.cnf new file mode 100644 index 00000000000..e6cb13ef523 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_partition.cnf @@ -0,0 +1,18 @@ +!include ../galera_4nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=10M;gmcast.segment=1' +wsrep_slave_threads=10 + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=10M;gmcast.segment=1' +wsrep_slave_threads=10 + +[mysqld.3] +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gcache.size=10M;gmcast.segment=2' +wsrep_slave_threads=10 + +[mysqld.4] +wsrep_provider_options='base_port=@mysqld.4.#galera_port;gcache.size=10M;gmcast.segment=3' +wsrep_slave_threads=10 + diff --git a/mysql-test/suite/galera/t/galera_partition.test b/mysql-test/suite/galera/t/galera_partition.test new file mode 100644 index 00000000000..a2044936cd1 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_partition.test @@ -0,0 +1,453 @@ +--source include/galera_cluster.inc +--source include/have_partition.inc + +--connection node_1 + +call mtr.add_suppression("WSREP: RSU failed due to pending transactions, schema: test, query ALTER.*"); +call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +--connection node_1 + +CREATE TABLE t1( + id bigint unsigned NOT NULL AUTO_INCREMENT, + dt datetime NOT NULL, + PRIMARY KEY (id,dt), + KEY dt_idx (dt) +) ENGINE=InnoDB +PARTITION BY RANGE( TO_DAYS(dt) ) ( +PARTITION rx2009xx VALUES LESS THAN( TO_DAYS('2010-01-01 00:00:00') ), +PARTITION rx201001 VALUES LESS THAN( TO_DAYS('2010-02-01 00:00:00') ), +PARTITION rx201002 VALUES LESS THAN( TO_DAYS('2010-03-01 00:00:00') ), +PARTITION rx201003 VALUES LESS THAN( TO_DAYS('2010-04-01 00:00:00') ), +PARTITION rx201004 VALUES LESS THAN( TO_DAYS('2010-05-01 00:00:00') ), +PARTITION rx201005 VALUES LESS THAN( TO_DAYS('2010-06-01 00:00:00') ), +PARTITION rx201006 VALUES LESS THAN( TO_DAYS('2010-07-01 00:00:00') ), +PARTITION rx201007 VALUES LESS THAN( TO_DAYS('2010-08-01 00:00:00') ), +PARTITION rx201008 VALUES LESS THAN( TO_DAYS('2010-09-01 00:00:00') ), +PARTITION rx201009 VALUES LESS THAN( TO_DAYS('2010-10-01 00:00:00') ), +PARTITION rx201010 VALUES LESS THAN( TO_DAYS('2010-11-01 00:00:00') ), +PARTITION rx201011 VALUES LESS THAN( TO_DAYS('2010-12-01 00:00:00') ), +PARTITION rx201012 VALUES LESS THAN( TO_DAYS('2011-01-01 00:00:00') ), +PARTITION rx2011 VALUES LESS THAN MAXVALUE); + +DELIMITER |; +CREATE PROCEDURE p1 (repeat_count int) +BEGIN + DECLARE current_num int; + SET current_num = 0; + WHILE current_num < repeat_count do + INSERT INTO t1 VALUES (NULL, '2010-10-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2010-02-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2010-03-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2010-04-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2010-06-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2010-10-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2012-02-21 00:00:00'); + COMMIT; + SET current_num = current_num + 1; + END WHILE; +END| +DELIMITER ;| + +insert into t1 (id, dt) values (1, '2010-01-02 00:00:00'); +insert into t1 (id, dt) values (2, '2010-01-03 00:00:00'); +insert into t1 (id, dt) values (3, '2010-01-04 00:00:00'); +insert into t1 (id, dt) values (4, '2010-01-05 00:00:00'); +insert into t1 (id, dt) values (5, '2010-01-06 00:00:00'); +insert into t1 (id, dt) values (6, '2010-01-07 00:00:00'); +insert into t1 (id, dt) values (7, '2010-01-08 00:00:00'); +insert into t1 (id, dt) values (8, '2010-01-09 00:00:00'); +insert into t1 (id, dt) values (9, '2010-01-10 00:00:00'); +insert into t1 (id, dt) values (10, '2010-01-11 00:00:00'); +insert into t1 (id, dt) values (11, '2010-01-12 00:00:00'); +insert into t1 (id, dt) values (12, '2010-01-13 00:00:00'); +insert into t1 (id, dt) values (13, '2010-01-14 00:00:00'); +insert into t1 (id, dt) values (14, '2010-01-15 00:00:00'); +insert into t1 (id, dt) values (15, '2010-01-16 00:00:00'); +insert into t1 (id, dt) values (16, '2010-01-17 00:00:00'); +insert into t1 (id, dt) values (17, '2010-01-18 00:00:00'); +insert into t1 (id, dt) values (18, '2010-01-19 00:00:00'); +insert into t1 (id, dt) values (19, '2010-01-20 00:00:00'); +insert into t1 (id, dt) values (20, '2010-01-21 00:00:00'); +insert into t1 (id, dt) values (21, '2010-01-22 00:00:00'); +insert into t1 (id, dt) values (22, '2010-01-23 00:00:00'); +insert into t1 (id, dt) values (23, '2010-01-24 00:00:00'); +insert into t1 (id, dt) values (24, '2010-01-25 00:00:00'); +insert into t1 (id, dt) values (25, '2010-01-26 00:00:00'); +insert into t1 (id, dt) values (26, '2010-01-27 00:00:00'); +insert into t1 (id, dt) values (27, '2010-01-28 00:00:00'); +insert into t1 (id, dt) values (28, '2010-01-29 00:00:00'); +insert into t1 (id, dt) values (29, '2010-01-30 00:00:00'); +insert into t1 (id, dt) values (30, '2010-01-31 00:00:00'); +insert into t1 (id, dt) values (31, '2010-02-01 00:00:00'); +insert into t1 (id, dt) values (32, '2010-02-02 00:00:00'); +insert into t1 (id, dt) values (33, '2010-02-03 00:00:00'); +insert into t1 (id, dt) values (34, '2010-02-04 00:00:00'); +insert into t1 (id, dt) values (35, '2010-02-05 00:00:00'); +insert into t1 (id, dt) values (36, '2010-02-06 00:00:00'); +insert into t1 (id, dt) values (37, '2010-02-07 00:00:00'); +insert into t1 (id, dt) values (38, '2010-02-08 00:00:00'); +insert into t1 (id, dt) values (39, '2010-02-09 00:00:00'); +insert into t1 (id, dt) values (40, '2010-02-10 00:00:00'); +insert into t1 (id, dt) values (41, '2010-02-11 00:00:00'); +insert into t1 (id, dt) values (42, '2010-02-12 00:00:00'); +insert into t1 (id, dt) values (43, '2010-02-13 00:00:00'); +insert into t1 (id, dt) values (44, '2010-02-14 00:00:00'); +insert into t1 (id, dt) values (45, '2010-02-15 00:00:00'); +insert into t1 (id, dt) values (46, '2010-02-16 00:00:00'); +insert into t1 (id, dt) values (47, '2010-02-17 00:00:00'); +insert into t1 (id, dt) values (48, '2010-02-18 00:00:00'); +insert into t1 (id, dt) values (49, '2010-02-19 00:00:00'); +insert into t1 (id, dt) values (50, '2010-02-20 00:00:00'); +insert into t1 (id, dt) values (51, '2010-02-21 00:00:00'); +insert into t1 (id, dt) values (52, '2010-02-22 00:00:00'); +insert into t1 (id, dt) values (53, '2010-02-23 00:00:00'); +insert into t1 (id, dt) values (54, '2010-02-24 00:00:00'); +insert into t1 (id, dt) values (55, '2010-02-25 00:00:00'); +insert into t1 (id, dt) values (56, '2010-02-26 00:00:00'); +insert into t1 (id, dt) values (57, '2010-02-27 00:00:00'); +insert into t1 (id, dt) values (58, '2010-02-28 00:00:00'); +insert into t1 (id, dt) values (59, '2010-03-01 00:00:00'); +insert into t1 (id, dt) values (60, '2010-03-02 00:00:00'); +insert into t1 (id, dt) values (61, '2010-03-03 00:00:00'); +insert into t1 (id, dt) values (62, '2010-03-04 00:00:00'); +insert into t1 (id, dt) values (63, '2010-03-05 00:00:00'); +insert into t1 (id, dt) values (64, '2010-03-06 00:00:00'); +insert into t1 (id, dt) values (65, '2010-03-07 00:00:00'); +insert into t1 (id, dt) values (66, '2010-03-08 00:00:00'); +insert into t1 (id, dt) values (67, '2010-03-09 00:00:00'); +insert into t1 (id, dt) values (68, '2010-03-10 00:00:00'); +insert into t1 (id, dt) values (69, '2010-03-11 00:00:00'); +insert into t1 (id, dt) values (70, '2010-03-12 00:00:00'); +insert into t1 (id, dt) values (71, '2010-03-13 00:00:00'); +insert into t1 (id, dt) values (72, '2010-03-14 00:00:00'); +insert into t1 (id, dt) values (73, '2010-03-15 00:00:00'); +insert into t1 (id, dt) values (74, '2010-03-16 00:00:00'); +insert into t1 (id, dt) values (75, '2010-03-17 00:00:00'); +insert into t1 (id, dt) values (76, '2010-03-18 00:00:00'); +insert into t1 (id, dt) values (77, '2010-03-19 00:00:00'); +insert into t1 (id, dt) values (78, '2010-03-20 00:00:00'); +insert into t1 (id, dt) values (79, '2010-03-21 00:00:00'); +insert into t1 (id, dt) values (80, '2010-03-22 00:00:00'); +insert into t1 (id, dt) values (81, '2010-03-23 00:00:00'); +insert into t1 (id, dt) values (82, '2010-03-24 00:00:00'); +insert into t1 (id, dt) values (83, '2010-03-25 00:00:00'); +insert into t1 (id, dt) values (84, '2010-03-26 00:00:00'); +insert into t1 (id, dt) values (85, '2010-03-27 00:00:00'); +insert into t1 (id, dt) values (86, '2010-03-28 00:00:00'); +insert into t1 (id, dt) values (87, '2010-03-29 00:00:00'); +insert into t1 (id, dt) values (88, '2010-03-30 00:00:00'); +insert into t1 (id, dt) values (89, '2010-03-31 00:00:00'); +insert into t1 (id, dt) values (90, '2010-04-01 00:00:00'); +insert into t1 (id, dt) values (91, '2010-04-02 00:00:00'); +insert into t1 (id, dt) values (92, '2010-04-03 00:00:00'); +insert into t1 (id, dt) values (93, '2010-04-04 00:00:00'); +insert into t1 (id, dt) values (94, '2010-04-05 00:00:00'); +insert into t1 (id, dt) values (95, '2010-04-06 00:00:00'); +insert into t1 (id, dt) values (96, '2010-04-07 00:00:00'); +insert into t1 (id, dt) values (97, '2010-04-08 00:00:00'); +insert into t1 (id, dt) values (98, '2010-04-09 00:00:00'); +insert into t1 (id, dt) values (99, '2010-04-10 00:00:00'); +insert into t1 (id, dt) values (100, '2010-04-11 00:00:00'); +insert into t1 (id, dt) values (101, '2010-04-12 00:00:00'); +insert into t1 (id, dt) values (102, '2010-04-13 00:00:00'); +insert into t1 (id, dt) values (103, '2010-04-14 00:00:00'); +insert into t1 (id, dt) values (104, '2010-04-15 00:00:00'); +insert into t1 (id, dt) values (105, '2010-04-16 00:00:00'); +insert into t1 (id, dt) values (106, '2010-04-17 00:00:00'); +insert into t1 (id, dt) values (107, '2010-04-18 00:00:00'); +insert into t1 (id, dt) values (108, '2010-04-19 00:00:00'); +insert into t1 (id, dt) values (109, '2010-04-20 00:00:00'); +insert into t1 (id, dt) values (110, '2010-04-21 00:00:00'); +insert into t1 (id, dt) values (111, '2010-04-22 00:00:00'); +insert into t1 (id, dt) values (112, '2010-04-23 00:00:00'); +insert into t1 (id, dt) values (113, '2010-04-24 00:00:00'); +insert into t1 (id, dt) values (114, '2010-04-25 00:00:00'); +insert into t1 (id, dt) values (115, '2010-04-26 00:00:00'); +insert into t1 (id, dt) values (116, '2010-04-27 00:00:00'); +insert into t1 (id, dt) values (117, '2010-04-28 00:00:00'); +insert into t1 (id, dt) values (118, '2010-04-29 00:00:00'); +insert into t1 (id, dt) values (119, '2010-04-30 00:00:00'); +insert into t1 (id, dt) values (120, '2010-05-01 00:00:00'); +insert into t1 (id, dt) values (121, '2010-05-02 00:00:00'); +insert into t1 (id, dt) values (122, '2010-05-03 00:00:00'); +insert into t1 (id, dt) values (123, '2010-05-04 00:00:00'); +insert into t1 (id, dt) values (124, '2010-05-05 00:00:00'); +insert into t1 (id, dt) values (125, '2010-05-06 00:00:00'); +insert into t1 (id, dt) values (126, '2010-05-07 00:00:00'); +insert into t1 (id, dt) values (127, '2010-05-08 00:00:00'); +insert into t1 (id, dt) values (128, '2010-05-09 00:00:00'); +insert into t1 (id, dt) values (129, '2010-05-10 00:00:00'); +insert into t1 (id, dt) values (130, '2010-05-11 00:00:00'); +insert into t1 (id, dt) values (131, '2010-05-12 00:00:00'); +insert into t1 (id, dt) values (132, '2010-05-13 00:00:00'); +insert into t1 (id, dt) values (133, '2010-05-14 00:00:00'); +insert into t1 (id, dt) values (134, '2010-05-15 00:00:00'); +insert into t1 (id, dt) values (135, '2010-05-16 00:00:00'); +insert into t1 (id, dt) values (136, '2010-05-17 00:00:00'); +insert into t1 (id, dt) values (137, '2010-05-18 00:00:00'); +insert into t1 (id, dt) values (138, '2010-05-19 00:00:00'); +insert into t1 (id, dt) values (139, '2010-05-20 00:00:00'); +insert into t1 (id, dt) values (140, '2010-05-21 00:00:00'); +insert into t1 (id, dt) values (141, '2010-05-22 00:00:00'); +insert into t1 (id, dt) values (142, '2010-05-23 00:00:00'); +insert into t1 (id, dt) values (143, '2010-05-24 00:00:00'); +insert into t1 (id, dt) values (144, '2010-05-25 00:00:00'); +insert into t1 (id, dt) values (145, '2010-05-26 00:00:00'); +insert into t1 (id, dt) values (146, '2010-05-27 00:00:00'); +insert into t1 (id, dt) values (147, '2010-05-28 00:00:00'); +insert into t1 (id, dt) values (148, '2010-05-29 00:00:00'); +insert into t1 (id, dt) values (149, '2010-05-30 00:00:00'); +insert into t1 (id, dt) values (150, '2010-05-31 00:00:00'); +insert into t1 (id, dt) values (151, '2010-06-01 00:00:00'); +insert into t1 (id, dt) values (152, '2010-06-02 00:00:00'); +insert into t1 (id, dt) values (153, '2010-06-03 00:00:00'); +insert into t1 (id, dt) values (154, '2010-06-04 00:00:00'); +insert into t1 (id, dt) values (155, '2010-06-05 00:00:00'); +insert into t1 (id, dt) values (156, '2010-06-06 00:00:00'); +insert into t1 (id, dt) values (157, '2010-06-07 00:00:00'); +insert into t1 (id, dt) values (158, '2010-06-08 00:00:00'); +insert into t1 (id, dt) values (159, '2010-06-09 00:00:00'); +insert into t1 (id, dt) values (160, '2010-06-10 00:00:00'); +insert into t1 (id, dt) values (161, '2010-06-11 00:00:00'); +insert into t1 (id, dt) values (162, '2010-06-12 00:00:00'); +insert into t1 (id, dt) values (163, '2010-06-13 00:00:00'); +insert into t1 (id, dt) values (164, '2010-06-14 00:00:00'); +insert into t1 (id, dt) values (165, '2010-06-15 00:00:00'); +insert into t1 (id, dt) values (166, '2010-06-16 00:00:00'); +insert into t1 (id, dt) values (167, '2010-06-17 00:00:00'); +insert into t1 (id, dt) values (168, '2010-06-18 00:00:00'); +insert into t1 (id, dt) values (169, '2010-06-19 00:00:00'); +insert into t1 (id, dt) values (170, '2010-06-20 00:00:00'); +insert into t1 (id, dt) values (171, '2010-06-21 00:00:00'); +insert into t1 (id, dt) values (172, '2010-06-22 00:00:00'); +insert into t1 (id, dt) values (173, '2010-06-23 00:00:00'); +insert into t1 (id, dt) values (174, '2010-06-24 00:00:00'); +insert into t1 (id, dt) values (175, '2010-06-25 00:00:00'); +insert into t1 (id, dt) values (176, '2010-06-26 00:00:00'); +insert into t1 (id, dt) values (177, '2010-06-27 00:00:00'); +insert into t1 (id, dt) values (178, '2010-06-28 00:00:00'); +insert into t1 (id, dt) values (179, '2010-06-29 00:00:00'); +insert into t1 (id, dt) values (180, '2010-06-30 00:00:00'); +insert into t1 (id, dt) values (181, '2010-07-01 00:00:00'); +insert into t1 (id, dt) values (182, '2010-07-02 00:00:00'); +insert into t1 (id, dt) values (183, '2010-07-03 00:00:00'); +insert into t1 (id, dt) values (184, '2010-07-04 00:00:00'); +insert into t1 (id, dt) values (185, '2010-07-05 00:00:00'); +insert into t1 (id, dt) values (186, '2010-07-06 00:00:00'); +insert into t1 (id, dt) values (187, '2010-07-07 00:00:00'); +insert into t1 (id, dt) values (188, '2010-07-08 00:00:00'); +insert into t1 (id, dt) values (189, '2010-07-09 00:00:00'); +insert into t1 (id, dt) values (190, '2010-07-10 00:00:00'); +insert into t1 (id, dt) values (191, '2010-07-11 00:00:00'); +insert into t1 (id, dt) values (192, '2010-07-12 00:00:00'); +insert into t1 (id, dt) values (193, '2010-07-13 00:00:00'); +insert into t1 (id, dt) values (194, '2010-07-14 00:00:00'); +insert into t1 (id, dt) values (195, '2010-07-15 00:00:00'); +insert into t1 (id, dt) values (196, '2010-07-16 00:00:00'); +insert into t1 (id, dt) values (197, '2010-07-17 00:00:00'); +insert into t1 (id, dt) values (198, '2010-07-18 00:00:00'); +insert into t1 (id, dt) values (199, '2010-07-19 00:00:00'); +insert into t1 (id, dt) values (200, '2010-07-20 00:00:00'); +insert into t1 (id, dt) values (201, '2010-07-21 00:00:00'); +insert into t1 (id, dt) values (202, '2010-07-22 00:00:00'); +insert into t1 (id, dt) values (203, '2010-07-23 00:00:00'); +insert into t1 (id, dt) values (204, '2010-07-24 00:00:00'); +insert into t1 (id, dt) values (205, '2010-07-25 00:00:00'); +insert into t1 (id, dt) values (206, '2010-07-26 00:00:00'); +insert into t1 (id, dt) values (207, '2010-07-27 00:00:00'); +insert into t1 (id, dt) values (208, '2010-07-28 00:00:00'); +insert into t1 (id, dt) values (209, '2010-07-29 00:00:00'); +insert into t1 (id, dt) values (210, '2010-07-30 00:00:00'); +insert into t1 (id, dt) values (211, '2010-07-31 00:00:00'); +insert into t1 (id, dt) values (212, '2010-08-01 00:00:00'); +insert into t1 (id, dt) values (213, '2010-08-02 00:00:00'); +insert into t1 (id, dt) values (214, '2010-08-03 00:00:00'); +insert into t1 (id, dt) values (215, '2010-08-04 00:00:00'); +insert into t1 (id, dt) values (216, '2010-08-05 00:00:00'); +insert into t1 (id, dt) values (217, '2010-08-06 00:00:00'); +insert into t1 (id, dt) values (218, '2010-08-07 00:00:00'); +insert into t1 (id, dt) values (219, '2010-08-08 00:00:00'); +insert into t1 (id, dt) values (220, '2010-08-09 00:00:00'); +insert into t1 (id, dt) values (221, '2010-08-10 00:00:00'); +insert into t1 (id, dt) values (222, '2010-08-11 00:00:00'); +insert into t1 (id, dt) values (223, '2010-08-12 00:00:00'); +insert into t1 (id, dt) values (224, '2010-08-13 00:00:00'); +insert into t1 (id, dt) values (225, '2010-08-14 00:00:00'); +insert into t1 (id, dt) values (226, '2010-08-15 00:00:00'); +insert into t1 (id, dt) values (227, '2010-08-16 00:00:00'); +insert into t1 (id, dt) values (228, '2010-08-17 00:00:00'); +insert into t1 (id, dt) values (229, '2010-08-18 00:00:00'); +insert into t1 (id, dt) values (230, '2010-08-19 00:00:00'); +insert into t1 (id, dt) values (231, '2010-08-20 00:00:00'); +insert into t1 (id, dt) values (232, '2010-08-21 00:00:00'); +insert into t1 (id, dt) values (233, '2010-08-22 00:00:00'); +insert into t1 (id, dt) values (234, '2010-08-23 00:00:00'); +insert into t1 (id, dt) values (235, '2010-08-24 00:00:00'); +insert into t1 (id, dt) values (236, '2010-08-25 00:00:00'); +insert into t1 (id, dt) values (237, '2010-08-26 00:00:00'); +insert into t1 (id, dt) values (238, '2010-08-27 00:00:00'); +insert into t1 (id, dt) values (239, '2010-08-28 00:00:00'); +insert into t1 (id, dt) values (240, '2010-08-29 00:00:00'); +insert into t1 (id, dt) values (241, '2010-08-30 00:00:00'); +insert into t1 (id, dt) values (242, '2010-08-31 00:00:00'); +insert into t1 (id, dt) values (243, '2010-09-01 00:00:00'); +insert into t1 (id, dt) values (244, '2010-09-02 00:00:00'); +insert into t1 (id, dt) values (245, '2010-09-03 00:00:00'); +insert into t1 (id, dt) values (246, '2010-09-04 00:00:00'); +insert into t1 (id, dt) values (247, '2010-09-05 00:00:00'); +insert into t1 (id, dt) values (248, '2010-09-06 00:00:00'); +insert into t1 (id, dt) values (249, '2010-09-07 00:00:00'); +insert into t1 (id, dt) values (250, '2010-09-08 00:00:00'); +insert into t1 (id, dt) values (251, '2010-09-09 00:00:00'); +insert into t1 (id, dt) values (252, '2010-09-10 00:00:00'); +insert into t1 (id, dt) values (253, '2010-09-11 00:00:00'); +insert into t1 (id, dt) values (254, '2010-09-12 00:00:00'); +insert into t1 (id, dt) values (255, '2010-09-13 00:00:00'); +insert into t1 (id, dt) values (256, '2010-09-14 00:00:00'); +insert into t1 (id, dt) values (257, '2010-09-15 00:00:00'); +insert into t1 (id, dt) values (258, '2010-09-16 00:00:00'); +insert into t1 (id, dt) values (259, '2010-09-17 00:00:00'); +insert into t1 (id, dt) values (260, '2010-09-18 00:00:00'); +insert into t1 (id, dt) values (261, '2010-09-19 00:00:00'); +insert into t1 (id, dt) values (262, '2010-09-20 00:00:00'); +insert into t1 (id, dt) values (263, '2010-09-21 00:00:00'); +insert into t1 (id, dt) values (264, '2010-09-22 00:00:00'); +insert into t1 (id, dt) values (265, '2010-09-23 00:00:00'); +insert into t1 (id, dt) values (266, '2010-09-24 00:00:00'); +insert into t1 (id, dt) values (267, '2010-09-25 00:00:00'); +insert into t1 (id, dt) values (268, '2010-09-26 00:00:00'); +insert into t1 (id, dt) values (269, '2010-09-27 00:00:00'); +insert into t1 (id, dt) values (270, '2010-09-28 00:00:00'); +insert into t1 (id, dt) values (271, '2010-09-29 00:00:00'); +insert into t1 (id, dt) values (272, '2010-09-30 00:00:00'); +insert into t1 (id, dt) values (273, '2010-10-01 00:00:00'); +insert into t1 (id, dt) values (274, '2010-10-02 00:00:00'); +insert into t1 (id, dt) values (275, '2010-10-03 00:00:00'); +insert into t1 (id, dt) values (276, '2010-10-04 00:00:00'); +insert into t1 (id, dt) values (277, '2010-10-05 00:00:00'); +insert into t1 (id, dt) values (278, '2010-10-06 00:00:00'); +insert into t1 (id, dt) values (279, '2010-10-07 00:00:00'); +insert into t1 (id, dt) values (280, '2010-10-08 00:00:00'); +insert into t1 (id, dt) values (281, '2010-10-09 00:00:00'); +insert into t1 (id, dt) values (282, '2010-10-10 00:00:00'); +insert into t1 (id, dt) values (283, '2010-10-11 00:00:00'); +insert into t1 (id, dt) values (284, '2010-10-12 00:00:00'); +insert into t1 (id, dt) values (285, '2010-10-13 00:00:00'); +insert into t1 (id, dt) values (286, '2010-10-14 00:00:00'); +insert into t1 (id, dt) values (287, '2010-10-15 00:00:00'); +insert into t1 (id, dt) values (288, '2010-10-16 00:00:00'); +insert into t1 (id, dt) values (289, '2010-10-17 00:00:00'); +insert into t1 (id, dt) values (290, '2010-10-18 00:00:00'); +insert into t1 (id, dt) values (291, '2010-10-19 00:00:00'); +insert into t1 (id, dt) values (292, '2010-10-20 00:00:00'); +insert into t1 (id, dt) values (293, '2010-10-21 00:00:00'); +insert into t1 (id, dt) values (294, '2010-10-22 00:00:00'); +insert into t1 (id, dt) values (295, '2010-10-23 00:00:00'); +insert into t1 (id, dt) values (296, '2010-10-24 00:00:00'); +insert into t1 (id, dt) values (297, '2010-10-25 00:00:00'); +insert into t1 (id, dt) values (298, '2010-10-26 00:00:00'); +insert into t1 (id, dt) values (299, '2010-10-27 00:00:00'); +insert into t1 (id, dt) values (300, '2010-10-28 00:00:00'); +insert into t1 (id, dt) values (301, '2010-10-29 00:00:00'); +insert into t1 (id, dt) values (302, '2010-10-30 00:00:00'); +insert into t1 (id, dt) values (303, '2010-10-31 00:00:00'); +insert into t1 (id, dt) values (304, '2010-11-01 00:00:00'); +insert into t1 (id, dt) values (305, '2010-11-02 00:00:00'); +insert into t1 (id, dt) values (306, '2010-11-03 00:00:00'); +insert into t1 (id, dt) values (307, '2010-11-04 00:00:00'); +insert into t1 (id, dt) values (308, '2010-11-05 00:00:00'); +insert into t1 (id, dt) values (309, '2010-11-06 00:00:00'); +insert into t1 (id, dt) values (310, '2010-11-07 00:00:00'); +insert into t1 (id, dt) values (311, '2010-11-08 00:00:00'); +insert into t1 (id, dt) values (312, '2010-11-09 00:00:00'); +insert into t1 (id, dt) values (313, '2010-11-10 00:00:00'); +insert into t1 (id, dt) values (314, '2010-11-11 00:00:00'); +insert into t1 (id, dt) values (315, '2010-11-12 00:00:00'); +insert into t1 (id, dt) values (316, '2010-11-13 00:00:00'); +insert into t1 (id, dt) values (317, '2010-11-14 00:00:00'); +insert into t1 (id, dt) values (318, '2010-11-15 00:00:00'); +insert into t1 (id, dt) values (319, '2010-11-16 00:00:00'); +insert into t1 (id, dt) values (320, '2010-11-17 00:00:00'); +insert into t1 (id, dt) values (321, '2010-11-18 00:00:00'); +insert into t1 (id, dt) values (322, '2010-11-19 00:00:00'); +insert into t1 (id, dt) values (323, '2010-11-20 00:00:00'); +insert into t1 (id, dt) values (324, '2010-11-21 00:00:00'); +insert into t1 (id, dt) values (325, '2010-11-22 00:00:00'); +insert into t1 (id, dt) values (326, '2010-11-23 00:00:00'); +insert into t1 (id, dt) values (327, '2010-11-24 00:00:00'); +insert into t1 (id, dt) values (328, '2010-11-25 00:00:00'); +insert into t1 (id, dt) values (329, '2010-11-26 00:00:00'); +insert into t1 (id, dt) values (330, '2010-11-27 00:00:00'); +insert into t1 (id, dt) values (331, '2010-11-28 00:00:00'); +insert into t1 (id, dt) values (332, '2010-11-29 00:00:00'); +insert into t1 (id, dt) values (333, '2010-11-30 00:00:00'); +insert into t1 (id, dt) values (334, '2010-12-01 00:00:00'); +insert into t1 (id, dt) values (335, '2010-12-02 00:00:00'); +insert into t1 (id, dt) values (336, '2010-12-03 00:00:00'); +insert into t1 (id, dt) values (337, '2010-12-04 00:00:00'); +insert into t1 (id, dt) values (338, '2010-12-05 00:00:00'); +insert into t1 (id, dt) values (339, '2010-12-06 00:00:00'); +insert into t1 (id, dt) values (340, '2010-12-07 00:00:00'); +insert into t1 (id, dt) values (341, '2010-12-08 00:00:00'); +insert into t1 (id, dt) values (342, '2010-12-09 00:00:00'); +insert into t1 (id, dt) values (343, '2010-12-10 00:00:00'); +insert into t1 (id, dt) values (344, '2010-12-11 00:00:00'); +insert into t1 (id, dt) values (345, '2010-12-12 00:00:00'); +insert into t1 (id, dt) values (346, '2010-12-13 00:00:00'); +insert into t1 (id, dt) values (347, '2010-12-14 00:00:00'); +insert into t1 (id, dt) values (348, '2010-12-15 00:00:00'); +insert into t1 (id, dt) values (349, '2010-12-16 00:00:00'); +insert into t1 (id, dt) values (350, '2010-12-17 00:00:00'); + +SELECT COUNT(*) FROM t1; + +--connection node_2 +--send call p1(100); + +--connection node_1a +--send call p1(100); + +--connection node_3 +--send call p1(100); + +--connection node_4 +--send call p1(100); + +--connection node_1 +SET SESSION wsrep_OSU_method='RSU'; +SELECT @@wsrep_OSU_method; +SET SESSION sql_log_bin = 0; + +--error 0,ER_LOCK_DEADLOCK +ALTER TABLE t1 DROP PARTITION rx2009xx; +--error 0,ER_LOCK_DEADLOCK +ALTER TABLE t1 DROP PARTITION rx201004; +--error 0,ER_LOCK_DEADLOCK +ALTER TABLE t1 DROP PARTITION rx201008; + +SET SESSION wsrep_OSU_METHOD='TOI'; +SELECT @@wsrep_OSU_method; + +--connection node_2 +--error 0,ER_LOCK_DEADLOCK +reap; + +--connection node_3 +--error 0,ER_LOCK_DEADLOCK +reap; + +--connection node_4 +--error 0,ER_LOCK_DEADLOCK +reap; + +--connection node_1a +--error 0,ER_LOCK_DEADLOCK +reap; +DROP TABLE t1; +DROP PROCEDURE p1; + diff --git a/mysql-test/suite/innodb_zip/r/cmp_per_index.result b/mysql-test/suite/innodb_zip/r/cmp_per_index.result index f73aad7e02a..b4e34040630 100644 --- a/mysql-test/suite/innodb_zip/r/cmp_per_index.result +++ b/mysql-test/suite/innodb_zip/r/cmp_per_index.result @@ -1,5 +1,4 @@ -SET GLOBAL innodb_purge_rseg_truncate_frequency=1; -SET GLOBAL innodb_fast_shutdown=0; +SET @save_enabled= @@GLOBAL.innodb_cmp_per_index_enabled; SET GLOBAL innodb_cmp_per_index_enabled=ON; SELECT * FROM information_schema.innodb_cmp_per_index; CREATE TABLE t ( @@ -72,34 +71,5 @@ index_name PRIMARY compress_ops 65 compress_ops_ok 65 uncompress_ops 0 -# restart -SHOW CREATE TABLE t; -Table t -Create Table CREATE TABLE `t` ( - `a` int(11) NOT NULL, - `b` varchar(512) DEFAULT NULL, - `c` varchar(16) DEFAULT NULL, - PRIMARY KEY (`a`), - KEY `b` (`b`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=2 -SET GLOBAL innodb_cmp_per_index_enabled=ON; -SELECT COUNT(*) FROM t IGNORE INDEX(b); -COUNT(*) 128 -SELECT -database_name, -table_name, -index_name, -compress_ops, -compress_ops_ok, -CASE WHEN uncompress_ops=6 and @@innodb_compression_level IN (4,8,9) THEN 9 -ELSE uncompress_ops END as uncompress_ops -FROM information_schema.innodb_cmp_per_index -ORDER BY 1, 2, 3; -database_name test -table_name t -index_name PRIMARY -compress_ops 0 -compress_ops_ok 0 -uncompress_ops 4 DROP TABLE t; -SET GLOBAL innodb_cmp_per_index_enabled=default; +SET GLOBAL innodb_cmp_per_index_enabled=@save_enabled; diff --git a/mysql-test/suite/innodb_zip/t/cmp_per_index.test b/mysql-test/suite/innodb_zip/t/cmp_per_index.test index 15f5b2de6e4..74ed17b1213 100644 --- a/mysql-test/suite/innodb_zip/t/cmp_per_index.test +++ b/mysql-test/suite/innodb_zip/t/cmp_per_index.test @@ -19,12 +19,9 @@ if (`SELECT @@innodb_log_compressed_pages = 0`) # include/restart_mysqld.inc does not work in embedded mode -- source include/not_embedded.inc -# ensure that all history gets purged on shutdown -SET GLOBAL innodb_purge_rseg_truncate_frequency=1; -SET GLOBAL innodb_fast_shutdown=0; - -- vertical_results +SET @save_enabled= @@GLOBAL.innodb_cmp_per_index_enabled; SET GLOBAL innodb_cmp_per_index_enabled=ON; # reset any leftover stats from previous tests @@ -96,29 +93,6 @@ ELSE compress_ops_ok END as compress_ops_ok, uncompress_ops FROM information_schema.innodb_cmp_per_index ORDER BY 1, 2, 3; - -# restart mysqld and see that uncompress ops also gets increased when -# selecting from the table again - --- source include/restart_mysqld.inc - -SHOW CREATE TABLE t; - -SET GLOBAL innodb_cmp_per_index_enabled=ON; - -SELECT COUNT(*) FROM t IGNORE INDEX(b); - -SELECT -database_name, -table_name, -index_name, -compress_ops, -compress_ops_ok, -CASE WHEN uncompress_ops=6 and @@innodb_compression_level IN (4,8,9) THEN 9 -ELSE uncompress_ops END as uncompress_ops -FROM information_schema.innodb_cmp_per_index -ORDER BY 1, 2, 3; - DROP TABLE t; -SET GLOBAL innodb_cmp_per_index_enabled=default; +SET GLOBAL innodb_cmp_per_index_enabled=@save_enabled; diff --git a/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.opt b/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.opt new file mode 100644 index 00000000000..7111d384b40 --- /dev/null +++ b/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.opt @@ -0,0 +1 @@ +--loose-innodb-log-file-size=1048576 --loose-innodb-log-files-in-group=2 diff --git a/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.result b/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.result new file mode 100644 index 00000000000..29abe038afe --- /dev/null +++ b/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.result @@ -0,0 +1,2 @@ +CREATE TABLE t(i INT) ENGINE=INNODB; +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.test b/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.test new file mode 100644 index 00000000000..22165ff29be --- /dev/null +++ b/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.test @@ -0,0 +1,20 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_sequence.inc + +CREATE TABLE t(i INT) ENGINE=INNODB; + +--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup + +# Generate enough redo log records to make at least one loop in log group +--let before_innodb_log_copy_thread_started=INSERT INTO test.t SELECT * from test.seq_1_to_102400 + +--disable_result_log +# mariabackup must exit with error instead of hanging +--error 1 +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --dbug=+d,mariabackup_events; +--enable_result_log + +DROP TABLE t; +--rmdir $targetdir + diff --git a/mysql-test/suite/sys_vars/r/innodb_buffer_pool_size_basic.result b/mysql-test/suite/sys_vars/r/innodb_buffer_pool_size_basic.result index e6210165436..6c5068956b9 100644 --- a/mysql-test/suite/sys_vars/r/innodb_buffer_pool_size_basic.result +++ b/mysql-test/suite/sys_vars/r/innodb_buffer_pool_size_basic.result @@ -50,5 +50,4 @@ COUNT(@@GLOBAL.innodb_buffer_pool_size) 1 Expected SELECT innodb_buffer_pool_size = @@SESSION.innodb_buffer_pool_size; ERROR 42S22: Unknown column 'innodb_buffer_pool_size' in 'field list' -Expected error 'Readonly variable' -SET @@GLOBAL.innodb_buffer_pool_size = @start_buffer_pool_size; +# restart diff --git a/mysql-test/suite/sys_vars/t/innodb_buffer_pool_size_basic.test b/mysql-test/suite/sys_vars/t/innodb_buffer_pool_size_basic.test index c5b4c118da2..4dd4a3aba0a 100644 --- a/mysql-test/suite/sys_vars/t/innodb_buffer_pool_size_basic.test +++ b/mysql-test/suite/sys_vars/t/innodb_buffer_pool_size_basic.test @@ -27,7 +27,6 @@ --disable_query_log if (`select (version() like '%debug%') > 0`) { - set @old_innodb_disable_resize = @@innodb_disable_resize_buffer_pool_debug; set global innodb_disable_resize_buffer_pool_debug = OFF; } --enable_query_log @@ -116,15 +115,7 @@ SELECT COUNT(@@GLOBAL.innodb_buffer_pool_size); --Error ER_BAD_FIELD_ERROR SELECT innodb_buffer_pool_size = @@SESSION.innodb_buffer_pool_size; ---echo Expected error 'Readonly variable' -SET @@GLOBAL.innodb_buffer_pool_size = @start_buffer_pool_size; ---source include/wait_condition.inc - ---disable_query_log -if (`select (version() like '%debug%') > 0`) -{ - set global innodb_disable_resize_buffer_pool_debug = @old_innodb_disable_resize; -} ---enable_query_log +# Restore the original buffer pool size. +--source include/restart_mysqld.inc diff --git a/sql/derror.cc b/sql/derror.cc index a1150596ee3..14b60ee4db4 100644 --- a/sql/derror.cc +++ b/sql/derror.cc @@ -69,6 +69,9 @@ bool init_errmessage(void) { const char **errmsgs; bool error= FALSE; + const char *lang= my_default_lc_messages->errmsgs->language; + my_bool use_english; + DBUG_ENTER("init_errmessage"); free_error_messages(); @@ -77,35 +80,63 @@ bool init_errmessage(void) error_message_charset_info= system_charset_info; - /* Read messages from file. */ - if (read_texts(ERRMSG_FILE, my_default_lc_messages->errmsgs->language, - &original_error_messages)) + use_english= !strcmp(lang, "english"); + if (!use_english) { - /* - No error messages. Create a temporary empty error message so - that we don't get a crash if some code wrongly tries to access - a non existing error message. - */ + /* Read messages from file. */ + use_english= !read_texts(ERRMSG_FILE,lang, &original_error_messages); + error= TRUE; + } + + if (use_english) + { + static const struct + { + const char* name; + uint id; + const char* fmt; + } + english_msgs[]= + { + #include <mysqld_ername.h> + }; + + memset(errors_per_range, 0, sizeof(errors_per_range)); + /* Calculate nr of messages per range. */ + for (size_t i= 0; i < array_elements(english_msgs); i++) + { + uint id= english_msgs[i].id; + + // We rely on the fact the array is sorted by id. + DBUG_ASSERT(i == 0 || english_msgs[i-1].id < id); + + errors_per_range[id/ERRORS_PER_RANGE-1]= id%ERRORS_PER_RANGE + 1; + } + + size_t all_errors= 0; + for (size_t i= 0; i < MAX_ERROR_RANGES; i++) + all_errors+= errors_per_range[i]; + if (!(original_error_messages= (const char***) - my_malloc(MAX_ERROR_RANGES * sizeof(char**) + - (ERRORS_PER_RANGE * sizeof(char*)), - MYF(0)))) + my_malloc((all_errors + MAX_ERROR_RANGES)* sizeof(void*), + MYF(MY_ZEROFILL)))) DBUG_RETURN(TRUE); - errmsgs= (const char**) (original_error_messages + MAX_ERROR_RANGES); - for (uint i=0 ; i < MAX_ERROR_RANGES ; i++) + errmsgs= (const char**)(original_error_messages + MAX_ERROR_RANGES); + + original_error_messages[0]= errmsgs; + for (uint i= 1; i < MAX_ERROR_RANGES; i++) { - original_error_messages[i]= errmsgs; - errors_per_range[i]= ERRORS_PER_RANGE; + original_error_messages[i]= + original_error_messages[i-1] + errors_per_range[i-1]; } - errors_per_range[2]= 0; // MYSYS error messages - - for (const char **ptr= errmsgs; - ptr < errmsgs + ERRORS_PER_RANGE ; - ptr++) - *ptr= ""; - error= TRUE; + for (uint i= 0; i < array_elements(english_msgs); i++) + { + uint id= english_msgs[i].id; + original_error_messages[id/ERRORS_PER_RANGE-1][id%ERRORS_PER_RANGE]= + english_msgs[i].fmt; + } } /* Register messages for use with my_error(). */ diff --git a/sql/item.cc b/sql/item.cc index 925d44a481f..dc39755f63d 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -10108,6 +10108,8 @@ bool Item_cache_str::cache_value() value_buff.copy(*value); value= &value_buff; } + else + value_buff.copy(); return TRUE; } diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 0a91d45c2a2..8eaa0ab7c36 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -2468,6 +2468,7 @@ public: bool to_be_transformed_into_in_subq(THD *thd); bool create_value_list_for_tvc(THD *thd, List< List<Item> > *values); Item *in_predicate_to_in_subs_transformer(THD *thd, uchar *arg); + uint32 max_length_of_left_expr(); }; class cmp_item_row :public cmp_item diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 961bbdaabc8..23767bfbc16 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -861,7 +861,12 @@ bool subquery_types_allow_materialization(THD* thd, Item_in_subselect *in_subs) OPT_TRACE_TRANSFORM(thd, trace_wrapper, trace_transform, in_subs->get_select_lex()->select_number, "IN (SELECT)", "materialization"); - + + /* + The checks here must be kept in sync with the one in + Item_func_in::in_predicate_to_in_subs_transformer(). + */ + bool all_are_fields= TRUE; uint32 total_key_length = 0; for (uint i= 0; i < elements; i++) diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 8631d800001..eb3c35a4492 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -2627,7 +2627,7 @@ sp_head::backpatch_goto(THD *thd, sp_label *lab,sp_label *lab_begin_block) } if (bp->instr_type == CPOP) { - uint n= lab->ctx->diff_cursors(lab_begin_block->ctx, true); + uint n= bp->instr->m_ctx->diff_cursors(lab_begin_block->ctx, true); if (n == 0) { // Remove cpop instr @@ -2644,7 +2644,7 @@ sp_head::backpatch_goto(THD *thd, sp_label *lab,sp_label *lab_begin_block) } if (bp->instr_type == HPOP) { - uint n= lab->ctx->diff_handlers(lab_begin_block->ctx, true); + uint n= bp->instr->m_ctx->diff_handlers(lab_begin_block->ctx, true); if (n == 0) { // Remove hpop instr @@ -3149,6 +3149,8 @@ void sp_head::optimize() sp_instr *i; uint src, dst; + DBUG_EXECUTE_IF("sp_head_optimize_disable", return; ); + opt_mark(); bp.empty(); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 3430762fa49..8c695988853 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4305,10 +4305,10 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, continue; { - /* Check that there's no repeating constraint names. */ + /* Check that there's no repeating table CHECK constraint names. */ List_iterator_fast<Virtual_column_info> dup_it(alter_info->check_constraint_list); - Virtual_column_info *dup_check; + const Virtual_column_info *dup_check; while ((dup_check= dup_it++) && dup_check != check) { if (!lex_string_cmp(system_charset_info, @@ -4320,6 +4320,27 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, } } + /* Check that there's no repeating key constraint names. */ + List_iterator_fast<Key> key_it(alter_info->key_list); + while (const Key *key= key_it++) + { + /* + Not all keys considered to be the CONSTRAINT + Noly Primary Key UNIQUE and Foreign keys. + */ + if (key->type != Key::PRIMARY && key->type != Key::UNIQUE && + key->type != Key::FOREIGN_KEY) + continue; + + if (check->name.length == key->name.length && + my_strcasecmp(system_charset_info, + check->name.str, key->name.str) == 0) + { + my_error(ER_DUP_CONSTRAINT_NAME, MYF(0), "CHECK", check->name.str); + DBUG_RETURN(TRUE); + } + } + if (check_string_char_length(&check->name, 0, NAME_CHAR_LEN, system_charset_info, 1)) { @@ -8657,6 +8678,35 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, } } } + + if (!alter_info->check_constraint_list.is_empty()) + { + /* Check the table FOREIGN KEYs for name duplications. */ + List <FOREIGN_KEY_INFO> fk_child_key_list; + FOREIGN_KEY_INFO *f_key; + table->file->get_foreign_key_list(thd, &fk_child_key_list); + List_iterator<FOREIGN_KEY_INFO> fk_key_it(fk_child_key_list); + while ((f_key= fk_key_it++)) + { + List_iterator_fast<Virtual_column_info> + c_it(alter_info->check_constraint_list); + Virtual_column_info *check; + while ((check= c_it++)) + { + if (!check->name.length || check->automatic_name) + continue; + + if (check->name.length == f_key->foreign_id->length && + my_strcasecmp(system_charset_info, f_key->foreign_id->str, + check->name.str) == 0) + { + my_error(ER_DUP_CONSTRAINT_NAME, MYF(0), "CHECK", check->name.str); + goto err; + } + } + } + } + /* Add new constraints */ new_constraint_list.append(&alter_info->check_constraint_list); diff --git a/sql/sql_tvc.cc b/sql/sql_tvc.cc index e7379a77049..5265d254a05 100644 --- a/sql/sql_tvc.cc +++ b/sql/sql_tvc.cc @@ -795,6 +795,38 @@ bool Item_subselect::wrap_tvc_into_select(THD *thd, st_select_lex *tvc_sl) } +/* + @brief + Check whether the items are of comparable type or not + + @details + This check are done because materialization is not performed + if the left expr and right expr are of the same types. + @see subquery_types_allow_materialization() + + @retval + 0 comparable + 1 not comparable +*/ + +static bool cmp_row_types(Item* item1, Item* item2) +{ + uint n= item1->cols(); + if (item2->check_cols(n)) + return true; + + for (uint i=0; i < n; i++) + { + Item *inner= item1->element_index(i); + Item *outer= item2->element_index(i); + if (!inner->type_handler()->subquery_type_allows_materialization(inner, + outer)) + return true; + } + return false; +} + + /** @brief Transform IN predicate into IN subquery @@ -839,10 +871,22 @@ Item *Item_func_in::in_predicate_to_in_subs_transformer(THD *thd, /* SELECT_LEX object where the transformation is performed */ SELECT_LEX *parent_select= lex->current_select; uint8 save_derived_tables= lex->derived_tables; + + /* + Make sure that create_tmp_table will not fail due to too long keys. + Here the strategy would mainly use materialization, so we need to make + sure that the materialized table can be created. + + The checks here are the same as in subquery_type_allows_materialization() + */ + uint32 length= max_length_of_left_expr(); + if (!length || length > tmp_table_max_key_length() || + args[0]->cols() > tmp_table_max_key_parts()) + return this; for (uint i=1; i < arg_count; i++) { - if (!args[i]->const_item()) + if (!args[i]->const_item() || cmp_row_types(args[0], args[i])) return this; } @@ -947,6 +991,16 @@ err: } +uint32 Item_func_in::max_length_of_left_expr() +{ + uint n= args[0]->cols(); + uint32 length= 0; + for (uint i=0; i < n; i++) + length+= args[0]->element_index(i)->max_length; + return length; +} + + /** @brief Check if this IN-predicate can be transformed in IN-subquery diff --git a/sql/temporary_tables.cc b/sql/temporary_tables.cc index b39423e9131..2e0f0a4918e 100644 --- a/sql/temporary_tables.cc +++ b/sql/temporary_tables.cc @@ -346,6 +346,13 @@ bool THD::open_temporary_table(TABLE_LIST *tl) DBUG_RETURN(false); } + if (!tl->db.str) + { + DBUG_PRINT("info", + ("Table reference to a temporary table must have database set")); + DBUG_RETURN(false); + } + /* Temporary tables are not safe for parallel replication. They were designed to be visible to one thread only, so have no table locking. diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index 3180923c02f..05cdf758472 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -782,7 +782,7 @@ btr_node_ptr_set_child_page_no( rec_t* rec, /*!< in: node pointer record */ page_zip_des_t* page_zip,/*!< in/out: compressed page whose uncompressed part will be updated, or NULL */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint page_no,/*!< in: child node address */ mtr_t* mtr) /*!< in: mtr */ { @@ -817,7 +817,7 @@ btr_node_ptr_get_child( /*===================*/ const rec_t* node_ptr,/*!< in: node pointer */ dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ mtr_t* mtr) /*!< in: mtr */ { ut_ad(rec_offs_validate(node_ptr, index, offsets)); @@ -836,10 +836,10 @@ Returns the upper level node pointer to a page. It is assumed that mtr holds an sx-latch on the tree. @return rec_get_offsets() of the node pointer record */ static -ulint* +offset_t* btr_page_get_father_node_ptr_func( /*==============================*/ - ulint* offsets,/*!< in: work area for the return value */ + offset_t* offsets,/*!< in: work area for the return value */ mem_heap_t* heap, /*!< in: memory heap to use */ btr_cur_t* cursor, /*!< in: cursor pointing to user record, out: cursor on node pointer record, @@ -943,10 +943,10 @@ Returns the upper level node pointer to a page. It is assumed that mtr holds an x-latch on the tree. @return rec_get_offsets() of the node pointer record */ static -ulint* +offset_t* btr_page_get_father_block( /*======================*/ - ulint* offsets,/*!< in: work area for the return value */ + offset_t* offsets,/*!< in: work area for the return value */ mem_heap_t* heap, /*!< in: memory heap to use */ dict_index_t* index, /*!< in: b-tree index */ buf_block_t* block, /*!< in: child page in the index */ @@ -1881,7 +1881,7 @@ btr_root_raise_and_insert( on the root page; when the function returns, the cursor is positioned on the predecessor of the inserted record */ - ulint** offsets,/*!< out: offsets on inserted record */ + offset_t** offsets,/*!< out: offsets on inserted record */ mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ const dtuple_t* tuple, /*!< in: tuple to insert */ ulint n_ext, /*!< in: number of externally stored columns */ @@ -2225,7 +2225,7 @@ btr_page_get_split_rec( rec_t* next_rec; ulint n; mem_heap_t* heap; - ulint* offsets; + offset_t* offsets; page = btr_cur_get_page(cursor); @@ -2331,7 +2331,7 @@ btr_page_insert_fits( const rec_t* split_rec,/*!< in: suggestion for first record on upper half-page, or NULL if tuple to be inserted should be first */ - ulint** offsets,/*!< in: rec_get_offsets( + offset_t** offsets,/*!< in: rec_get_offsets( split_rec, cursor->index); out: garbage */ const dtuple_t* tuple, /*!< in: tuple to insert */ ulint n_ext, /*!< in: number of externally stored columns */ @@ -2431,8 +2431,8 @@ btr_insert_on_non_leaf_level_func( dberr_t err; rec_t* rec; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); rtr_info_t rtr_info; @@ -2540,7 +2540,7 @@ btr_attach_half_pages( if (direction == FSP_DOWN) { btr_cur_t cursor; - ulint* offsets; + offset_t* offsets; lower_page = buf_block_get_frame(new_block); lower_page_no = new_block->page.id.page_no(); @@ -2662,7 +2662,7 @@ btr_page_tuple_smaller( /*===================*/ btr_cur_t* cursor, /*!< in: b-tree cursor */ const dtuple_t* tuple, /*!< in: tuple to consider */ - ulint** offsets,/*!< in/out: temporary storage */ + offset_t** offsets,/*!< in/out: temporary storage */ ulint n_uniq, /*!< in: number of unique fields in the index page records */ mem_heap_t** heap) /*!< in/out: heap for offsets */ @@ -2702,7 +2702,7 @@ rec_t* btr_insert_into_right_sibling( ulint flags, btr_cur_t* cursor, - ulint** offsets, + offset_t** offsets, mem_heap_t* heap, const dtuple_t* tuple, ulint n_ext, @@ -2838,7 +2838,7 @@ btr_page_split_and_insert( btr_cur_t* cursor, /*!< in: cursor at which to insert; when the function returns, the cursor is positioned on the predecessor of the inserted record */ - ulint** offsets,/*!< out: offsets on inserted record */ + offset_t** offsets,/*!< out: offsets on inserted record */ mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ const dtuple_t* tuple, /*!< in: tuple to insert */ ulint n_ext, /*!< in: number of externally stored columns */ @@ -3390,7 +3390,7 @@ btr_lift_page_up( { btr_cur_t cursor; - ulint* offsets = NULL; + offset_t* offsets = NULL; mem_heap_t* heap = mem_heap_create( sizeof(*offsets) * (REC_OFFS_HEADER_SIZE + 1 + 1 @@ -3582,7 +3582,7 @@ btr_compress( page_t* page; btr_cur_t father_cursor; mem_heap_t* heap; - ulint* offsets; + offset_t* offsets; ulint nth_rec = 0; /* remove bogus warning */ bool mbr_changed = false; #ifdef UNIV_DEBUG @@ -3725,7 +3725,7 @@ retry: if (is_left) { btr_cur_t cursor2; rtr_mbr_t new_mbr; - ulint* offsets2 = NULL; + offset_t* offsets2 = NULL; /* For rtree, we need to update father's mbr. */ if (dict_index_is_spatial(index)) { @@ -3921,7 +3921,7 @@ retry: /* For rtree, we need to update father's mbr. */ if (dict_index_is_spatial(index)) { - ulint* offsets2; + offset_t* offsets2; ulint rec_info; offsets2 = rec_get_offsets( @@ -4150,7 +4150,7 @@ btr_discard_only_page_on_level( mem_heap_t* heap = NULL; const rec_t* rec = NULL; - ulint* offsets = NULL; + offset_t* offsets = NULL; if (index->table->instant) { const rec_t* r = page_rec_get_next(page_get_infimum_rec( block->frame)); @@ -4395,7 +4395,7 @@ btr_print_recursive( ulint width, /*!< in: print this many entries from start and end */ mem_heap_t** heap, /*!< in/out: heap for rec_get_offsets() */ - ulint** offsets,/*!< in/out: buffer for rec_get_offsets() */ + offset_t** offsets,/*!< in/out: buffer for rec_get_offsets() */ mtr_t* mtr) /*!< in: mtr */ { const page_t* page = buf_block_get_frame(block); @@ -4459,8 +4459,8 @@ btr_print_index( mtr_t mtr; buf_block_t* root; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); fputs("--------------------------\n" @@ -4494,7 +4494,7 @@ btr_check_node_ptr( { mem_heap_t* heap; dtuple_t* tuple; - ulint* offsets; + offset_t* offsets; btr_cur_t cursor; page_t* page = buf_block_get_frame(block); @@ -4574,8 +4574,8 @@ btr_index_rec_validate( ulint len; const page_t* page; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); page = page_align(rec); @@ -4840,8 +4840,8 @@ btr_validate_level( bool ret = true; mtr_t mtr; mem_heap_t* heap = mem_heap_create(256); - ulint* offsets = NULL; - ulint* offsets2= NULL; + offset_t* offsets = NULL; + offset_t* offsets2= NULL; #ifdef UNIV_ZIP_DEBUG page_zip_des_t* page_zip; #endif /* UNIV_ZIP_DEBUG */ diff --git a/storage/innobase/btr/btr0bulk.cc b/storage/innobase/btr/btr0bulk.cc index 864e1160bbd..4f341d3b2c6 100644 --- a/storage/innobase/btr/btr0bulk.cc +++ b/storage/innobase/btr/btr0bulk.cc @@ -175,7 +175,7 @@ PageBulk::init() void PageBulk::insert( const rec_t* rec, - ulint* offsets) + offset_t* offsets) { ulint rec_size; @@ -188,7 +188,7 @@ PageBulk::insert( /* Check whether records are in order. */ if (!page_rec_is_infimum(m_cur_rec)) { rec_t* old_rec = m_cur_rec; - ulint* old_offsets = rec_get_offsets( + offset_t* old_offsets = rec_get_offsets( old_rec, m_index, NULL, is_leaf, ULINT_UNDEFINED, &m_heap); @@ -401,7 +401,7 @@ rec_t* PageBulk::getSplitRec() { rec_t* rec; - ulint* offsets; + offset_t* offsets; ulint total_used_size; ulint total_recs_size; ulint n_recs; @@ -447,7 +447,7 @@ PageBulk::copyIn( { rec_t* rec = split_rec; - ulint* offsets = NULL; + offset_t* offsets = NULL; ut_ad(m_rec_no == 0); ut_ad(page_rec_is_user_rec(rec)); @@ -493,7 +493,7 @@ PageBulk::copyOut( ut_ad(n > 0); /* Set last record's next in page */ - ulint* offsets = NULL; + offset_t* offsets = NULL; rec = page_rec_get_prev(split_rec); offsets = rec_get_offsets(rec, m_index, offsets, page_rec_is_leaf(split_rec), @@ -603,7 +603,7 @@ the blob data is logged first, then the record is logged in bulk mode. dberr_t PageBulk::storeExt( const big_rec_t* big_rec, - ulint* offsets) + offset_t* offsets) { /* Note: not all fileds are initialized in btr_pcur. */ btr_pcur_t btr_pcur; @@ -863,7 +863,7 @@ BtrBulk::insert( ulint rec_size = rec_get_converted_size(m_index, tuple, n_ext); big_rec_t* big_rec = NULL; rec_t* rec = NULL; - ulint* offsets = NULL; + offset_t* offsets = NULL; if (page_bulk->needExt(tuple, rec_size)) { /* The record is so big that we have to store some fields diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index 6b33c997e75..00eef937b6c 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -158,7 +158,7 @@ btr_cur_unmark_extern_fields( part will be updated, or NULL */ rec_t* rec, /*!< in/out: record in a clustered index */ dict_index_t* index, /*!< in: index of the page */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ mtr_t* mtr); /*!< in: mtr, or NULL if not logged */ /*******************************************************************//** Adds path information to the cursor for the current page, for which @@ -183,7 +183,7 @@ btr_rec_free_updated_extern_fields( rec_t* rec, /*!< in: record */ page_zip_des_t* page_zip,/*!< in: compressed page whose uncompressed part will be updated, or NULL */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ const upd_t* update, /*!< in: update vector */ bool rollback,/*!< in: performing rollback? */ mtr_t* mtr); /*!< in: mini-transaction handle which contains @@ -197,7 +197,7 @@ btr_rec_free_externally_stored_fields( dict_index_t* index, /*!< in: index of the data, the index tree MUST be X-latched */ rec_t* rec, /*!< in: record */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ page_zip_des_t* page_zip,/*!< in: compressed page whose uncompressed part will be updated, or NULL */ bool rollback,/*!< in: performing rollback? */ @@ -592,8 +592,8 @@ incompatible: } mem_heap_t* heap = NULL; - ulint* offsets = rec_get_offsets(rec, index, NULL, true, - ULINT_UNDEFINED, &heap); + offset_t* offsets = rec_get_offsets(rec, index, NULL, true, + ULINT_UNDEFINED, &heap); if (rec_offs_any_default(offsets)) { inconsistent: mem_heap_free(heap); @@ -1277,10 +1277,10 @@ btr_cur_search_to_nth_level_func( btr_search_t* info; #endif /* BTR_CUR_ADAPT */ mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; - ulint offsets2_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets2 = offsets2_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; + offset_t offsets2_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets2 = offsets2_; rec_offs_init(offsets_); rec_offs_init(offsets2_); /* Currently, PAGE_CUR_LE is the only search mode used for searches @@ -2542,8 +2542,8 @@ btr_cur_open_at_index_side_func( ulint n_blocks = 0; ulint n_releases = 0; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; dberr_t err = DB_SUCCESS; rec_offs_init(offsets_); @@ -2911,8 +2911,8 @@ btr_cur_open_at_rnd_pos_func( ulint n_blocks = 0; ulint n_releases = 0; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(!index->is_spatial()); @@ -3201,7 +3201,7 @@ btr_cur_insert_if_possible( cursor stays valid */ const dtuple_t* tuple, /*!< in: tuple to insert; the size info need not have been stored to tuple */ - ulint** offsets,/*!< out: offsets on *rec */ + offset_t** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ ulint n_ext, /*!< in: number of externally stored columns */ mtr_t* mtr) /*!< in/out: mini-transaction */ @@ -3367,7 +3367,7 @@ btr_cur_optimistic_insert( specified */ btr_cur_t* cursor, /*!< in: cursor on page after which to insert; cursor stays valid */ - ulint** offsets,/*!< out: offsets on *rec */ + offset_t** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap */ dtuple_t* entry, /*!< in/out: entry to insert */ rec_t** rec, /*!< out: pointer to inserted record if @@ -3672,7 +3672,7 @@ btr_cur_pessimistic_insert( insertion will certainly succeed */ btr_cur_t* cursor, /*!< in: cursor after which to insert; cursor stays valid */ - ulint** offsets,/*!< out: offsets on *rec */ + offset_t** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap that can be emptied */ dtuple_t* entry, /*!< in/out: entry to insert */ @@ -3845,7 +3845,7 @@ btr_cur_upd_lock_and_undo( /*======================*/ ulint flags, /*!< in: undo logging and locking flags */ btr_cur_t* cursor, /*!< in: cursor on record to update */ - const ulint* offsets,/*!< in: rec_get_offsets() on cursor */ + const offset_t* offsets,/*!< in: rec_get_offsets() on cursor */ const upd_t* update, /*!< in: update vector */ ulint cmpl_info,/*!< in: compiler info on secondary index updates */ @@ -4019,7 +4019,7 @@ btr_cur_parse_update_in_place( roll_ptr_t roll_ptr; ulint rec_offset; mem_heap_t* heap; - ulint* offsets; + offset_t* offsets; if (end_ptr < ptr + 1) { @@ -4104,7 +4104,7 @@ btr_cur_update_alloc_zip_func( page_cur_t* cursor, /*!< in/out: B-tree page cursor */ dict_index_t* index, /*!< in: the index corresponding to cursor */ #ifdef UNIV_DEBUG - ulint* offsets,/*!< in/out: offsets of the cursor record */ + offset_t* offsets,/*!< in/out: offsets of the cursor record */ #endif /* UNIV_DEBUG */ ulint length, /*!< in: size needed */ bool create, /*!< in: true=delete-and-insert, @@ -4186,7 +4186,7 @@ btr_cur_update_in_place( btr_cur_t* cursor, /*!< in: cursor on the record to update; cursor stays valid and positioned on the same record */ - ulint* offsets,/*!< in/out: offsets on cursor->page_cur.rec */ + offset_t* offsets,/*!< in/out: offsets on cursor->page_cur.rec */ const upd_t* update, /*!< in: update vector */ ulint cmpl_info,/*!< in: compiler info on secondary index updates */ @@ -4479,7 +4479,7 @@ btr_cur_optimistic_update( btr_cur_t* cursor, /*!< in: cursor on the record to update; cursor stays valid and positioned on the same record */ - ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ + offset_t** offsets,/*!< out: offsets on cursor->page_cur.rec */ mem_heap_t** heap, /*!< in/out: pointer to NULL or memory heap */ const upd_t* update, /*!< in: update vector; this must also contain trx id and roll ptr fields */ @@ -4817,7 +4817,7 @@ btr_cur_pessimistic_update( btr_cur_t* cursor, /*!< in/out: cursor on the record to update; cursor may become invalid if *big_rec == NULL || !(flags & BTR_KEEP_POS_FLAG) */ - ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ + offset_t** offsets,/*!< out: offsets on cursor->page_cur.rec */ mem_heap_t** offsets_heap, /*!< in/out: pointer to memory heap that can be emptied */ @@ -5380,7 +5380,7 @@ btr_cur_parse_del_mark_set_clust_rec( clustered index fields. */ ut_ad(pos <= MAX_REF_PARTS); - ulint offsets[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; + offset_t offsets[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; rec_offs_init(offsets); mem_heap_t* heap = NULL; @@ -5423,7 +5423,7 @@ btr_cur_del_mark_set_clust_rec( buf_block_t* block, /*!< in/out: buffer block of the record */ rec_t* rec, /*!< in/out: record */ dict_index_t* index, /*!< in: clustered index of the record */ - const ulint* offsets,/*!< in: rec_get_offsets(rec) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec) */ que_thr_t* thr, /*!< in: query thread */ const dtuple_t* entry, /*!< in: dtuple for the deleting record, also contains the virtual cols if there are any */ @@ -5709,8 +5709,8 @@ btr_cur_optimistic_delete_func( buf_block_t* block; rec_t* rec; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; ibool no_compress_needed; rec_offs_init(offsets_); @@ -5892,7 +5892,7 @@ btr_cur_pessimistic_delete( bool success; ibool ret = FALSE; mem_heap_t* heap; - ulint* offsets; + offset_t* offsets; #ifdef UNIV_DEBUG bool parent_latched = false; #endif /* UNIV_DEBUG */ @@ -6044,7 +6044,7 @@ discard_page: rtr_mbr_t father_mbr; rec_t* father_rec; btr_cur_t father_cursor; - ulint* offsets; + offset_t* offsets; bool upd_ret; ulint len; @@ -6790,7 +6790,7 @@ btr_record_not_null_field_in_rec( ulint n_unique, /*!< in: dict_index_get_n_unique(index), number of columns uniquely determine an index entry */ - const ulint* offsets, /*!< in: rec_get_offsets(rec, index), + const offset_t* offsets, /*!< in: rec_get_offsets(rec, index), its size could be for all fields or that of "n_unique" */ ib_uint64_t* n_not_null) /*!< in/out: array to record number of @@ -6844,8 +6844,8 @@ btr_estimate_number_of_different_key_vals( uintmax_t add_on; mtr_t mtr; mem_heap_t* heap = NULL; - ulint* offsets_rec = NULL; - ulint* offsets_next_rec = NULL; + offset_t* offsets_rec = NULL; + offset_t* offsets_next_rec = NULL; /* For spatial index, there is no such stats can be fetched. */ @@ -7033,7 +7033,7 @@ btr_estimate_number_of_different_key_vals( and assign the old offsets_rec buffer to offsets_next_rec. */ { - ulint* offsets_tmp = offsets_rec; + offset_t* offsets_tmp = offsets_rec; offsets_rec = offsets_next_rec; offsets_next_rec = offsets_tmp; } @@ -7118,7 +7118,7 @@ static ulint btr_rec_get_field_ref_offs( /*=======================*/ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint n) /*!< in: index of the external field */ { ulint field_ref_offs; @@ -7147,7 +7147,7 @@ btr_rec_get_field_ref_offs( ulint btr_rec_get_externally_stored_len( const rec_t* rec, - const ulint* offsets) + const offset_t* offsets) { ulint n_fields; ulint total_extern_len = 0; @@ -7186,7 +7186,7 @@ btr_cur_set_ownership_of_extern_field( part will be updated, or NULL */ rec_t* rec, /*!< in/out: clustered index record */ dict_index_t* index, /*!< in: index of the page */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint i, /*!< in: field number */ ibool val, /*!< in: value to set */ mtr_t* mtr) /*!< in: mtr, or NULL if not logged */ @@ -7236,7 +7236,7 @@ btr_cur_disown_inherited_fields( part will be updated, or NULL */ rec_t* rec, /*!< in/out: record in a clustered index */ dict_index_t* index, /*!< in: index of the page */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ const upd_t* update, /*!< in: update vector */ mtr_t* mtr) /*!< in/out: mini-transaction */ { @@ -7267,7 +7267,7 @@ btr_cur_unmark_extern_fields( part will be updated, or NULL */ rec_t* rec, /*!< in/out: record in a clustered index */ dict_index_t* index, /*!< in: index of the page */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ mtr_t* mtr) /*!< in: mtr, or NULL if not logged */ { ulint n; @@ -7444,7 +7444,7 @@ struct btr_blob_log_check_t { /** Mini transaction holding the latches for m_pcur */ mtr_t* m_mtr; /** rec_get_offsets(rec, index); offset of clust_rec */ - const ulint* m_offsets; + const offset_t* m_offsets; /** The block containing clustered record */ buf_block_t** m_block; /** The clustered record pointer */ @@ -7464,7 +7464,7 @@ struct btr_blob_log_check_t { btr_blob_log_check_t( btr_pcur_t* pcur, mtr_t* mtr, - const ulint* offsets, + const offset_t* offsets, buf_block_t** block, rec_t** rec, enum blob_op op) @@ -7535,7 +7535,7 @@ struct btr_blob_log_check_t { *m_rec = btr_pcur_get_rec(m_pcur); rec_offs_make_valid(*m_rec, index, true, - const_cast<ulint*>(m_offsets)); + const_cast<offset_t*>(m_offsets)); ut_ad(m_mtr->memo_contains_page_flagged( *m_rec, @@ -7566,7 +7566,7 @@ btr_store_big_rec_extern_fields( btr_pcur_t* pcur, /*!< in/out: a persistent cursor. if btr_mtr is restarted, then this can be repositioned. */ - ulint* offsets, /*!< in/out: rec_get_offsets() on + offset_t* offsets, /*!< in/out: rec_get_offsets() on pcur. the "external storage" flags in offsets will correctly correspond to rec when this function returns */ @@ -8076,7 +8076,7 @@ btr_free_externally_stored_field( byte* field_ref, /*!< in/out: field reference */ const rec_t* rec, /*!< in: record containing field_ref, for page_zip_write_blob_ptr(), or NULL */ - const ulint* offsets, /*!< in: rec_get_offsets(rec, index), + const offset_t* offsets, /*!< in: rec_get_offsets(rec, index), or NULL */ page_zip_des_t* page_zip, /*!< in: compressed page corresponding to rec, or NULL if rec == NULL */ @@ -8249,7 +8249,7 @@ btr_rec_free_externally_stored_fields( dict_index_t* index, /*!< in: index of the data, the index tree MUST be X-latched */ rec_t* rec, /*!< in/out: record */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ page_zip_des_t* page_zip,/*!< in: compressed page whose uncompressed part will be updated, or NULL */ bool rollback,/*!< in: performing rollback? */ @@ -8290,7 +8290,7 @@ btr_rec_free_updated_extern_fields( rec_t* rec, /*!< in/out: record */ page_zip_des_t* page_zip,/*!< in: compressed page whose uncompressed part will be updated, or NULL */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ const upd_t* update, /*!< in: update vector */ bool rollback,/*!< in: performing rollback? */ mtr_t* mtr) /*!< in: mini-transaction handle which contains @@ -8687,7 +8687,7 @@ protected by a lock or a page latch byte* btr_rec_copy_externally_stored_field( const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, ulint zip_size, ulint no, ulint* len, diff --git a/storage/innobase/btr/btr0defragment.cc b/storage/innobase/btr/btr0defragment.cc index de47f3142fd..1929d339ebf 100644 --- a/storage/innobase/btr/btr0defragment.cc +++ b/storage/innobase/btr/btr0defragment.cc @@ -338,8 +338,8 @@ btr_defragment_calc_n_recs_for_size( { page_t* page = buf_block_get_frame(block); ulint n_recs = 0; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); mem_heap_t* heap = NULL; ulint size = 0; diff --git a/storage/innobase/btr/btr0pcur.cc b/storage/innobase/btr/btr0pcur.cc index 2848f8d3e96..d227d128471 100644 --- a/storage/innobase/btr/btr0pcur.cc +++ b/storage/innobase/btr/btr0pcur.cc @@ -326,16 +326,21 @@ btr_pcur_restore_position_func( if (cursor->rel_pos == BTR_PCUR_ON) { #ifdef UNIV_DEBUG const rec_t* rec; - const ulint* offsets1; - const ulint* offsets2; + offset_t offsets1_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets2_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets1 = offsets1_; + offset_t* offsets2 = offsets2_; rec = btr_pcur_get_rec(cursor); + rec_offs_init(offsets1_); + rec_offs_init(offsets2_); + heap = mem_heap_create(256); offsets1 = rec_get_offsets( - cursor->old_rec, index, NULL, true, + cursor->old_rec, index, offsets1, true, cursor->old_n_fields, &heap); offsets2 = rec_get_offsets( - rec, index, NULL, true, + rec, index, offsets2, true, cursor->old_n_fields, &heap); ut_ad(!cmp_rec_rec(cursor->old_rec, @@ -394,11 +399,13 @@ btr_pcur_restore_position_func( ut_ad(cursor->rel_pos == BTR_PCUR_ON || cursor->rel_pos == BTR_PCUR_BEFORE || cursor->rel_pos == BTR_PCUR_AFTER); + offset_t offsets[REC_OFFS_NORMAL_SIZE]; + rec_offs_init(offsets); if (cursor->rel_pos == BTR_PCUR_ON && btr_pcur_is_on_user_rec(cursor) && !cmp_dtuple_rec(tuple, btr_pcur_get_rec(cursor), rec_get_offsets(btr_pcur_get_rec(cursor), - index, NULL, true, + index, offsets, true, ULINT_UNDEFINED, &heap))) { /* We have to store the NEW value for the modify clock, diff --git a/storage/innobase/btr/btr0scrub.cc b/storage/innobase/btr/btr0scrub.cc index 001690b9bfe..448c0d9ff91 100644 --- a/storage/innobase/btr/btr0scrub.cc +++ b/storage/innobase/btr/btr0scrub.cc @@ -478,7 +478,7 @@ btr_pessimistic_scrub( /* arguments to btr_page_split_and_insert */ mem_heap_t* heap = NULL; dtuple_t* entry = NULL; - ulint* offsets = NULL; + offset_t* offsets = NULL; ulint n_ext = 0; ulint flags = BTR_MODIFY_TREE; diff --git a/storage/innobase/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc index 7d1933f9486..32f85832e6c 100644 --- a/storage/innobase/btr/btr0sea.cc +++ b/storage/innobase/btr/btr0sea.cc @@ -97,7 +97,7 @@ static inline ulint rec_fold( const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, ulint n_fields, ulint n_bytes, index_id_t tree_id) @@ -669,7 +669,7 @@ btr_search_update_hash_ref( && (block->curr_n_bytes == info->n_bytes) && (block->curr_left_side == info->left_side)) { mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; rec_offs_init(offsets_); rec = btr_cur_get_rec(cursor); @@ -722,8 +722,8 @@ btr_search_check_guess( ulint match; int cmp; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; ibool success = FALSE; rec_offs_init(offsets_); @@ -1082,7 +1082,7 @@ void btr_search_drop_page_hash_index(buf_block_t* block) ulint i; mem_heap_t* heap; const dict_index_t* index; - ulint* offsets; + offset_t* offsets; rw_lock_t* latch; btr_search_t* info; @@ -1337,8 +1337,8 @@ btr_search_build_page_hash_index( const rec_t** recs; ulint i; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; #ifdef MYSQL_INDEX_DISABLE_AHI if (index->disable_ahi) return; @@ -1642,7 +1642,7 @@ void btr_search_update_hash_on_delete(btr_cur_t* cursor) const rec_t* rec; ulint fold; dict_index_t* index; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; mem_heap_t* heap = NULL; rec_offs_init(offsets_); @@ -1797,8 +1797,8 @@ btr_search_update_hash_on_insert(btr_cur_t* cursor, rw_lock_t* ahi_latch) ibool left_side; bool locked = false; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(ahi_latch == btr_get_search_latch(cursor->index)); @@ -1955,8 +1955,8 @@ btr_search_hash_table_validate(ulint hash_table_id) ulint i; ulint cell_count; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; if (!btr_search_enabled) { return(TRUE); diff --git a/storage/innobase/dict/dict0mem.cc b/storage/innobase/dict/dict0mem.cc index 7d3f33d1ae2..c36a15b80a8 100644 --- a/storage/innobase/dict/dict0mem.cc +++ b/storage/innobase/dict/dict0mem.cc @@ -1280,7 +1280,7 @@ bool dict_table_t::deserialise_columns(const byte* metadata, ulint len) bool dict_index_t::vers_history_row( const rec_t* rec, - const ulint* offsets) + const offset_t* offsets) { ut_ad(is_primary()); @@ -1311,8 +1311,8 @@ dict_index_t::vers_history_row( bool error = false; mem_heap_t* heap = NULL; dict_index_t* clust_index = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); mtr_t mtr; diff --git a/storage/innobase/dict/dict0stats.cc b/storage/innobase/dict/dict0stats.cc index 552770dd47b..990a36524cd 100644 --- a/storage/innobase/dict/dict0stats.cc +++ b/storage/innobase/dict/dict0stats.cc @@ -1010,8 +1010,8 @@ dict_stats_analyze_index_level( bool prev_rec_is_copied; byte* prev_rec_buf = NULL; ulint prev_rec_buf_size = 0; - ulint* rec_offsets; - ulint* prev_rec_offsets; + offset_t* rec_offsets; + offset_t* prev_rec_offsets; ulint i; DEBUG_PRINTF(" %s(table=%s, index=%s, level=" ULINTPF ")\n", @@ -1032,9 +1032,9 @@ dict_stats_analyze_index_level( i = (REC_OFFS_HEADER_SIZE + 1 + 1) + n_uniq; heap = mem_heap_create((2 * sizeof *rec_offsets) * i); - rec_offsets = static_cast<ulint*>( + rec_offsets = static_cast<offset_t*>( mem_heap_alloc(heap, i * sizeof *rec_offsets)); - prev_rec_offsets = static_cast<ulint*>( + prev_rec_offsets = static_cast<offset_t*>( mem_heap_alloc(heap, i * sizeof *prev_rec_offsets)); rec_offs_set_n_alloc(rec_offsets, i); rec_offs_set_n_alloc(prev_rec_offsets, i); @@ -1327,11 +1327,11 @@ to the number of externally stored pages which were encountered @return offsets1 or offsets2 (the offsets of *out_rec), or NULL if the page is empty and does not contain user records. */ UNIV_INLINE -ulint* +offset_t* dict_stats_scan_page( const rec_t** out_rec, - ulint* offsets1, - ulint* offsets2, + offset_t* offsets1, + offset_t* offsets2, const dict_index_t* index, const page_t* page, ulint n_prefix, @@ -1339,8 +1339,8 @@ dict_stats_scan_page( ib_uint64_t* n_diff, ib_uint64_t* n_external_pages) { - ulint* offsets_rec = offsets1; - ulint* offsets_next_rec = offsets2; + offset_t* offsets_rec = offsets1; + offset_t* offsets_next_rec = offsets2; const rec_t* rec; const rec_t* next_rec; /* A dummy heap, to be passed to rec_get_offsets(). @@ -1406,23 +1406,16 @@ dict_stats_scan_page( } rec = next_rec; - { - /* Assign offsets_rec = offsets_next_rec - so that offsets_rec matches with rec which - was just assigned rec = next_rec above. - Also need to point offsets_next_rec to the - place where offsets_rec was pointing before - because we have just 2 placeholders where - data is actually stored: - offsets1 and offsets2 and we - are using them in circular fashion - (offsets[_next]_rec are just pointers to - those placeholders). */ - ulint* offsets_tmp; - offsets_tmp = offsets_rec; - offsets_rec = offsets_next_rec; - offsets_next_rec = offsets_tmp; - } + /* Assign offsets_rec = offsets_next_rec so that + offsets_rec matches with rec which was just assigned + rec = next_rec above. Also need to point + offsets_next_rec to the place where offsets_rec was + pointing before because we have just 2 placeholders + where data is actually stored: offsets1 and offsets2 + and we are using them in circular fashion + (offsets[_next]_rec are just pointers to those + placeholders). */ + std::swap(offsets_rec, offsets_next_rec); if (should_count_external_pages) { *n_external_pages += btr_rec_get_externally_stored_len( @@ -1461,9 +1454,9 @@ dict_stats_analyze_index_below_cur( const page_t* page; mem_heap_t* heap; const rec_t* rec; - ulint* offsets1; - ulint* offsets2; - ulint* offsets_rec; + offset_t* offsets1; + offset_t* offsets2; + offset_t* offsets_rec; ulint size; mtr_t mtr; @@ -1481,10 +1474,10 @@ dict_stats_analyze_index_below_cur( heap = mem_heap_create(size * (sizeof *offsets1 + sizeof *offsets2)); - offsets1 = static_cast<ulint*>(mem_heap_alloc( + offsets1 = static_cast<offset_t*>(mem_heap_alloc( heap, size * sizeof *offsets1)); - offsets2 = static_cast<ulint*>(mem_heap_alloc( + offsets2 = static_cast<offset_t*>(mem_heap_alloc( heap, size * sizeof *offsets2)); rec_offs_set_n_alloc(offsets1, size); @@ -1742,8 +1735,8 @@ dict_stats_analyze_index_for_n_prefix( ut_a(left <= right); ut_a(right <= last_idx_on_level); - const ulint rnd = right == left ? 0 : - ut_rnd_gen_ulint() % (right - left); + const ulint rnd = ut_rnd_interval( + static_cast<ulint>(right - left)); const ib_uint64_t dive_below_idx = boundaries->at(static_cast<unsigned>(left + rnd)); diff --git a/storage/innobase/eval/eval0eval.cc b/storage/innobase/eval/eval0eval.cc index 577157d2eb9..97540d00198 100644 --- a/storage/innobase/eval/eval0eval.cc +++ b/storage/innobase/eval/eval0eval.cc @@ -30,9 +30,6 @@ Created 12/29/1997 Heikki Tuuri #include "row0sel.h" #include "rem0cmp.h" -/** The RND function seed */ -static ulint eval_rnd = 128367121; - /** Dummy adress used when we should allocate a buffer of size 0 in eval_node_alloc_val_buf */ @@ -310,120 +307,18 @@ eval_aggregate( /*===========*/ func_node_t* node) /*!< in: aggregate operation node */ { - que_node_t* arg; lint val; - lint arg_val; - int func; ut_ad(que_node_get_type(node) == QUE_NODE_FUNC); val = eval_node_get_int_val(node); - func = node->func; - - if (func == PARS_COUNT_TOKEN) { - - val = val + 1; - } else { - ut_ad(func == PARS_SUM_TOKEN); - - arg = node->args; - arg_val = eval_node_get_int_val(arg); - - val = val + arg_val; - } - + ut_a(node->func == PARS_COUNT_TOKEN); + val = val + 1; eval_node_set_int_val(node, val); } /*****************************************************************//** -Evaluates a predefined function node where the function is not relevant -in benchmarks. */ -static -void -eval_predefined_2( -/*==============*/ - func_node_t* func_node) /*!< in: predefined function node */ -{ - que_node_t* arg; - que_node_t* arg1; - que_node_t* arg2 = 0; /* remove warning (??? bug ???) */ - lint int_val; - byte* data; - ulint len1; - ulint len2; - int func; - ulint i; - - ut_ad(que_node_get_type(func_node) == QUE_NODE_FUNC); - - arg1 = func_node->args; - - if (arg1) { - arg2 = que_node_get_next(arg1); - } - - func = func_node->func; - - if (func == PARS_PRINTF_TOKEN) { - - arg = arg1; - - while (arg) { - dfield_print(que_node_get_val(arg)); - - arg = que_node_get_next(arg); - } - - putc('\n', stderr); - - } else if (func == PARS_ASSERT_TOKEN) { - - if (!eval_node_get_ibool_val(arg1)) { - fputs("SQL assertion fails in a stored procedure!\n", - stderr); - } - - ut_a(eval_node_get_ibool_val(arg1)); - - /* This function, or more precisely, a debug procedure, - returns no value */ - - } else if (func == PARS_RND_TOKEN) { - - len1 = (ulint) eval_node_get_int_val(arg1); - len2 = (ulint) eval_node_get_int_val(arg2); - - ut_ad(len2 >= len1); - - if (len2 > len1) { - int_val = (lint) (len1 - + (eval_rnd % (len2 - len1 + 1))); - } else { - int_val = (lint) len1; - } - - eval_rnd = ut_rnd_gen_next_ulint(eval_rnd); - - eval_node_set_int_val(func_node, int_val); - - } else if (func == PARS_RND_STR_TOKEN) { - - len1 = (ulint) eval_node_get_int_val(arg1); - - data = eval_node_ensure_val_buf(func_node, len1); - - for (i = 0; i < len1; i++) { - data[i] = (byte)(97 + (eval_rnd % 3)); - - eval_rnd = ut_rnd_gen_next_ulint(eval_rnd); - } - } else { - ut_error; - } -} - -/*****************************************************************//** Evaluates a notfound-function node. */ UNIV_INLINE void @@ -494,46 +389,6 @@ eval_substr( } /*****************************************************************//** -Evaluates a replstr-procedure node. */ -static -void -eval_replstr( -/*=========*/ - func_node_t* func_node) /*!< in: function node */ -{ - que_node_t* arg1; - que_node_t* arg2; - que_node_t* arg3; - que_node_t* arg4; - byte* str1; - byte* str2; - ulint len1; - ulint len2; - - arg1 = func_node->args; - arg2 = que_node_get_next(arg1); - - ut_ad(que_node_get_type(arg1) == QUE_NODE_SYMBOL); - - arg3 = que_node_get_next(arg2); - arg4 = que_node_get_next(arg3); - - str1 = static_cast<byte*>(dfield_get_data(que_node_get_val(arg1))); - str2 = static_cast<byte*>(dfield_get_data(que_node_get_val(arg2))); - - len1 = (ulint) eval_node_get_int_val(arg3); - len2 = (ulint) eval_node_get_int_val(arg4); - - if ((dfield_get_len(que_node_get_val(arg1)) < len1 + len2) - || (dfield_get_len(que_node_get_val(arg2)) < len2)) { - - ut_error; - } - - ut_memcpy(str1 + len1, str2, len2); -} - -/*****************************************************************//** Evaluates an instr-function node. */ static void @@ -607,44 +462,6 @@ match_found: /*****************************************************************//** Evaluates a predefined function node. */ -UNIV_INLINE -void -eval_binary_to_number( -/*==================*/ - func_node_t* func_node) /*!< in: function node */ -{ - que_node_t* arg1; - dfield_t* dfield; - byte* str1; - byte* str2; - ulint len1; - ulint int_val; - - arg1 = func_node->args; - - dfield = que_node_get_val(arg1); - - str1 = static_cast<byte*>(dfield_get_data(dfield)); - len1 = dfield_get_len(dfield); - - if (len1 > 4) { - ut_error; - } - - if (len1 == 4) { - str2 = str1; - } else { - int_val = 0; - str2 = (byte*) &int_val; - - ut_memcpy(str2 + (4 - len1), str1, len1); - } - - eval_node_copy_and_alloc_val(func_node, str2, 4); -} - -/*****************************************************************//** -Evaluates a predefined function node. */ static void eval_concat( @@ -734,95 +551,12 @@ eval_to_binary( } /*****************************************************************//** -Evaluates a predefined function node. */ -UNIV_INLINE -void -eval_predefined( -/*============*/ - func_node_t* func_node) /*!< in: function node */ +Evaluate LENGTH(). */ +inline void eval_length(func_node_t* func_node) { - que_node_t* arg1; - lint int_val; - byte* data; - int func; - - func = func_node->func; - - arg1 = func_node->args; - - if (func == PARS_LENGTH_TOKEN) { - - int_val = (lint) dfield_get_len(que_node_get_val(arg1)); - - } else if (func == PARS_TO_CHAR_TOKEN) { - - /* Convert number to character string as a - signed decimal integer. */ - - ulint uint_val; - int int_len; - - int_val = eval_node_get_int_val(arg1); - - /* Determine the length of the string. */ - - if (int_val == 0) { - int_len = 1; /* the number 0 occupies 1 byte */ - } else { - int_len = 0; - if (int_val < 0) { - uint_val = ((ulint) -int_val - 1) + 1; - int_len++; /* reserve space for minus sign */ - } else { - uint_val = (ulint) int_val; - } - for (; uint_val > 0; int_len++) { - uint_val /= 10; - } - } - - /* allocate the string */ - data = eval_node_ensure_val_buf(func_node, ulint(int_len) + 1); - - /* add terminating NUL character */ - data[int_len] = 0; - - /* convert the number */ - - if (int_val == 0) { - data[0] = '0'; - } else { - int tmp; - if (int_val < 0) { - data[0] = '-'; /* preceding minus sign */ - uint_val = ((ulint) -int_val - 1) + 1; - } else { - uint_val = (ulint) int_val; - } - for (tmp = int_len; uint_val > 0; uint_val /= 10) { - data[--tmp] = (byte) - ('0' + (byte)(uint_val % 10)); - } - } - - dfield_set_len(que_node_get_val(func_node), ulint(int_len)); - - return; - - } else if (func == PARS_TO_NUMBER_TOKEN) { - - int_val = atoi((char*) - dfield_get_data(que_node_get_val(arg1))); - - } else if (func == PARS_SYSDATE_TOKEN) { - int_val = (lint) time(NULL); - } else { - eval_predefined_2(func_node); - - return; - } - - eval_node_set_int_val(func_node, int_val); + eval_node_set_int_val(func_node, + dfield_get_len(que_node_get_val + (func_node->args))); } /*****************************************************************//** @@ -851,8 +585,7 @@ eval_func( if (dfield_is_null(que_node_get_val(arg)) && (fclass != PARS_FUNC_CMP) - && (func != PARS_NOTFOUND_TOKEN) - && (func != PARS_PRINTF_TOKEN)) { + && (func != PARS_NOTFOUND_TOKEN)) { ut_error; } @@ -877,24 +610,20 @@ eval_func( case PARS_SUBSTR_TOKEN: eval_substr(func_node); return; - case PARS_REPLSTR_TOKEN: - eval_replstr(func_node); - return; case PARS_INSTR_TOKEN: eval_instr(func_node); return; - case PARS_BINARY_TO_NUMBER_TOKEN: - eval_binary_to_number(func_node); - return; case PARS_CONCAT_TOKEN: eval_concat(func_node); return; case PARS_TO_BINARY_TOKEN: eval_to_binary(func_node); return; - default: - eval_predefined(func_node); + case PARS_LENGTH_TOKEN: + eval_length(func_node); return; + default: + ut_error; } case PARS_FUNC_LOGICAL: eval_logical(func_node); diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc index a8b282198a6..85238f3acad 100644 --- a/storage/innobase/fts/fts0fts.cc +++ b/storage/innobase/fts/fts0fts.cc @@ -3202,7 +3202,7 @@ fts_fetch_doc_from_rec( dict_index_t* clust_index, /*!< in: cluster index */ btr_pcur_t* pcur, /*!< in: cursor whose position has been stored */ - ulint* offsets, /*!< in: offsets */ + offset_t* offsets, /*!< in: offsets */ fts_doc_t* doc) /*!< out: fts doc to hold parsed documents */ { @@ -3476,7 +3476,7 @@ fts_add_doc_by_id( btr_pcur_t* doc_pcur; const rec_t* clust_rec; btr_pcur_t clust_pcur; - ulint* offsets = NULL; + offset_t* offsets = NULL; ulint num_idx = ib_vector_size(cache->get_docs); rec = btr_pcur_get_rec(&pcur); @@ -5153,7 +5153,7 @@ doc_id_t fts_get_doc_id_from_rec( const rec_t* rec, const dict_index_t* index, - const ulint* offsets) + const offset_t* offsets) { ulint f = dict_col_get_index_pos( &index->table->cols[index->table->fts->doc_col], index); diff --git a/storage/innobase/gis/gis0geo.cc b/storage/innobase/gis/gis0geo.cc index a65616db127..dad40d19da7 100644 --- a/storage/innobase/gis/gis0geo.cc +++ b/storage/innobase/gis/gis0geo.cc @@ -434,26 +434,6 @@ pick_seeds( } } -/*********************************************************//** -Generates a random iboolean value. -@return the random value */ -static -ibool -ut_rnd_gen_ibool(void) -/*=================*/ -{ - ulint x; - - x = ut_rnd_gen_ulint(); - - if (((x >> 20) + (x >> 15)) & 1) { - - return(TRUE); - } - - return(FALSE); -} - /*************************************************************//** Select next node and group where to add. */ static @@ -490,8 +470,7 @@ pick_next( /* Introduce some randomness if the record is identical */ if (diff == 0) { - diff = static_cast<double>( - ut_rnd_gen_ibool()); + diff = static_cast<double>(ut_rnd_gen() & 1); } *n_group = 1 + (diff > 0); diff --git a/storage/innobase/gis/gis0rtree.cc b/storage/innobase/gis/gis0rtree.cc index 110690ee99f..f54cb66692f 100644 --- a/storage/innobase/gis/gis0rtree.cc +++ b/storage/innobase/gis/gis0rtree.cc @@ -51,7 +51,7 @@ rtr_page_split_initialize_nodes( btr_cur_t* cursor, /*!< in: cursor at which to insert; when the function returns, the cursor is positioned on the predecessor of the inserted record */ - ulint** offsets,/*!< in: offsets on inserted record */ + offset_t** offsets,/*!< in: offsets on inserted record */ const dtuple_t* tuple, /*!< in: tuple to insert */ double** buf_pos)/*!< in/out: current buffer position */ { @@ -192,7 +192,7 @@ rtr_update_mbr_field_in_place( /*==========================*/ dict_index_t* index, /*!< in: spatial index. */ rec_t* rec, /*!< in/out: rec to be modified.*/ - ulint* offsets, /*!< in/out: offsets on rec. */ + offset_t* offsets, /*!< in/out: offsets on rec. */ rtr_mbr_t* mbr, /*!< in: the new mbr. */ mtr_t* mtr) /*!< in: mtr */ { @@ -266,7 +266,7 @@ bool rtr_update_mbr_field( /*=================*/ btr_cur_t* cursor, /*!< in/out: cursor pointed to rec.*/ - ulint* offsets, /*!< in/out: offsets on rec. */ + offset_t* offsets, /*!< in/out: offsets on rec. */ btr_cur_t* cursor2, /*!< in/out: cursor pointed to rec that should be deleted. this cursor is for btr_compress to @@ -295,7 +295,7 @@ rtr_update_mbr_field( bool ins_suc = true; ulint cur2_pos = 0; ulint del_page_no = 0; - ulint* offsets2; + offset_t* offsets2; rec = btr_cur_get_rec(cursor); page = page_align(rec); @@ -382,7 +382,7 @@ rtr_update_mbr_field( } if (cursor2) { - ulint* offsets2; + offset_t* offsets2; if (page_zip) { cursor2->page_cur.rec @@ -404,7 +404,7 @@ rtr_update_mbr_field( page_cur_t page_cur; rec_t* insert_rec; - ulint* insert_offsets = NULL; + offset_t* insert_offsets = NULL; ulint old_pos; rec_t* old_rec; @@ -436,7 +436,7 @@ update_mbr: /* When there're not only 1 rec in the page, we do delete/insert to avoid page split. */ rec_t* insert_rec; - ulint* insert_offsets = NULL; + offset_t* insert_offsets = NULL; rec_t* next_rec; /* Delete the rec which cursor point to. */ @@ -636,7 +636,7 @@ rtr_adjust_upper_level( page_zip_des_t* new_page_zip; dict_index_t* index = sea_cur->index; btr_cur_t cursor; - ulint* offsets; + offset_t* offsets; mem_heap_t* heap; ulint level; dtuple_t* node_ptr_upper; @@ -801,8 +801,8 @@ rtr_split_page_move_rec_list( page_cur_t new_page_cursor; page_t* page; page_t* new_page; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; page_zip_des_t* new_page_zip = buf_block_get_page_zip(new_block); rec_t* rec; @@ -962,7 +962,7 @@ rtr_page_split_and_insert( btr_cur_t* cursor, /*!< in/out: cursor at which to insert; when the function returns, the cursor is positioned on the predecessor of the inserted record */ - ulint** offsets,/*!< out: offsets on inserted record */ + offset_t** offsets,/*!< out: offsets on inserted record */ mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ const dtuple_t* tuple, /*!< in: tuple to insert */ ulint n_ext, /*!< in: number of externally stored columns */ @@ -1311,7 +1311,7 @@ rtr_ins_enlarge_mbr( mem_heap_t* heap; dict_index_t* index = btr_cur->index; page_cur_t* page_cursor; - ulint* offsets; + offset_t* offsets; node_visit_t* node_visit; btr_cur_t cursor; page_t* page; @@ -1395,10 +1395,10 @@ rtr_page_copy_rec_list_end_no_locks( page_cur_t page_cur; page_cur_t cur1; rec_t* cur_rec; - ulint offsets_1[REC_OFFS_NORMAL_SIZE]; - ulint* offsets1 = offsets_1; - ulint offsets_2[REC_OFFS_NORMAL_SIZE]; - ulint* offsets2 = offsets_2; + offset_t offsets_1[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets1 = offsets_1; + offset_t offsets_2[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets2 = offsets_2; ulint moved = 0; bool is_leaf = page_is_leaf(new_page); @@ -1522,10 +1522,10 @@ rtr_page_copy_rec_list_start_no_locks( { page_cur_t cur1; rec_t* cur_rec; - ulint offsets_1[REC_OFFS_NORMAL_SIZE]; - ulint* offsets1 = offsets_1; - ulint offsets_2[REC_OFFS_NORMAL_SIZE]; - ulint* offsets2 = offsets_2; + offset_t offsets_1[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets1 = offsets_1; + offset_t offsets_2[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets2 = offsets_2; page_cur_t page_cur; ulint moved = 0; bool is_leaf = page_is_leaf(buf_block_get_frame(block)); @@ -1634,8 +1634,8 @@ rtr_merge_mbr_changed( /*==================*/ btr_cur_t* cursor, /*!< in/out: cursor */ btr_cur_t* cursor2, /*!< in: the other cursor */ - ulint* offsets, /*!< in: rec offsets */ - ulint* offsets2, /*!< in: rec offsets */ + offset_t* offsets, /*!< in: rec offsets */ + offset_t* offsets2, /*!< in: rec offsets */ rtr_mbr_t* new_mbr) /*!< out: MBR to update */ { double* mbr; @@ -1678,8 +1678,8 @@ rtr_merge_and_update_mbr( /*=====================*/ btr_cur_t* cursor, /*!< in/out: cursor */ btr_cur_t* cursor2, /*!< in: the other cursor */ - ulint* offsets, /*!< in: rec offsets */ - ulint* offsets2, /*!< in: rec offsets */ + offset_t* offsets, /*!< in: rec offsets */ + offset_t* offsets2, /*!< in: rec offsets */ page_t* child_page, /*!< in: the page. */ mtr_t* mtr) /*!< in: mtr */ { @@ -1742,7 +1742,7 @@ rtr_check_same_block( { ulint page_no = childb->page.id.page_no(); - ulint* offsets; + offset_t* offsets; rec_t* rec = page_rec_get_next(page_get_infimum_rec( buf_block_get_frame(parentb))); @@ -1773,7 +1773,7 @@ rtr_rec_cal_increase( dtuple in some of the common fields, or which has an equal number or more fields than dtuple */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ double* area) /*!< out: increased area */ { const dfield_t* dtuple_field; diff --git a/storage/innobase/gis/gis0sea.cc b/storage/innobase/gis/gis0sea.cc index 394703d0239..0f40d3aeb2a 100644 --- a/storage/innobase/gis/gis0sea.cc +++ b/storage/innobase/gis/gis0sea.cc @@ -526,7 +526,7 @@ rtr_compare_cursor_rec( mem_heap_t** heap) /*!< in: memory heap */ { const rec_t* rec; - ulint* offsets; + offset_t* offsets; rec = btr_cur_get_rec(cursor); @@ -668,7 +668,7 @@ rtr_page_get_father( { mem_heap_t* heap = mem_heap_create(100); #ifdef UNIV_DEBUG - ulint* offsets; + offset_t* offsets; offsets = rtr_page_get_father_block( NULL, heap, index, block, mtr, sea_cur, cursor); @@ -689,9 +689,9 @@ rtr_page_get_father( that mtr holds an SX-latch or X-latch on the tree. @return rec_get_offsets() of the node pointer record */ static -ulint* +offset_t* rtr_page_get_father_node_ptr( - ulint* offsets,/*!< in: work area for the return value */ + offset_t* offsets,/*!< in: work area for the return value */ mem_heap_t* heap, /*!< in: memory heap to use */ btr_cur_t* sea_cur,/*!< in: search cursor */ btr_cur_t* cursor, /*!< in: cursor pointing to user record, @@ -784,10 +784,10 @@ rtr_page_get_father_node_ptr( Returns the father block to a page. It is assumed that mtr holds an X or SX latch on the tree. @return rec_get_offsets() of the node pointer record */ -ulint* +offset_t* rtr_page_get_father_block( /*======================*/ - ulint* offsets,/*!< in: work area for the return value */ + offset_t* offsets,/*!< in: work area for the return value */ mem_heap_t* heap, /*!< in: memory heap to use */ dict_index_t* index, /*!< in: b-tree index */ buf_block_t* block, /*!< in: child page in the index */ @@ -1288,8 +1288,8 @@ rtr_cur_restore_position( #ifdef UNIV_DEBUG do { const rec_t* rec; - const ulint* offsets1; - const ulint* offsets2; + const offset_t* offsets1; + const offset_t* offsets2; ulint comp; rec = btr_pcur_get_rec(r_cursor); @@ -1360,8 +1360,8 @@ search_again: if (low_match == r_cursor->old_n_fields) { const rec_t* rec; - const ulint* offsets1; - const ulint* offsets2; + const offset_t* offsets1; + const offset_t* offsets2; ulint comp; rec = btr_pcur_get_rec(r_cursor); @@ -1407,7 +1407,7 @@ rtr_leaf_push_match_rec( /*====================*/ const rec_t* rec, /*!< in: record to copy */ rtr_info_t* rtr_info, /*!< in/out: search stack */ - ulint* offsets, /*!< in: offsets */ + offset_t* offsets, /*!< in: offsets */ bool is_comp) /*!< in: is compact format */ { byte* buf; @@ -1592,7 +1592,7 @@ void rtr_get_mbr_from_rec( /*=================*/ const rec_t* rec, /*!< in: data tuple */ - const ulint* offsets,/*!< in: offsets array */ + const offset_t* offsets,/*!< in: offsets array */ rtr_mbr_t* mbr) /*!< out MBR */ { ulint rec_f_len; @@ -1639,8 +1639,8 @@ rtr_cur_search_with_match( const page_t* page; const rec_t* rec; const rec_t* last_rec; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; mem_heap_t* heap = NULL; int cmp = 1; double least_inc = DBL_MAX; @@ -1923,8 +1923,8 @@ rtr_cur_search_with_match( test_rec = match_rec->matched_recs->back(); #ifdef UNIV_DEBUG - ulint offsets_2[REC_OFFS_NORMAL_SIZE]; - ulint* offsets2 = offsets_2; + offset_t offsets_2[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets2 = offsets_2; rec_offs_init(offsets_2); ut_ad(found); diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index c5447417969..6da14429f0d 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -3181,7 +3181,7 @@ innobase_rec_to_mysql( struct TABLE* table, /*!< in/out: MySQL table */ const rec_t* rec, /*!< in: record */ const dict_index_t* index, /*!< in: index */ - const ulint* offsets)/*!< in: rec_get_offsets( + const offset_t* offsets)/*!< in: rec_get_offsets( rec, index, ...) */ { uint n_fields = table->s->fields; @@ -5845,7 +5845,7 @@ add_all_virtual: ut_ad(j == n + f); - ulint* offsets = NULL; + offset_t* offsets = NULL; mem_heap_t* offsets_heap = NULL; big_rec_t* big_rec; err = btr_cur_pessimistic_update( diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index 6e50f02469c..642ba94d9dc 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -3280,7 +3280,7 @@ ibuf_insert_low( dtuple_t* ibuf_entry; mem_heap_t* offsets_heap = NULL; mem_heap_t* heap; - ulint* offsets = NULL; + offset_t* offsets = NULL; ulint buffered; lint min_n_recs; rec_t* ins_rec; @@ -3734,7 +3734,7 @@ ibuf_insert_to_index_page_low( buf_block_t* block, /*!< in/out: index page where the buffered entry should be placed */ dict_index_t* index, /*!< in: record descriptor */ - ulint** offsets,/*!< out: offsets on *rec */ + offset_t** offsets,/*!< out: offsets on *rec */ mem_heap_t* heap, /*!< in/out: memory heap */ mtr_t* mtr, /*!< in/out: mtr */ page_cur_t* page_cur)/*!< in/out: cursor positioned on the record @@ -3814,7 +3814,7 @@ ibuf_insert_to_index_page( ulint low_match; page_t* page = buf_block_get_frame(block); rec_t* rec; - ulint* offsets; + offset_t* offsets; mem_heap_t* heap; DBUG_ENTER("ibuf_insert_to_index_page"); @@ -4071,8 +4071,8 @@ ibuf_delete( /* TODO: the below should probably be a separate function, it's a bastardized version of btr_cur_optimistic_delete. */ - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; mem_heap_t* heap = NULL; ulint max_ins_size = 0; diff --git a/storage/innobase/include/btr0btr.h b/storage/innobase/include/btr0btr.h index 3c363420da9..e90db17b548 100644 --- a/storage/innobase/include/btr0btr.h +++ b/storage/innobase/include/btr0btr.h @@ -30,6 +30,7 @@ Created 6/2/1994 Heikki Tuuri #include "dict0dict.h" #include "data0data.h" +#include "rem0types.h" #include "page0cur.h" #include "btr0types.h" #include "gis0type.h" @@ -315,7 +316,7 @@ ulint btr_node_ptr_get_child_page_no( /*===========================*/ const rec_t* rec, /*!< in: node pointer record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ MY_ATTRIBUTE((warn_unused_result)); /** Create the root node for a new index tree. @@ -399,7 +400,7 @@ btr_root_raise_and_insert( on the root page; when the function returns, the cursor is positioned on the predecessor of the inserted record */ - ulint** offsets,/*!< out: offsets on inserted record */ + offset_t** offsets,/*!< out: offsets on inserted record */ mem_heap_t** heap, /*!< in/out: pointer to memory heap that can be emptied, or NULL */ const dtuple_t* tuple, /*!< in: tuple to insert */ @@ -482,7 +483,7 @@ btr_page_split_and_insert( btr_cur_t* cursor, /*!< in: cursor at which to insert; when the function returns, the cursor is positioned on the predecessor of the inserted record */ - ulint** offsets,/*!< out: offsets on inserted record */ + offset_t** offsets,/*!< out: offsets on inserted record */ mem_heap_t** heap, /*!< in/out: pointer to memory heap that can be emptied, or NULL */ const dtuple_t* tuple, /*!< in: tuple to insert */ diff --git a/storage/innobase/include/btr0btr.ic b/storage/innobase/include/btr0btr.ic index 1c816ffff59..42bad4861b4 100644 --- a/storage/innobase/include/btr0btr.ic +++ b/storage/innobase/include/btr0btr.ic @@ -193,7 +193,7 @@ ulint btr_node_ptr_get_child_page_no( /*===========================*/ const rec_t* rec, /*!< in: node pointer record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { const byte* field; ulint len; diff --git a/storage/innobase/include/btr0bulk.h b/storage/innobase/include/btr0bulk.h index 0fcf4a36d6b..3c127986bfe 100644 --- a/storage/innobase/include/btr0bulk.h +++ b/storage/innobase/include/btr0bulk.h @@ -28,6 +28,7 @@ Created 03/11/2014 Shaohua Wang #define btr0bulk_h #include "dict0dict.h" +#include "rem0types.h" #include "page0cur.h" #include <vector> @@ -103,7 +104,7 @@ public: /** Insert a record in the page. @param[in] rec record @param[in] offsets record offsets */ - void insert(const rec_t* rec, ulint* offsets); + void insert(const rec_t* rec, offset_t* offsets); /** Mark end of insertion to the page. Scan all records to set page dirs, and set page header members. */ @@ -127,7 +128,7 @@ public: @param[in] big_rec external recrod @param[in] offsets record offsets @return error code */ - dberr_t storeExt(const big_rec_t* big_rec, ulint* offsets); + dberr_t storeExt(const big_rec_t* big_rec, offset_t* offsets); /** Get node pointer @return node pointer */ diff --git a/storage/innobase/include/btr0cur.h b/storage/innobase/include/btr0cur.h index b28fc48405d..84286bd2680 100644 --- a/storage/innobase/include/btr0cur.h +++ b/storage/innobase/include/btr0cur.h @@ -30,6 +30,7 @@ Created 10/16/1994 Heikki Tuuri #include "dict0dict.h" #include "page0cur.h" #include "btr0types.h" +#include "rem0types.h" #include "gis0type.h" #include "my_base.h" @@ -271,7 +272,7 @@ btr_cur_optimistic_insert( specified */ btr_cur_t* cursor, /*!< in: cursor on page after which to insert; cursor stays valid */ - ulint** offsets,/*!< out: offsets on *rec */ + offset_t** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap */ dtuple_t* entry, /*!< in/out: entry to insert */ rec_t** rec, /*!< out: pointer to inserted record if @@ -307,7 +308,7 @@ btr_cur_pessimistic_insert( insertion will certainly succeed */ btr_cur_t* cursor, /*!< in: cursor after which to insert; cursor stays valid */ - ulint** offsets,/*!< out: offsets on *rec */ + offset_t** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap that can be emptied */ dtuple_t* entry, /*!< in/out: entry to insert */ @@ -341,7 +342,7 @@ btr_cur_update_alloc_zip_func( page_cur_t* cursor, /*!< in/out: B-tree page cursor */ dict_index_t* index, /*!< in: the index corresponding to cursor */ #ifdef UNIV_DEBUG - ulint* offsets,/*!< in/out: offsets of the cursor record */ + offset_t* offsets,/*!< in/out: offsets of the cursor record */ #endif /* UNIV_DEBUG */ ulint length, /*!< in: size needed */ bool create, /*!< in: true=delete-and-insert, @@ -368,7 +369,7 @@ btr_cur_update_in_place( btr_cur_t* cursor, /*!< in: cursor on the record to update; cursor stays valid and positioned on the same record */ - ulint* offsets,/*!< in/out: offsets on cursor->page_cur.rec */ + offset_t* offsets,/*!< in/out: offsets on cursor->page_cur.rec */ const upd_t* update, /*!< in: update vector */ ulint cmpl_info,/*!< in: compiler info on secondary index updates */ @@ -410,7 +411,7 @@ btr_cur_optimistic_update( btr_cur_t* cursor, /*!< in: cursor on the record to update; cursor stays valid and positioned on the same record */ - ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ + offset_t** offsets,/*!< out: offsets on cursor->page_cur.rec */ mem_heap_t** heap, /*!< in/out: pointer to NULL or memory heap */ const upd_t* update, /*!< in: update vector; this must also contain trx id and roll ptr fields */ @@ -437,7 +438,7 @@ btr_cur_pessimistic_update( btr_cur_t* cursor, /*!< in/out: cursor on the record to update; cursor may become invalid if *big_rec == NULL || !(flags & BTR_KEEP_POS_FLAG) */ - ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ + offset_t** offsets,/*!< out: offsets on cursor->page_cur.rec */ mem_heap_t** offsets_heap, /*!< in/out: pointer to memory heap that can be emptied */ @@ -469,7 +470,7 @@ btr_cur_del_mark_set_clust_rec( buf_block_t* block, /*!< in/out: buffer block of the record */ rec_t* rec, /*!< in/out: record */ dict_index_t* index, /*!< in: clustered index of the record */ - const ulint* offsets,/*!< in: rec_get_offsets(rec) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec) */ que_thr_t* thr, /*!< in: query thread */ const dtuple_t* entry, /*!< in: dtuple for the deleting record */ mtr_t* mtr) /*!< in/out: mini-transaction */ @@ -636,7 +637,7 @@ btr_estimate_number_of_different_key_vals( ulint btr_rec_get_externally_stored_len( const rec_t* rec, - const ulint* offsets); + const offset_t* offsets); /*******************************************************************//** Marks non-updated off-page fields as disowned by this record. The ownership @@ -650,7 +651,7 @@ btr_cur_disown_inherited_fields( part will be updated, or NULL */ rec_t* rec, /*!< in/out: record in a clustered index */ dict_index_t* index, /*!< in: index of the page */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ const upd_t* update, /*!< in: update vector */ mtr_t* mtr) /*!< in/out: mini-transaction */ MY_ATTRIBUTE((nonnull(2,3,4,5,6))); @@ -689,7 +690,7 @@ btr_store_big_rec_extern_fields( btr_pcur_t* pcur, /*!< in/out: a persistent cursor. if btr_mtr is restarted, then this can be repositioned. */ - ulint* offsets, /*!< in/out: rec_get_offsets() on + offset_t* offsets, /*!< in/out: rec_get_offsets() on pcur. the "external storage" flags in offsets will correctly correspond to rec when this function returns */ @@ -720,7 +721,7 @@ btr_free_externally_stored_field( byte* field_ref, /*!< in/out: field reference */ const rec_t* rec, /*!< in: record containing field_ref, for page_zip_write_blob_ptr(), or NULL */ - const ulint* offsets, /*!< in: rec_get_offsets(rec, index), + const offset_t* offsets, /*!< in: rec_get_offsets(rec, index), or NULL */ page_zip_des_t* page_zip, /*!< in: compressed page corresponding to rec, or NULL if rec == NULL */ @@ -778,7 +779,7 @@ protected by a lock or a page latch byte* btr_rec_copy_externally_stored_field( const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, ulint zip_size, ulint no, ulint* len, diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h index ea477daec70..5bf31e13b93 100644 --- a/storage/innobase/include/dict0mem.h +++ b/storage/innobase/include/dict0mem.h @@ -946,10 +946,6 @@ a certain index.*/ system clustered index when there is no primary key. */ const char innobase_index_reserve_name[] = "GEN_CLUST_INDEX"; -/* Estimated number of offsets in records (based on columns) -to start with. */ -#define OFFS_IN_REC_NORMAL_SIZE 100 - /** Data structure for an index. Most fields will be initialized to 0, NULL or FALSE in dict_mem_index_create(). */ struct dict_index_t { @@ -1250,7 +1246,7 @@ struct dict_index_t { @param[in] offsets offsets @return true if row is historical */ bool - vers_history_row(const rec_t* rec, const ulint* offsets); + vers_history_row(const rec_t* rec, const offset_t* offsets); /** Check if record in secondary index is historical row. @param[in] rec record in a secondary index diff --git a/storage/innobase/include/fts0fts.h b/storage/innobase/include/fts0fts.h index 74e0ee7b360..dde7ad99fe7 100644 --- a/storage/innobase/include/fts0fts.h +++ b/storage/innobase/include/fts0fts.h @@ -592,7 +592,7 @@ doc_id_t fts_get_doc_id_from_rec( const rec_t* rec, const dict_index_t* index, - const ulint* offsets); + const offset_t* offsets); /** Add new fts doc id to the update vector. @param[in] table the table that contains the FTS index. diff --git a/storage/innobase/include/gis0rtree.h b/storage/innobase/include/gis0rtree.h index 126ca680c1d..b863f1cf3ef 100644 --- a/storage/innobase/include/gis0rtree.h +++ b/storage/innobase/include/gis0rtree.h @@ -28,6 +28,7 @@ Created 2013/03/27 Jimmy Yang and Allen Lai #define gis0rtree_h #include "btr0cur.h" +#include "rem0types.h" /* Whether MBR 'a' contains 'b' */ #define MBR_CONTAIN_CMP(a, b) \ @@ -88,7 +89,7 @@ rtr_page_split_and_insert( btr_cur_t* cursor, /*!< in/out: cursor at which to insert; when the function returns, the cursor is positioned on the predecessor of the inserted record */ - ulint** offsets,/*!< out: offsets on inserted record */ + offset_t** offsets,/*!< out: offsets on inserted record */ mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ const dtuple_t* tuple, /*!< in: tuple to insert */ ulint n_ext, /*!< in: number of externally stored columns */ @@ -150,7 +151,7 @@ rtr_rec_cal_increase( dtuple in some of the common fields, or which has an equal number or more fields than dtuple */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ double* area); /*!< out: increased area */ /****************************************************************//** @@ -273,7 +274,7 @@ void rtr_get_mbr_from_rec( /*=================*/ const rec_t* rec, /*!< in: data tuple */ - const ulint* offsets,/*!< in: offsets array */ + const offset_t* offsets,/*!< in: offsets array */ rtr_mbr_t* mbr); /*!< out MBR */ /****************************************************************//** @@ -305,10 +306,10 @@ rtr_page_get_father( Returns the father block to a page. It is assumed that mtr holds an X or SX latch on the tree. @return rec_get_offsets() of the node pointer record */ -ulint* +offset_t* rtr_page_get_father_block( /*======================*/ - ulint* offsets,/*!< in: work area for the return value */ + offset_t* offsets,/*!< in: work area for the return value */ mem_heap_t* heap, /*!< in: memory heap to use */ dict_index_t* index, /*!< in: b-tree index */ buf_block_t* block, /*!< in: child page in the index */ @@ -415,8 +416,8 @@ rtr_merge_and_update_mbr( /*=====================*/ btr_cur_t* cursor, /*!< in/out: cursor */ btr_cur_t* cursor2, /*!< in: the other cursor */ - ulint* offsets, /*!< in: rec offsets */ - ulint* offsets2, /*!< in: rec offsets */ + offset_t* offsets, /*!< in: rec offsets */ + offset_t* offsets2, /*!< in: rec offsets */ page_t* child_page, /*!< in: the child page. */ mtr_t* mtr); /*!< in: mtr */ @@ -436,8 +437,8 @@ rtr_merge_mbr_changed( /*==================*/ btr_cur_t* cursor, /*!< in: cursor */ btr_cur_t* cursor2, /*!< in: the other cursor */ - ulint* offsets, /*!< in: rec offsets */ - ulint* offsets2, /*!< in: rec offsets */ + offset_t* offsets, /*!< in: rec offsets */ + offset_t* offsets2, /*!< in: rec offsets */ rtr_mbr_t* new_mbr); /*!< out: MBR to update */ @@ -448,7 +449,7 @@ bool rtr_update_mbr_field( /*=================*/ btr_cur_t* cursor, /*!< in: cursor pointed to rec.*/ - ulint* offsets, /*!< in: offsets on rec. */ + offset_t* offsets, /*!< in: offsets on rec. */ btr_cur_t* cursor2, /*!< in/out: cursor pointed to rec that should be deleted. this cursor is for btr_compress to diff --git a/storage/innobase/include/gis0rtree.ic b/storage/innobase/include/gis0rtree.ic index d9309550a5f..03e23830e70 100644 --- a/storage/innobase/include/gis0rtree.ic +++ b/storage/innobase/include/gis0rtree.ic @@ -40,7 +40,7 @@ rtr_page_cal_mbr( rec_t* rec; const byte* field; ulint len; - ulint* offsets = NULL; + offset_t* offsets = NULL; double bmin, bmax; double* amin; double* amax; diff --git a/storage/innobase/include/handler0alter.h b/storage/innobase/include/handler0alter.h index 45811c591c9..9b70c607459 100644 --- a/storage/innobase/include/handler0alter.h +++ b/storage/innobase/include/handler0alter.h @@ -22,6 +22,8 @@ this program; if not, write to the Free Software Foundation, Inc., Smart ALTER TABLE *******************************************************/ +#include "rem0types.h" + /*************************************************************//** Copies an InnoDB record to table->record[0]. */ void @@ -30,7 +32,7 @@ innobase_rec_to_mysql( struct TABLE* table, /*!< in/out: MySQL table */ const rec_t* rec, /*!< in: record */ const dict_index_t* index, /*!< in: index */ - const ulint* offsets)/*!< in: rec_get_offsets( + const offset_t* offsets)/*!< in: rec_get_offsets( rec, index, ...) */ MY_ATTRIBUTE((nonnull)); diff --git a/storage/innobase/include/lock0lock.h b/storage/innobase/include/lock0lock.h index 8ae0b062729..11000620e8c 100644 --- a/storage/innobase/include/lock0lock.h +++ b/storage/innobase/include/lock0lock.h @@ -300,7 +300,7 @@ lock_clust_rec_modify_check_and_lock( const rec_t* rec, /*!< in: record which should be modified */ dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ que_thr_t* thr) /*!< in: query thread */ MY_ATTRIBUTE((warn_unused_result)); /*********************************************************************//** @@ -338,7 +338,7 @@ lock_sec_rec_read_check_and_lock( be read or passed over by a read cursor */ dict_index_t* index, /*!< in: secondary index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ lock_mode mode, /*!< in: mode of the lock which the read cursor should set on records: LOCK_S or LOCK_X; the @@ -366,7 +366,7 @@ lock_clust_rec_read_check_and_lock( be read or passed over by a read cursor */ dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ lock_mode mode, /*!< in: mode of the lock which the read cursor should set on records: LOCK_S or LOCK_X; the @@ -415,7 +415,7 @@ lock_clust_rec_cons_read_sees( const rec_t* rec, /*!< in: user record which should be read or passed over by a read cursor */ dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ ReadView* view); /*!< in: consistent read view */ /*********************************************************************//** Checks that a non-clustered index record is seen in a consistent read. @@ -547,7 +547,7 @@ lock_report_trx_id_insanity( trx_id_t trx_id, /*!< in: trx id */ const rec_t* rec, /*!< in: user record */ dict_index_t* index, /*!< in: index */ - const ulint* offsets, /*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec, index) */ trx_id_t max_trx_id); /*!< in: trx_sys.get_max_trx_id() */ /*********************************************************************//** Prints info of locks for all transactions. @@ -772,7 +772,7 @@ lock_check_trx_id_sanity( trx_id_t trx_id, /*!< in: trx id */ const rec_t* rec, /*!< in: user record */ dict_index_t* index, /*!< in: index */ - const ulint* offsets); /*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets); /*!< in: rec_get_offsets(rec, index) */ #ifdef UNIV_DEBUG /*******************************************************************//** Check if the transaction holds any locks on the sys tables diff --git a/storage/innobase/include/lock0priv.h b/storage/innobase/include/lock0priv.h index 9b80f593e30..5e00e1bb6f1 100644 --- a/storage/innobase/include/lock0priv.h +++ b/storage/innobase/include/lock0priv.h @@ -35,6 +35,7 @@ those functions in lock/ */ #endif #include "hash0hash.h" +#include "rem0types.h" #include "trx0trx.h" #ifndef UINT32_MAX @@ -468,7 +469,7 @@ lock_clust_rec_some_has_impl( /*=========================*/ const rec_t* rec, /*!< in: user record */ const dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets)/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */ MY_ATTRIBUTE((warn_unused_result)); /*********************************************************************//** diff --git a/storage/innobase/include/lock0priv.ic b/storage/innobase/include/lock0priv.ic index 80a63271256..7062e3f7082 100644 --- a/storage/innobase/include/lock0priv.ic +++ b/storage/innobase/include/lock0priv.ic @@ -59,7 +59,7 @@ lock_clust_rec_some_has_impl( /*=========================*/ const rec_t* rec, /*!< in: user record */ const dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets)/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */ { ut_ad(dict_index_is_clust(index)); ut_ad(page_rec_is_user_rec(rec)); diff --git a/storage/innobase/include/page0cur.h b/storage/innobase/include/page0cur.h index f21506d0475..5accbcd76d5 100644 --- a/storage/innobase/include/page0cur.h +++ b/storage/innobase/include/page0cur.h @@ -29,6 +29,7 @@ Created 10/4/1994 Heikki Tuuri #include "buf0types.h" #include "page0page.h" +#include "rem0types.h" #include "rem0rec.h" #include "data0data.h" #include "mtr0mtr.h" @@ -151,7 +152,7 @@ page_cur_tuple_insert( page_cur_t* cursor, /*!< in/out: a page cursor */ const dtuple_t* tuple, /*!< in: pointer to a data tuple */ dict_index_t* index, /*!< in: record descriptor */ - ulint** offsets,/*!< out: offsets on *rec */ + offset_t** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ ulint n_ext, /*!< in: number of externally stored columns */ mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */ @@ -175,7 +176,7 @@ page_cur_rec_insert( page_cur_t* cursor, /*!< in/out: a page cursor */ const rec_t* rec, /*!< in: record to insert */ dict_index_t* index, /*!< in: record descriptor */ - ulint* offsets,/*!< in/out: rec_get_offsets(rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */ mtr_t* mtr); /*!< in: mini-transaction handle, or NULL */ /***********************************************************//** Inserts a record next to page cursor on an uncompressed page. @@ -189,7 +190,7 @@ page_cur_insert_rec_low( which the new record is inserted */ dict_index_t* index, /*!< in: record descriptor */ const rec_t* rec, /*!< in: pointer to a physical record */ - ulint* offsets,/*!< in/out: rec_get_offsets(rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */ mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */ MY_ATTRIBUTE((nonnull(1,2,3,4), warn_unused_result)); @@ -211,7 +212,7 @@ page_cur_insert_rec_zip( page_cur_t* cursor, /*!< in/out: page cursor */ dict_index_t* index, /*!< in: record descriptor */ const rec_t* rec, /*!< in: pointer to a physical record */ - ulint* offsets,/*!< in/out: rec_get_offsets(rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */ mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */ MY_ATTRIBUTE((nonnull(1,2,3,4), warn_unused_result)); /*************************************************************//** @@ -237,7 +238,7 @@ page_cur_delete_rec( /*================*/ page_cur_t* cursor, /*!< in/out: a page cursor */ const dict_index_t* index, /*!< in: record descriptor */ - const ulint* offsets,/*!< in: rec_get_offsets( + const offset_t* offsets,/*!< in: rec_get_offsets( cursor->rec, index) */ mtr_t* mtr); /*!< in: mini-transaction handle */ @@ -385,14 +386,14 @@ page_delete_rec( page_cur_t* pcur, /*!< in/out: page cursor on record to delete */ page_zip_des_t* page_zip,/*!< in: compressed page descriptor */ - const ulint* offsets);/*!< in: offsets for record */ + const offset_t* offsets);/*!< in: offsets for record */ /** Index page cursor */ struct page_cur_t{ const dict_index_t* index; rec_t* rec; /*!< pointer to a record on page */ - ulint* offsets; + offset_t* offsets; buf_block_t* block; /*!< pointer to the block containing rec */ }; diff --git a/storage/innobase/include/page0cur.ic b/storage/innobase/include/page0cur.ic index 531d6b6f777..528b3af9352 100644 --- a/storage/innobase/include/page0cur.ic +++ b/storage/innobase/include/page0cur.ic @@ -254,7 +254,7 @@ page_cur_tuple_insert( page_cur_t* cursor, /*!< in/out: a page cursor */ const dtuple_t* tuple, /*!< in: pointer to a data tuple */ dict_index_t* index, /*!< in: record descriptor */ - ulint** offsets,/*!< out: offsets on *rec */ + offset_t** offsets,/*!< out: offsets on *rec */ mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */ ulint n_ext, /*!< in: number of externally stored columns */ mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */ @@ -308,7 +308,7 @@ page_cur_rec_insert( page_cur_t* cursor, /*!< in/out: a page cursor */ const rec_t* rec, /*!< in: record to insert */ dict_index_t* index, /*!< in: record descriptor */ - ulint* offsets,/*!< in/out: rec_get_offsets(rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */ mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */ { if (buf_block_get_page_zip(cursor->block)) { diff --git a/storage/innobase/include/page0page.h b/storage/innobase/include/page0page.h index 54939bc0c94..54586b3ce3b 100644 --- a/storage/innobase/include/page0page.h +++ b/storage/innobase/include/page0page.h @@ -958,7 +958,7 @@ page_mem_free( rec_t* rec, /*!< in: pointer to the (origin of) record */ const dict_index_t* index, /*!< in: index of rec */ - const ulint* offsets);/*!< in: array returned by + const offset_t* offsets);/*!< in: array returned by rec_get_offsets() */ /** Read the PAGE_DIRECTION field from a byte. @@ -1205,7 +1205,7 @@ void page_rec_print( /*===========*/ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets);/*!< in: record descriptor */ + const offset_t* offsets);/*!< in: record descriptor */ # ifdef UNIV_BTR_PRINT /***************************************************************//** This is used to print the contents of the directory for @@ -1252,7 +1252,7 @@ ibool page_rec_validate( /*==============*/ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets);/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets);/*!< in: array returned by rec_get_offsets() */ #ifdef UNIV_DEBUG /***************************************************************//** Checks that the first directory slot points to the infimum record and diff --git a/storage/innobase/include/page0page.ic b/storage/innobase/include/page0page.ic index 0992f23a7a7..461efd9147d 100644 --- a/storage/innobase/include/page0page.ic +++ b/storage/innobase/include/page0page.ic @@ -996,7 +996,7 @@ page_mem_free( rec_t* rec, /*!< in: pointer to the (origin of) record */ const dict_index_t* index, /*!< in: index of rec */ - const ulint* offsets) /*!< in: array returned by + const offset_t* offsets) /*!< in: array returned by rec_get_offsets() */ { rec_t* free; diff --git a/storage/innobase/include/page0types.h b/storage/innobase/include/page0types.h index 6593202444d..dd8d0dbe35d 100644 --- a/storage/innobase/include/page0types.h +++ b/storage/innobase/include/page0types.h @@ -28,6 +28,7 @@ Created 2/2/1994 Heikki Tuuri #include "dict0types.h" #include "mtr0types.h" +#include "rem0types.h" #include <map> @@ -172,7 +173,7 @@ page_zip_dir_delete( page_zip_des_t* page_zip,/*!< in/out: compressed page */ byte* rec, /*!< in: deleted record */ dict_index_t* index, /*!< in: index of rec */ - const ulint* offsets,/*!< in: rec_get_offsets(rec) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec) */ const byte* free) /*!< in: previous start of the free list */ MY_ATTRIBUTE((nonnull(1,2,3,4))); diff --git a/storage/innobase/include/page0zip.h b/storage/innobase/include/page0zip.h index 6b9c0c3d5ba..458fa166d8c 100644 --- a/storage/innobase/include/page0zip.h +++ b/storage/innobase/include/page0zip.h @@ -262,7 +262,7 @@ page_zip_write_rec( page_zip_des_t* page_zip,/*!< in/out: compressed page */ const byte* rec, /*!< in: record being written */ dict_index_t* index, /*!< in: the index the record belongs to */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ ulint create) /*!< in: nonzero=insert, zero=update */ MY_ATTRIBUTE((nonnull)); @@ -287,7 +287,7 @@ page_zip_write_blob_ptr( const byte* rec, /*!< in/out: record whose data is being written */ dict_index_t* index, /*!< in: index of the page */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ ulint n, /*!< in: column index */ mtr_t* mtr); /*!< in: mini-transaction handle, or NULL if no logging is needed */ @@ -326,7 +326,7 @@ void page_zip_write_trx_id_and_roll_ptr( page_zip_des_t* page_zip, byte* rec, - const ulint* offsets, + const offset_t* offsets, ulint trx_id_col, trx_id_t trx_id, roll_ptr_t roll_ptr, @@ -390,7 +390,7 @@ page_zip_dir_delete( page_zip_des_t* page_zip, /*!< in/out: compressed page */ byte* rec, /*!< in: deleted record */ const dict_index_t* index, /*!< in: index of rec */ - const ulint* offsets, /*!< in: rec_get_offsets(rec) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec) */ const byte* free) /*!< in: previous start of the free list */ MY_ATTRIBUTE((nonnull(1,2,3,4))); diff --git a/storage/innobase/include/pars0grm.h b/storage/innobase/include/pars0grm.h index 90a7468bc9a..58d424abfdc 100644 --- a/storage/innobase/include/pars0grm.h +++ b/storage/innobase/include/pars0grm.h @@ -1,8 +1,9 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ +/* A Bison parser, made by GNU Bison 3.4.2. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, + Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +31,9 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ +/* Undocumented macros, especially those whose name start with YY_, + are private implementation details. Do not rely on them. */ + #ifndef YY_YY_PARS0GRM_TAB_H_INCLUDED # define YY_YY_PARS0GRM_TAB_H_INCLUDED /* Debug traces. */ @@ -58,91 +62,71 @@ extern int yydebug; PARS_NE_TOKEN = 268, PARS_PROCEDURE_TOKEN = 269, PARS_IN_TOKEN = 270, - PARS_OUT_TOKEN = 271, - PARS_BINARY_TOKEN = 272, - PARS_BLOB_TOKEN = 273, - PARS_INT_TOKEN = 274, - PARS_FLOAT_TOKEN = 275, - PARS_CHAR_TOKEN = 276, - PARS_IS_TOKEN = 277, - PARS_BEGIN_TOKEN = 278, - PARS_END_TOKEN = 279, - PARS_IF_TOKEN = 280, - PARS_THEN_TOKEN = 281, - PARS_ELSE_TOKEN = 282, - PARS_ELSIF_TOKEN = 283, - PARS_LOOP_TOKEN = 284, - PARS_WHILE_TOKEN = 285, - PARS_RETURN_TOKEN = 286, - PARS_SELECT_TOKEN = 287, - PARS_SUM_TOKEN = 288, - PARS_COUNT_TOKEN = 289, - PARS_DISTINCT_TOKEN = 290, - PARS_FROM_TOKEN = 291, - PARS_WHERE_TOKEN = 292, - PARS_FOR_TOKEN = 293, - PARS_DDOT_TOKEN = 294, - PARS_READ_TOKEN = 295, - PARS_ORDER_TOKEN = 296, - PARS_BY_TOKEN = 297, - PARS_ASC_TOKEN = 298, - PARS_DESC_TOKEN = 299, - PARS_INSERT_TOKEN = 300, - PARS_INTO_TOKEN = 301, - PARS_VALUES_TOKEN = 302, - PARS_UPDATE_TOKEN = 303, - PARS_SET_TOKEN = 304, - PARS_DELETE_TOKEN = 305, - PARS_CURRENT_TOKEN = 306, - PARS_OF_TOKEN = 307, - PARS_CREATE_TOKEN = 308, - PARS_TABLE_TOKEN = 309, - PARS_INDEX_TOKEN = 310, - PARS_UNIQUE_TOKEN = 311, - PARS_CLUSTERED_TOKEN = 312, - PARS_ON_TOKEN = 313, - PARS_ASSIGN_TOKEN = 314, - PARS_DECLARE_TOKEN = 315, - PARS_CURSOR_TOKEN = 316, - PARS_SQL_TOKEN = 317, - PARS_OPEN_TOKEN = 318, - PARS_FETCH_TOKEN = 319, - PARS_CLOSE_TOKEN = 320, - PARS_NOTFOUND_TOKEN = 321, - PARS_TO_CHAR_TOKEN = 322, - PARS_TO_NUMBER_TOKEN = 323, - PARS_TO_BINARY_TOKEN = 324, - PARS_BINARY_TO_NUMBER_TOKEN = 325, - PARS_SUBSTR_TOKEN = 326, - PARS_REPLSTR_TOKEN = 327, - PARS_CONCAT_TOKEN = 328, - PARS_INSTR_TOKEN = 329, - PARS_LENGTH_TOKEN = 330, - PARS_SYSDATE_TOKEN = 331, - PARS_PRINTF_TOKEN = 332, - PARS_ASSERT_TOKEN = 333, - PARS_RND_TOKEN = 334, - PARS_RND_STR_TOKEN = 335, - PARS_ROW_PRINTF_TOKEN = 336, - PARS_COMMIT_TOKEN = 337, - PARS_ROLLBACK_TOKEN = 338, - PARS_WORK_TOKEN = 339, - PARS_UNSIGNED_TOKEN = 340, - PARS_EXIT_TOKEN = 341, - PARS_FUNCTION_TOKEN = 342, - PARS_LOCK_TOKEN = 343, - PARS_SHARE_TOKEN = 344, - PARS_MODE_TOKEN = 345, - PARS_LIKE_TOKEN = 346, - PARS_LIKE_TOKEN_EXACT = 347, - PARS_LIKE_TOKEN_PREFIX = 348, - PARS_LIKE_TOKEN_SUFFIX = 349, - PARS_LIKE_TOKEN_SUBSTR = 350, - PARS_TABLE_NAME_TOKEN = 351, - PARS_COMPACT_TOKEN = 352, - PARS_BLOCK_SIZE_TOKEN = 353, - PARS_BIGINT_TOKEN = 354, - NEG = 355 + PARS_INT_TOKEN = 271, + PARS_CHAR_TOKEN = 272, + PARS_IS_TOKEN = 273, + PARS_BEGIN_TOKEN = 274, + PARS_END_TOKEN = 275, + PARS_IF_TOKEN = 276, + PARS_THEN_TOKEN = 277, + PARS_ELSE_TOKEN = 278, + PARS_ELSIF_TOKEN = 279, + PARS_LOOP_TOKEN = 280, + PARS_WHILE_TOKEN = 281, + PARS_RETURN_TOKEN = 282, + PARS_SELECT_TOKEN = 283, + PARS_COUNT_TOKEN = 284, + PARS_FROM_TOKEN = 285, + PARS_WHERE_TOKEN = 286, + PARS_FOR_TOKEN = 287, + PARS_DDOT_TOKEN = 288, + PARS_ORDER_TOKEN = 289, + PARS_BY_TOKEN = 290, + PARS_ASC_TOKEN = 291, + PARS_DESC_TOKEN = 292, + PARS_INSERT_TOKEN = 293, + PARS_INTO_TOKEN = 294, + PARS_VALUES_TOKEN = 295, + PARS_UPDATE_TOKEN = 296, + PARS_SET_TOKEN = 297, + PARS_DELETE_TOKEN = 298, + PARS_CURRENT_TOKEN = 299, + PARS_OF_TOKEN = 300, + PARS_CREATE_TOKEN = 301, + PARS_TABLE_TOKEN = 302, + PARS_INDEX_TOKEN = 303, + PARS_UNIQUE_TOKEN = 304, + PARS_CLUSTERED_TOKEN = 305, + PARS_ON_TOKEN = 306, + PARS_ASSIGN_TOKEN = 307, + PARS_DECLARE_TOKEN = 308, + PARS_CURSOR_TOKEN = 309, + PARS_SQL_TOKEN = 310, + PARS_OPEN_TOKEN = 311, + PARS_FETCH_TOKEN = 312, + PARS_CLOSE_TOKEN = 313, + PARS_NOTFOUND_TOKEN = 314, + PARS_TO_BINARY_TOKEN = 315, + PARS_SUBSTR_TOKEN = 316, + PARS_CONCAT_TOKEN = 317, + PARS_INSTR_TOKEN = 318, + PARS_LENGTH_TOKEN = 319, + PARS_COMMIT_TOKEN = 320, + PARS_ROLLBACK_TOKEN = 321, + PARS_WORK_TOKEN = 322, + PARS_EXIT_TOKEN = 323, + PARS_FUNCTION_TOKEN = 324, + PARS_LOCK_TOKEN = 325, + PARS_SHARE_TOKEN = 326, + PARS_MODE_TOKEN = 327, + PARS_LIKE_TOKEN = 328, + PARS_LIKE_TOKEN_EXACT = 329, + PARS_LIKE_TOKEN_PREFIX = 330, + PARS_LIKE_TOKEN_SUFFIX = 331, + PARS_LIKE_TOKEN_SUBSTR = 332, + PARS_TABLE_NAME_TOKEN = 333, + PARS_BIGINT_TOKEN = 334, + NEG = 335 }; #endif diff --git a/storage/innobase/include/pars0pars.h b/storage/innobase/include/pars0pars.h index 857c5c2742c..73a19dd24d8 100644 --- a/storage/innobase/include/pars0pars.h +++ b/storage/innobase/include/pars0pars.h @@ -48,29 +48,15 @@ extern int yydebug; NOT re-entrant */ extern sym_tab_t* pars_sym_tab_global; -extern pars_res_word_t pars_to_char_token; -extern pars_res_word_t pars_to_number_token; extern pars_res_word_t pars_to_binary_token; -extern pars_res_word_t pars_binary_to_number_token; extern pars_res_word_t pars_substr_token; -extern pars_res_word_t pars_replstr_token; extern pars_res_word_t pars_concat_token; extern pars_res_word_t pars_length_token; extern pars_res_word_t pars_instr_token; -extern pars_res_word_t pars_sysdate_token; -extern pars_res_word_t pars_printf_token; -extern pars_res_word_t pars_assert_token; -extern pars_res_word_t pars_rnd_token; -extern pars_res_word_t pars_rnd_str_token; extern pars_res_word_t pars_count_token; -extern pars_res_word_t pars_sum_token; -extern pars_res_word_t pars_distinct_token; -extern pars_res_word_t pars_binary_token; -extern pars_res_word_t pars_blob_token; extern pars_res_word_t pars_int_token; extern pars_res_word_t pars_bigint_token; extern pars_res_word_t pars_char_token; -extern pars_res_word_t pars_float_token; extern pars_res_word_t pars_update_token; extern pars_res_word_t pars_asc_token; extern pars_res_word_t pars_desc_token; @@ -236,17 +222,6 @@ pars_insert_statement( que_node_t* values_list, /*!< in: value expression list or NULL */ sel_node_t* select); /*!< in: select condition or NULL */ /*********************************************************************//** -Parses a procedure parameter declaration. -@return own: symbol table node of type SYM_VAR */ -sym_node_t* -pars_parameter_declaration( -/*=======================*/ - sym_node_t* node, /*!< in: symbol table node allocated for the - id of the parameter */ - ulint param_type, - /*!< in: PARS_INPUT or PARS_OUTPUT */ - pars_res_word_t* type); /*!< in: pointer to a type token */ -/*********************************************************************//** Parses an elsif element. @return elsif node */ elsif_node_t* @@ -358,8 +333,6 @@ pars_column_def( pars_res_word_t* type, /*!< in: data type */ sym_node_t* len, /*!< in: length of column, or NULL */ - void* is_unsigned, /*!< in: if not NULL, column - is of type UNSIGNED. */ void* is_not_null); /*!< in: if not NULL, column is of type NOT NULL. */ /*********************************************************************//** @@ -370,9 +343,7 @@ pars_create_table( /*==============*/ sym_node_t* table_sym, /*!< in: table name node in the symbol table */ - sym_node_t* column_defs, /*!< in: list of column names */ - sym_node_t* compact, /* in: non-NULL if COMPACT table. */ - sym_node_t* block_size); /* in: block size (can be NULL) */ + sym_node_t* column_defs); /*!< in: list of column names */ /*********************************************************************//** Parses an index creation operation. @return index create subgraph */ @@ -394,7 +365,6 @@ pars_procedure_definition( /*======================*/ sym_node_t* sym_node, /*!< in: procedure id node in the symbol table */ - sym_node_t* param_list, /*!< in: parameter declaration list */ que_node_t* stat_list); /*!< in: statement list */ /*************************************************************//** @@ -672,7 +642,6 @@ struct proc_node_t{ que_common_t common; /*!< type: QUE_NODE_PROC */ sym_node_t* proc_id; /*!< procedure name symbol in the symbol table of this same procedure */ - sym_node_t* param_list; /*!< input and output parameters */ que_node_t* stat_list; /*!< statement list */ sym_tab_t* sym_tab; /*!< symbol table of this procedure */ }; @@ -747,7 +716,7 @@ struct col_assign_node_t{ #define PARS_FUNC_LOGICAL 2 /*!< AND, OR, NOT */ #define PARS_FUNC_CMP 3 /*!< comparison operators */ #define PARS_FUNC_PREDEFINED 4 /*!< TO_NUMBER, SUBSTR, ... */ -#define PARS_FUNC_AGGREGATE 5 /*!< COUNT, DISTINCT, SUM */ +#define PARS_FUNC_AGGREGATE 5 /*!< COUNT */ #define PARS_FUNC_OTHER 6 /*!< these are not real functions, e.g., := */ /* @} */ diff --git a/storage/innobase/include/rem0cmp.h b/storage/innobase/include/rem0cmp.h index 9582b0df393..0877c7b5b6a 100644 --- a/storage/innobase/include/rem0cmp.h +++ b/storage/innobase/include/rem0cmp.h @@ -89,7 +89,7 @@ cmp_dtuple_rec_with_gis( /*====================*/ const dtuple_t* dtuple, const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, page_cur_mode_t mode) MY_ATTRIBUTE((nonnull)); @@ -105,7 +105,7 @@ int cmp_dtuple_rec_with_gis_internal( const dtuple_t* dtuple, const rec_t* rec, - const ulint* offsets); + const offset_t* offsets); /** Compare a data tuple to a physical record. @param[in] dtuple data tuple @@ -121,7 +121,7 @@ int cmp_dtuple_rec_with_match_low( const dtuple_t* dtuple, const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, ulint n_cmp, ulint* matched_fields) MY_ATTRIBUTE((nonnull)); @@ -145,7 +145,7 @@ cmp_dtuple_rec_with_match_bytes( const dtuple_t* dtuple, const rec_t* rec, const dict_index_t* index, - const ulint* offsets, + const offset_t* offsets, ulint* matched_fields, ulint* matched_bytes) MY_ATTRIBUTE((warn_unused_result)); @@ -162,7 +162,7 @@ int cmp_dtuple_rec( const dtuple_t* dtuple, const rec_t* rec, - const ulint* offsets); + const offset_t* offsets); /**************************************************************//** Checks if a dtuple is a prefix of a record. The last field in dtuple is allowed to be a prefix of the corresponding field in the record. @@ -172,7 +172,7 @@ cmp_dtuple_is_prefix_of_rec( /*========================*/ const dtuple_t* dtuple, /*!< in: data tuple */ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets);/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets);/*!< in: array returned by rec_get_offsets() */ /** Compare two physical records that contain the same number of columns, none of which are stored externally. @retval positive if rec1 (including non-ordering columns) is greater than rec2 @@ -183,8 +183,8 @@ cmp_rec_rec_simple( /*===============*/ const rec_t* rec1, /*!< in: physical record */ const rec_t* rec2, /*!< in: physical record */ - const ulint* offsets1,/*!< in: rec_get_offsets(rec1, ...) */ - const ulint* offsets2,/*!< in: rec_get_offsets(rec2, ...) */ + const offset_t* offsets1,/*!< in: rec_get_offsets(rec1, ...) */ + const offset_t* offsets2,/*!< in: rec_get_offsets(rec2, ...) */ const dict_index_t* index, /*!< in: data dictionary index */ struct TABLE* table) /*!< in: MySQL table, for reporting duplicate key value if applicable, @@ -209,8 +209,8 @@ int cmp_rec_rec_with_match( const rec_t* rec1, const rec_t* rec2, - const ulint* offsets1, - const ulint* offsets2, + const offset_t* offsets1, + const offset_t* offsets2, const dict_index_t* index, bool nulls_unequal, ulint* matched_fields); @@ -231,8 +231,8 @@ int cmp_rec_rec( const rec_t* rec1, const rec_t* rec2, - const ulint* offsets1, - const ulint* offsets2, + const offset_t* offsets1, + const offset_t* offsets2, const dict_index_t* index, ulint* matched_fields = NULL); diff --git a/storage/innobase/include/rem0cmp.ic b/storage/innobase/include/rem0cmp.ic index 2412d22e8fa..5ac3838f244 100644 --- a/storage/innobase/include/rem0cmp.ic +++ b/storage/innobase/include/rem0cmp.ic @@ -68,8 +68,8 @@ int cmp_rec_rec( const rec_t* rec1, const rec_t* rec2, - const ulint* offsets1, - const ulint* offsets2, + const offset_t* offsets1, + const offset_t* offsets2, const dict_index_t* index, ulint* matched_fields) { diff --git a/storage/innobase/include/rem0rec.h b/storage/innobase/include/rem0rec.h index 29923839ce1..bd6bb563192 100644 --- a/storage/innobase/include/rem0rec.h +++ b/storage/innobase/include/rem0rec.h @@ -61,45 +61,86 @@ The status is stored in the low-order bits. */ /* Length of a B-tree node pointer, in bytes */ #define REC_NODE_PTR_SIZE 4 +#ifndef UNIV_INNOCHECKSUM /** SQL null flag in a 1-byte offset of ROW_FORMAT=REDUNDANT records */ -#define REC_1BYTE_SQL_NULL_MASK 0x80UL +static const offset_t REC_1BYTE_SQL_NULL_MASK= 0x80; /** SQL null flag in a 2-byte offset of ROW_FORMAT=REDUNDANT records */ -#define REC_2BYTE_SQL_NULL_MASK 0x8000UL +static const offset_t REC_2BYTE_SQL_NULL_MASK= 0x8000; /** In a 2-byte offset of ROW_FORMAT=REDUNDANT records, the second most significant bit denotes that the tail of a field is stored off-page. */ -#define REC_2BYTE_EXTERN_MASK 0x4000UL +static const offset_t REC_2BYTE_EXTERN_MASK= 0x4000; + +static const size_t RECORD_OFFSET= 2; +static const size_t INDEX_OFFSET= + RECORD_OFFSET + sizeof(rec_t *) / sizeof(offset_t); +#endif /* UNIV_INNOCHECKSUM */ -#ifdef UNIV_DEBUG -/* Length of the rec_get_offsets() header */ -# define REC_OFFS_HEADER_SIZE 4 -#else /* UNIV_DEBUG */ /* Length of the rec_get_offsets() header */ -# define REC_OFFS_HEADER_SIZE 2 +static const size_t REC_OFFS_HEADER_SIZE= +#ifdef UNIV_DEBUG +#ifndef UNIV_INNOCHECKSUM + sizeof(rec_t *) / sizeof(offset_t) + + sizeof(dict_index_t *) / sizeof(offset_t) + +#endif /* UNIV_INNOCHECKSUM */ #endif /* UNIV_DEBUG */ + 2; /* Number of elements that should be initially allocated for the offsets[] array, first passed to rec_get_offsets() */ -#define REC_OFFS_NORMAL_SIZE OFFS_IN_REC_NORMAL_SIZE -#define REC_OFFS_SMALL_SIZE 10 +static const size_t REC_OFFS_NORMAL_SIZE= 300; +static const size_t REC_OFFS_SMALL_SIZE= 18; +static const size_t REC_OFFS_SEC_INDEX_SIZE= + /* PK max key parts */ 16 + /* sec idx max key parts */ 16 + + /* child page number for non-leaf pages */ 1; /** Get the base address of offsets. The extra_size is stored at this position, and following positions hold the end offsets of the fields. */ #define rec_offs_base(offsets) (offsets + REC_OFFS_HEADER_SIZE) +#ifndef UNIV_INNOCHECKSUM +/* Offset consists of two parts: 2 upper bits is type and all other bits is +value */ + +/** Only 4 different values is possible! */ +enum field_type_t +{ + /** normal field */ + STORED_IN_RECORD= 0 << 14, + /** this field is stored off-page */ + STORED_OFFPAGE= 1 << 14, + /** just an SQL NULL */ + SQL_NULL= 2 << 14, + /** instantly added field */ + DEFAULT= 3 << 14, +}; + +/** without 2 upper bits */ +static const offset_t DATA_MASK= 0x3fff; +/** 2 upper bits */ +static const offset_t TYPE_MASK= ~DATA_MASK; +inline field_type_t get_type(offset_t n) +{ + return static_cast<field_type_t>(n & TYPE_MASK); +} +inline void set_type(offset_t &n, field_type_t type) +{ + n= (n & DATA_MASK) | static_cast<offset_t>(type); +} +inline offset_t get_value(offset_t n) { return n & DATA_MASK; } +inline offset_t combine(offset_t value, field_type_t type) +{ + return get_value(value) | static_cast<offset_t>(type); +} + /** Compact flag ORed to the extra size returned by rec_get_offsets() */ -const ulint REC_OFFS_COMPACT = ~(ulint(~0) >> 1); -/** SQL NULL flag in offsets returned by rec_get_offsets() */ -const ulint REC_OFFS_SQL_NULL = REC_OFFS_COMPACT; +const offset_t REC_OFFS_COMPACT= ~(offset_t(~0) >> 1); /** External flag in offsets returned by rec_get_offsets() */ -const ulint REC_OFFS_EXTERNAL = REC_OFFS_COMPACT >> 1; +const offset_t REC_OFFS_EXTERNAL= REC_OFFS_COMPACT >> 1; /** Default value flag in offsets returned by rec_get_offsets() */ -const ulint REC_OFFS_DEFAULT = REC_OFFS_COMPACT >> 2; -/** Mask for offsets returned by rec_get_offsets() */ -const ulint REC_OFFS_MASK = REC_OFFS_DEFAULT - 1; - -#ifndef UNIV_INNOCHECKSUM +const offset_t REC_OFFS_DEFAULT= REC_OFFS_COMPACT >> 2; +const offset_t REC_OFFS_MASK= REC_OFFS_DEFAULT - 1; /******************************************************//** The following function is used to get the pointer of the next chained record on the same page. @@ -452,7 +493,7 @@ offsets form. If the field is SQL null, the flag is ORed in the returned value. @return offset of the start of the field, SQL null flag ORed */ UNIV_INLINE -ulint +uint8_t rec_1_get_field_end_info( /*=====================*/ const rec_t* rec, /*!< in: record */ @@ -466,7 +507,7 @@ value. @return offset of the start of the field, SQL null flag and extern storage flag ORed */ UNIV_INLINE -ulint +uint16_t rec_2_get_field_end_info( /*=====================*/ const rec_t* rec, /*!< in: record */ @@ -507,11 +548,11 @@ rec_get_n_extern_new( (ULINT_UNDEFINED to compute all offsets) @param[in,out] heap memory heap @return the new offsets */ -ulint* +offset_t* rec_get_offsets_func( const rec_t* rec, const dict_index_t* index, - ulint* offsets, + offset_t* offsets, bool leaf, ulint n_fields, #ifdef UNIV_DEBUG @@ -546,7 +587,7 @@ rec_get_offsets_reverse( const dict_index_t* index, /*!< in: record descriptor */ ulint node_ptr,/*!< in: nonzero=node pointer, 0=leaf node */ - ulint* offsets)/*!< in/out: array consisting of + offset_t* offsets)/*!< in/out: array consisting of offsets[0] allocated elements */ MY_ATTRIBUTE((nonnull)); #ifdef UNIV_DEBUG @@ -559,7 +600,7 @@ bool rec_offs_validate( const rec_t* rec, const dict_index_t* index, - const ulint* offsets) + const offset_t* offsets) MY_ATTRIBUTE((nonnull(3), warn_unused_result)); /** Update debug data in offsets, in order to tame rec_offs_validate(). @param[in] rec record @@ -571,7 +612,7 @@ rec_offs_make_valid( const rec_t* rec, const dict_index_t* index, bool leaf, - ulint* offsets) + offset_t* offsets) MY_ATTRIBUTE((nonnull)); #else # define rec_offs_make_valid(rec, index, leaf, offsets) @@ -608,17 +649,16 @@ The following function is used to get an offset to the nth data field in a record. @return offset from the origin of rec */ UNIV_INLINE -ulint +offset_t rec_get_nth_field_offs( /*===================*/ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint n, /*!< in: index of the field */ ulint* len) /*!< out: length of the field; UNIV_SQL_NULL if SQL null */ MY_ATTRIBUTE((nonnull)); #define rec_get_nth_field(rec, offsets, n, len) \ ((rec) + rec_get_nth_field_offs(offsets, n, len)) - /******************************************************//** Determine if the offsets are for a record containing null BLOB pointers. @return first field containing a null BLOB pointer, or NULL if none found */ @@ -627,7 +667,7 @@ const byte* rec_offs_any_null_extern( /*=====================*/ const rec_t* rec, /*!< in: record */ - const ulint* offsets) /*!< in: rec_get_offsets(rec) */ + const offset_t* offsets) /*!< in: rec_get_offsets(rec) */ MY_ATTRIBUTE((warn_unused_result)); /** Mark the nth field as externally stored. @@ -635,7 +675,7 @@ rec_offs_any_null_extern( @param[in] n nth field */ void rec_offs_make_nth_extern( - ulint* offsets, + offset_t* offsets, const ulint n); /** Determine the number of allocated elements for an array of offsets. @@ -643,7 +683,7 @@ rec_offs_make_nth_extern( @return number of elements */ inline ulint -rec_offs_get_n_alloc(const ulint* offsets) +rec_offs_get_n_alloc(const offset_t* offsets) { ulint n_alloc; ut_ad(offsets); @@ -658,7 +698,7 @@ rec_offs_get_n_alloc(const ulint* offsets) @return number of fields */ inline ulint -rec_offs_n_fields(const ulint* offsets) +rec_offs_n_fields(const offset_t* offsets) { ulint n_fields; ut_ad(offsets); @@ -674,19 +714,12 @@ rec_offs_n_fields(const ulint* offsets) @param[in] offsets rec_get_offsets() @param[in] n nth field @param[in] flag flag to extract -@return the flag of the record field */ -inline -ulint -rec_offs_nth_flag(const ulint* offsets, ulint n, ulint flag) +@return type of the record field */ +inline field_type_t rec_offs_nth_type(const offset_t *offsets, ulint n) { - ut_ad(rec_offs_validate(NULL, NULL, offsets)); - ut_ad(n < rec_offs_n_fields(offsets)); - /* The DEFAULT, NULL, EXTERNAL flags are mutually exclusive. */ - ut_ad(ut_is_2pow(rec_offs_base(offsets)[1 + n] - & (REC_OFFS_DEFAULT - | REC_OFFS_SQL_NULL - | REC_OFFS_EXTERNAL))); - return rec_offs_base(offsets)[1 + n] & flag; + ut_ad(rec_offs_validate(NULL, NULL, offsets)); + ut_ad(n < rec_offs_n_fields(offsets)); + return get_type(rec_offs_base(offsets)[1 + n]); } /** Determine if a record field is missing @@ -694,11 +727,9 @@ rec_offs_nth_flag(const ulint* offsets, ulint n, ulint flag) @param[in] offsets rec_get_offsets() @param[in] n nth field @return nonzero if default bit is set */ -inline -ulint -rec_offs_nth_default(const ulint* offsets, ulint n) +inline ulint rec_offs_nth_default(const offset_t *offsets, ulint n) { - return rec_offs_nth_flag(offsets, n, REC_OFFS_DEFAULT); + return rec_offs_nth_type(offsets, n) == DEFAULT; } /** Determine if a record field is SQL NULL @@ -706,11 +737,9 @@ rec_offs_nth_default(const ulint* offsets, ulint n) @param[in] offsets rec_get_offsets() @param[in] n nth field @return nonzero if SQL NULL set */ -inline -ulint -rec_offs_nth_sql_null(const ulint* offsets, ulint n) +inline ulint rec_offs_nth_sql_null(const offset_t *offsets, ulint n) { - return rec_offs_nth_flag(offsets, n, REC_OFFS_SQL_NULL); + return rec_offs_nth_type(offsets, n) == SQL_NULL; } /** Determine if a record field is stored off-page. @@ -718,54 +747,46 @@ rec_offs_nth_sql_null(const ulint* offsets, ulint n) @param[in] n nth field Returns nonzero if the extern bit is set in nth field of rec. @return nonzero if externally stored */ -inline -ulint -rec_offs_nth_extern(const ulint* offsets, ulint n) +inline ulint rec_offs_nth_extern(const offset_t *offsets, ulint n) { - return rec_offs_nth_flag(offsets, n, REC_OFFS_EXTERNAL); + return rec_offs_nth_type(offsets, n) == STORED_OFFPAGE; } /** Get a global flag of a record. @param[in] offsets rec_get_offsets() @param[in] flag flag to extract @return the flag of the record field */ -inline -ulint -rec_offs_any_flag(const ulint* offsets, ulint flag) +inline ulint rec_offs_any_flag(const offset_t *offsets, ulint flag) { - ut_ad(rec_offs_validate(NULL, NULL, offsets)); - return *rec_offs_base(offsets) & flag; + ut_ad(rec_offs_validate(NULL, NULL, offsets)); + return *rec_offs_base(offsets) & flag; } /** Determine if the offsets are for a record containing off-page columns. @param[in] offsets rec_get_offsets() @return nonzero if any off-page columns exist */ -inline bool rec_offs_any_extern(const ulint* offsets) +inline bool rec_offs_any_extern(const offset_t *offsets) { - return rec_offs_any_flag(offsets, REC_OFFS_EXTERNAL); + return rec_offs_any_flag(offsets, REC_OFFS_EXTERNAL); } /** Determine if the offsets are for a record that is missing fields. @param[in] offsets rec_get_offsets() @return nonzero if any fields need to be replaced with dict_index_t::instant_field_value() */ -inline -ulint -rec_offs_any_default(const ulint* offsets) +inline ulint rec_offs_any_default(const offset_t *offsets) { - return rec_offs_any_flag(offsets, REC_OFFS_DEFAULT); + return rec_offs_any_flag(offsets, REC_OFFS_DEFAULT); } /** Determine if the offsets are for other than ROW_FORMAT=REDUNDANT. @param[in] offsets rec_get_offsets() @return nonzero if ROW_FORMAT is COMPACT,DYNAMIC or COMPRESSED @retval 0 if ROW_FORMAT=REDUNDANT */ -inline -ulint -rec_offs_comp(const ulint* offsets) +inline ulint rec_offs_comp(const offset_t *offsets) { - ut_ad(rec_offs_validate(NULL, NULL, offsets)); - return(*rec_offs_base(offsets) & REC_OFFS_COMPACT); + ut_ad(rec_offs_validate(NULL, NULL, offsets)); + return (*rec_offs_base(offsets) & REC_OFFS_COMPACT); } /** Determine if the record is the metadata pseudo-record @@ -864,7 +885,7 @@ const byte* rec_get_nth_cfield( const rec_t* rec, const dict_index_t* index, - const ulint* offsets, + const offset_t* offsets, ulint n, ulint* len) { @@ -883,7 +904,7 @@ UNIV_INLINE ulint rec_offs_nth_size( /*==============*/ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint n) /*!< in: nth field */ MY_ATTRIBUTE((warn_unused_result)); @@ -894,7 +915,7 @@ UNIV_INLINE ulint rec_offs_n_extern( /*==============*/ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ MY_ATTRIBUTE((warn_unused_result)); /***********************************************************//** This is used to modify the value of an already existing field in a record. @@ -907,7 +928,7 @@ void rec_set_nth_field( /*==============*/ rec_t* rec, /*!< in: record */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint n, /*!< in: index number of the field */ const void* data, /*!< in: pointer to the data if not SQL null */ ulint len) /*!< in: length of the data or UNIV_SQL_NULL. @@ -935,7 +956,7 @@ UNIV_INLINE void rec_offs_set_n_alloc( /*=================*/ - ulint* offsets, /*!< out: array for rec_get_offsets(), + offset_t*offsets, /*!< out: array for rec_get_offsets(), must be allocated */ ulint n_alloc) /*!< in: number of elements */ MY_ATTRIBUTE((nonnull)); @@ -951,7 +972,7 @@ UNIV_INLINE ulint rec_offs_data_size( /*===============*/ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ MY_ATTRIBUTE((warn_unused_result)); /**********************************************************//** Returns the total size of record minus data size of record. @@ -962,7 +983,7 @@ UNIV_INLINE ulint rec_offs_extra_size( /*================*/ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ MY_ATTRIBUTE((warn_unused_result)); /**********************************************************//** Returns the total size of a physical record. @@ -971,7 +992,7 @@ UNIV_INLINE ulint rec_offs_size( /*==========*/ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ MY_ATTRIBUTE((warn_unused_result)); #ifdef UNIV_DEBUG /**********************************************************//** @@ -982,7 +1003,7 @@ byte* rec_get_start( /*==========*/ const rec_t* rec, /*!< in: pointer to record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ MY_ATTRIBUTE((warn_unused_result)); /**********************************************************//** Returns a pointer to the end of the record. @@ -992,7 +1013,7 @@ byte* rec_get_end( /*========*/ const rec_t* rec, /*!< in: pointer to record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ MY_ATTRIBUTE((warn_unused_result)); #else /* UNIV_DEBUG */ # define rec_get_start(rec, offsets) ((rec) - rec_offs_extra_size(offsets)) @@ -1009,7 +1030,7 @@ rec_t* rec_copy( void* buf, const rec_t* rec, - const ulint* offsets); + const offset_t* offsets); /** Determine the size of a data tuple prefix in a temporary file. @param[in] index clustered or secondary index @@ -1038,7 +1059,7 @@ void rec_init_offsets_temp( const rec_t* rec, const dict_index_t* index, - ulint* offsets, + offset_t* offsets, ulint n_core, const dict_col_t::def_t*def_val, rec_comp_status_t status = REC_STATUS_ORDINARY) @@ -1052,7 +1073,7 @@ void rec_init_offsets_temp( const rec_t* rec, const dict_index_t* index, - ulint* offsets) + offset_t* offsets) MY_ATTRIBUTE((nonnull)); /** Convert a data tuple prefix to the temporary file format. @@ -1172,7 +1193,7 @@ ibool rec_validate( /*=========*/ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ MY_ATTRIBUTE((nonnull)); /***************************************************************//** Prints an old-style physical record. */ @@ -1189,7 +1210,7 @@ rec_print_mbr_rec( /*==========*/ FILE* file, /*!< in: file where to print */ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ MY_ATTRIBUTE((nonnull)); /***************************************************************//** Prints a physical record. */ @@ -1198,7 +1219,7 @@ rec_print_new( /*==========*/ FILE* file, /*!< in: file where to print */ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ MY_ATTRIBUTE((nonnull)); /***************************************************************//** Prints a physical record. */ @@ -1220,7 +1241,7 @@ rec_print( std::ostream& o, const rec_t* rec, ulint info, - const ulint* offsets); + const offset_t* offsets); /** Wrapper for pretty-printing a record */ struct rec_index_print @@ -1247,14 +1268,14 @@ operator<<(std::ostream& o, const rec_index_print& r); struct rec_offsets_print { /** Constructor */ - rec_offsets_print(const rec_t* rec, const ulint* offsets) : + rec_offsets_print(const rec_t* rec, const offset_t* offsets) : m_rec(rec), m_offsets(offsets) {} /** Record */ const rec_t* m_rec; /** Offsets to each field */ - const ulint* m_offsets; + const offset_t* m_offsets; }; /** Display a record. @@ -1271,7 +1292,7 @@ public: /** Construct a pretty-printed record. @param rec record with header @param offsets rec_get_offsets(rec, ...) */ - rec_printer(const rec_t* rec, const ulint* offsets) + rec_printer(const rec_t* rec, const offset_t* offsets) : std::ostringstream () { @@ -1284,7 +1305,7 @@ public: @param rec record, possibly lacking header @param info rec_get_info_bits(rec) @param offsets rec_get_offsets(rec, ...) */ - rec_printer(const rec_t* rec, ulint info, const ulint* offsets) + rec_printer(const rec_t* rec, ulint info, const offset_t* offsets) : std::ostringstream () { diff --git a/storage/innobase/include/rem0rec.ic b/storage/innobase/include/rem0rec.ic index 9196b15f86c..56727f40e23 100644 --- a/storage/innobase/include/rem0rec.ic +++ b/storage/innobase/include/rem0rec.ic @@ -800,7 +800,7 @@ offsets form. If the field is SQL null, the flag is ORed in the returned value. @return offset of the start of the field, SQL null flag ORed */ UNIV_INLINE -ulint +uint8_t rec_1_get_field_end_info( /*=====================*/ const rec_t* rec, /*!< in: record */ @@ -819,7 +819,7 @@ value. @return offset of the start of the field, SQL null flag and extern storage flag ORed */ UNIV_INLINE -ulint +uint16_t rec_2_get_field_end_info( /*=====================*/ const rec_t* rec, /*!< in: record */ @@ -852,13 +852,13 @@ UNIV_INLINE void rec_offs_set_n_alloc( /*=================*/ - ulint* offsets, /*!< out: array for rec_get_offsets(), + offset_t*offsets, /*!< out: array for rec_get_offsets(), must be allocated */ ulint n_alloc) /*!< in: number of elements */ { ut_ad(n_alloc > REC_OFFS_HEADER_SIZE); UNIV_MEM_ALLOC(offsets, n_alloc * sizeof *offsets); - offsets[0] = n_alloc; + offsets[0] = static_cast<offset_t>(n_alloc); } /************************************************************//** @@ -866,35 +866,27 @@ The following function is used to get an offset to the nth data field in a record. @return offset from the origin of rec */ UNIV_INLINE -ulint +offset_t rec_get_nth_field_offs( /*===================*/ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint n, /*!< in: index of the field */ ulint* len) /*!< out: length of the field; UNIV_SQL_NULL if SQL null; UNIV_SQL_DEFAULT is default value */ { - ulint offs; ut_ad(n < rec_offs_n_fields(offsets)); - if (n == 0) { - offs = 0; - } else { - offs = rec_offs_base(offsets)[n] & REC_OFFS_MASK; - } - - ulint length = rec_offs_base(offsets)[1 + n]; + offset_t offs = n == 0 ? 0 : get_value(rec_offs_base(offsets)[n]); + offset_t next_offs = rec_offs_base(offsets)[1 + n]; - if (length & REC_OFFS_SQL_NULL) { - length = UNIV_SQL_NULL; - } else if (length & REC_OFFS_DEFAULT) { - length = UNIV_SQL_DEFAULT; + if (get_type(next_offs) == SQL_NULL) { + *len = UNIV_SQL_NULL; + } else if (get_type(next_offs) == DEFAULT) { + *len = UNIV_SQL_DEFAULT; } else { - length &= REC_OFFS_MASK; - length -= offs; + *len = get_value(next_offs) - offs; } - *len = length; return(offs); } @@ -906,7 +898,7 @@ const byte* rec_offs_any_null_extern( /*=====================*/ const rec_t* rec, /*!< in: record */ - const ulint* offsets) /*!< in: rec_get_offsets(rec) */ + const offset_t* offsets) /*!< in: rec_get_offsets(rec) */ { ulint i; ut_ad(rec_offs_validate(rec, NULL, offsets)); @@ -941,16 +933,16 @@ UNIV_INLINE ulint rec_offs_nth_size( /*==============*/ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint n) /*!< in: nth field */ { ut_ad(rec_offs_validate(NULL, NULL, offsets)); ut_ad(n < rec_offs_n_fields(offsets)); if (!n) { - return(rec_offs_base(offsets)[1 + n] & REC_OFFS_MASK); + return get_value(rec_offs_base(offsets)[1 + n]); } - return((rec_offs_base(offsets)[1 + n] - rec_offs_base(offsets)[n]) - & REC_OFFS_MASK); + return get_value((rec_offs_base(offsets)[1 + n])) + - get_value(rec_offs_base(offsets)[n]); } /******************************************************//** @@ -960,7 +952,7 @@ UNIV_INLINE ulint rec_offs_n_extern( /*==============*/ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ulint n = 0; @@ -1158,7 +1150,7 @@ void rec_set_nth_field( /*==============*/ rec_t* rec, /*!< in: record */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint n, /*!< in: index number of the field */ const void* data, /*!< in: pointer to the data if not SQL null */ @@ -1214,16 +1206,16 @@ UNIV_INLINE void rec_offs_set_n_fields( /*==================*/ - ulint* offsets, /*!< in/out: array returned by + offset_t* offsets, /*!< in/out: array returned by rec_get_offsets() */ - ulint n_fields) /*!< in: number of fields */ + ulint n_fields) /*!< in: number of fields */ { ut_ad(offsets); ut_ad(n_fields > 0); ut_ad(n_fields <= REC_MAX_N_FIELDS); ut_ad(n_fields + REC_OFFS_HEADER_SIZE <= rec_offs_get_n_alloc(offsets)); - offsets[1] = n_fields; + offsets[1] = static_cast<offset_t>(n_fields); } /**********************************************************//** @@ -1236,14 +1228,12 @@ UNIV_INLINE ulint rec_offs_data_size( /*===============*/ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ulint size; ut_ad(rec_offs_validate(NULL, NULL, offsets)); - - ulint n = rec_offs_n_fields(offsets); - size = rec_offs_base(offsets)[n] & REC_OFFS_MASK; + size = get_value(rec_offs_base(offsets)[rec_offs_n_fields(offsets)]); ut_ad(size < srv_page_size); return(size); } @@ -1257,7 +1247,7 @@ UNIV_INLINE ulint rec_offs_extra_size( /*================*/ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ulint size; ut_ad(rec_offs_validate(NULL, NULL, offsets)); @@ -1273,7 +1263,7 @@ UNIV_INLINE ulint rec_offs_size( /*==========*/ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { return(rec_offs_data_size(offsets) + rec_offs_extra_size(offsets)); } @@ -1287,7 +1277,7 @@ byte* rec_get_end( /*========*/ const rec_t* rec, /*!< in: pointer to record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ut_ad(rec_offs_validate(rec, NULL, offsets)); return(const_cast<rec_t*>(rec + rec_offs_data_size(offsets))); @@ -1301,7 +1291,7 @@ byte* rec_get_start( /*==========*/ const rec_t* rec, /*!< in: pointer to record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ut_ad(rec_offs_validate(rec, NULL, offsets)); return(const_cast<rec_t*>(rec - rec_offs_extra_size(offsets))); @@ -1318,7 +1308,7 @@ rec_t* rec_copy( void* buf, const rec_t* rec, - const ulint* offsets) + const offset_t* offsets) { ulint extra_len; ulint data_len; diff --git a/storage/innobase/include/rem0types.h b/storage/innobase/include/rem0types.h index 38a5ba66f76..754781d62d1 100644 --- a/storage/innobase/include/rem0types.h +++ b/storage/innobase/include/rem0types.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2015, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -29,6 +30,9 @@ Created 5/30/1994 Heikki Tuuri /* We define the physical record simply as an array of bytes */ typedef byte rec_t; +/** This type represents a field offset in a rec_t* */ +typedef unsigned short int offset_t; + /* Maximum values for various fields (for non-blob tuples) */ #define REC_MAX_N_FIELDS (1024 - 1) #define REC_MAX_HEAP_NO (2 * 8192 - 1) diff --git a/storage/innobase/include/row0ftsort.h b/storage/innobase/include/row0ftsort.h index beb2f8c2bfb..c8288f58f15 100644 --- a/storage/innobase/include/row0ftsort.h +++ b/storage/innobase/include/row0ftsort.h @@ -30,6 +30,7 @@ Created 10/13/2010 Jimmy Yang #include "data0data.h" #include "fts0fts.h" #include "fts0priv.h" +#include "rem0types.h" #include "row0merge.h" #include "btr0bulk.h" @@ -250,7 +251,7 @@ row_merge_fts_sel_propagate( int* sel_tree, /*<! in: selection tree */ ulint level, /*<! in: selection tree level */ const mrec_t** mrec, /*<! in: sort record */ - ulint** offsets, /*<! in: record offsets */ + offset_t** offsets, /*<! in: record offsets */ dict_index_t* index); /*<! in: FTS index */ /********************************************************************//** Read sorted file containing index data tuples and insert these data diff --git a/storage/innobase/include/row0log.h b/storage/innobase/include/row0log.h index b537e76a227..c4c78b392af 100644 --- a/storage/innobase/include/row0log.h +++ b/storage/innobase/include/row0log.h @@ -136,7 +136,7 @@ row_log_table_delete( page X-latched */ dict_index_t* index, /*!< in/out: clustered index, S-latched or X-latched */ - const ulint* offsets,/*!< in: rec_get_offsets(rec,index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec,index) */ const byte* sys) /*!< in: DB_TRX_ID,DB_ROLL_PTR that should be logged, or NULL to use those in rec */ ATTRIBUTE_COLD __attribute__((nonnull(1,2,3))); @@ -151,7 +151,7 @@ row_log_table_update( page X-latched */ dict_index_t* index, /*!< in/out: clustered index, S-latched or X-latched */ - const ulint* offsets,/*!< in: rec_get_offsets(rec,index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec,index) */ const dtuple_t* old_pk);/*!< in: row_log_table_get_pk() before the update */ @@ -167,7 +167,7 @@ row_log_table_get_pk( page X-latched */ dict_index_t* index, /*!< in/out: clustered index, S-latched or X-latched */ - const ulint* offsets,/*!< in: rec_get_offsets(rec,index), + const offset_t* offsets,/*!< in: rec_get_offsets(rec,index), or NULL */ byte* sys, /*!< out: DB_TRX_ID,DB_ROLL_PTR for row_log_table_delete(), or NULL */ @@ -184,7 +184,7 @@ row_log_table_insert( page X-latched */ dict_index_t* index, /*!< in/out: clustered index, S-latched or X-latched */ - const ulint* offsets);/*!< in: rec_get_offsets(rec,index) */ + const offset_t* offsets);/*!< in: rec_get_offsets(rec,index) */ /******************************************************//** Notes that a BLOB is being freed during online ALTER TABLE. */ void diff --git a/storage/innobase/include/row0merge.h b/storage/innobase/include/row0merge.h index 27bd19252ac..fd9050d0a48 100644 --- a/storage/innobase/include/row0merge.h +++ b/storage/innobase/include/row0merge.h @@ -489,7 +489,7 @@ row_merge_read_rec( const mrec_t** mrec, /*!< out: pointer to merge record, or NULL on end of list (non-NULL on I/O error) */ - ulint* offsets,/*!< out: offsets of mrec */ + offset_t* offsets,/*!< out: offsets of mrec */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ MY_ATTRIBUTE((warn_unused_result)); diff --git a/storage/innobase/include/row0row.h b/storage/innobase/include/row0row.h index 3fe6a6a82d7..264cae52832 100644 --- a/storage/innobase/include/row0row.h +++ b/storage/innobase/include/row0row.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2017, MariaDB Corporation. +Copyright (c) 2016, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -44,7 +44,7 @@ ulint row_get_trx_id_offset( /*==================*/ const dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets)/*!< in: record offsets */ + const offset_t* offsets)/*!< in: record offsets */ MY_ATTRIBUTE((nonnull, warn_unused_result)); /*********************************************************************//** Reads the trx id field from a clustered index record. @@ -55,7 +55,7 @@ row_get_rec_trx_id( /*===============*/ const rec_t* rec, /*!< in: record */ const dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets)/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */ MY_ATTRIBUTE((nonnull, warn_unused_result)); /*********************************************************************//** Reads the roll pointer field from a clustered index record. @@ -66,7 +66,7 @@ row_get_rec_roll_ptr( /*=================*/ const rec_t* rec, /*!< in: record */ const dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets)/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */ MY_ATTRIBUTE((nonnull, warn_unused_result)); /* Flags for row build type. */ @@ -139,7 +139,7 @@ row_build( this record must be at least s-latched and the latch held as long as the row dtuple is used! */ - const ulint* offsets,/*!< in: rec_get_offsets(rec,index) + const offset_t* offsets,/*!< in: rec_get_offsets(rec,index) or NULL, in which case this function will invoke rec_get_offsets() */ const dict_table_t* col_table, @@ -190,7 +190,7 @@ row_build_w_add_vcol( ulint type, const dict_index_t* index, const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, const dict_table_t* col_table, const dtuple_t* defaults, const dict_add_v_col_t* add_v, @@ -207,7 +207,7 @@ row_rec_to_index_entry_low( /*=======================*/ const rec_t* rec, /*!< in: record in the index */ const dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ ulint* n_ext, /*!< out: number of externally stored columns */ mem_heap_t* heap) /*!< in: memory heap from which @@ -222,7 +222,7 @@ row_rec_to_index_entry( /*===================*/ const rec_t* rec, /*!< in: record in the index */ const dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in/out: rec_get_offsets(rec) */ + const offset_t* offsets,/*!< in/out: rec_get_offsets(rec) */ ulint* n_ext, /*!< out: number of externally stored columns */ mem_heap_t* heap) /*!< in: memory heap from which @@ -241,7 +241,7 @@ dtuple_t* row_metadata_to_tuple( const rec_t* rec, const dict_index_t* index, - const ulint* offsets, + const offset_t* offsets, ulint* n_ext, mem_heap_t* heap, ulint info_bits, @@ -287,7 +287,7 @@ row_build_row_ref_in_tuple( held as long as the row reference is used! */ const dict_index_t* index, /*!< in: secondary index */ - ulint* offsets)/*!< in: rec_get_offsets(rec, index) + offset_t* offsets)/*!< in: rec_get_offsets(rec, index) or NULL */ MY_ATTRIBUTE((nonnull(1,2,3))); /*******************************************************************//** @@ -305,7 +305,7 @@ row_build_row_ref_fast( const rec_t* rec, /*!< in: secondary index record; must be preserved while ref is used, as we do not copy field values to heap */ - const ulint* offsets);/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets);/*!< in: array returned by rec_get_offsets() */ /***************************************************************//** Searches the clustered index record for a row, if we have the row reference. diff --git a/storage/innobase/include/row0row.ic b/storage/innobase/include/row0row.ic index 10a69ff4360..c1e9e74ada3 100644 --- a/storage/innobase/include/row0row.ic +++ b/storage/innobase/include/row0row.ic @@ -37,7 +37,7 @@ ulint row_get_trx_id_offset( /*==================*/ const dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets)/*!< in: record offsets */ + const offset_t* offsets)/*!< in: record offsets */ { ulint offset; ulint len; @@ -60,7 +60,7 @@ row_get_rec_trx_id( /*===============*/ const rec_t* rec, /*!< in: record */ const dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets)/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */ { ulint offset; @@ -85,7 +85,7 @@ row_get_rec_roll_ptr( /*=================*/ const rec_t* rec, /*!< in: record */ const dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets)/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */ { ulint offset; @@ -144,7 +144,7 @@ row_build_row_ref_fast( const rec_t* rec, /*!< in: secondary index record; must be preserved while ref is used, as we do not copy field values to heap */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { dfield_t* dfield; const byte* field; diff --git a/storage/innobase/include/row0upd.h b/storage/innobase/include/row0upd.h index f00664e2421..a14f8f7b63c 100644 --- a/storage/innobase/include/row0upd.h +++ b/storage/innobase/include/row0upd.h @@ -28,6 +28,7 @@ Created 12/27/1996 Heikki Tuuri #define row0upd_h #include "data0data.h" +#include "rem0types.h" #include "row0types.h" #include "btr0types.h" #include "trx0types.h" @@ -110,7 +111,7 @@ row_upd_rec_sys_fields( page_zip_des_t* page_zip,/*!< in/out: compressed page whose uncompressed part will be updated, or NULL */ dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ const trx_t* trx, /*!< in: transaction */ roll_ptr_t roll_ptr);/*!< in: DB_ROLL_PTR to the undo log */ /*********************************************************************//** @@ -140,7 +141,7 @@ ibool row_upd_changes_field_size_or_external( /*===================================*/ dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ const upd_t* update);/*!< in: update vector */ /***********************************************************//** Returns true if row update contains disowned external fields. @@ -161,7 +162,7 @@ row_upd_rec_in_place( /*=================*/ rec_t* rec, /*!< in/out: record where replaced */ dict_index_t* index, /*!< in: the index the record belongs to */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ const upd_t* update, /*!< in: update vector */ page_zip_des_t* page_zip);/*!< in: compressed page with enough space available, or NULL */ @@ -176,7 +177,7 @@ row_upd_build_sec_rec_difference_binary( /*====================================*/ const rec_t* rec, /*!< in: secondary index record */ dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ const dtuple_t* entry, /*!< in: entry to insert */ mem_heap_t* heap) /*!< in: memory heap from which allocated */ MY_ATTRIBUTE((warn_unused_result, nonnull)); @@ -202,7 +203,7 @@ row_upd_build_difference_binary( dict_index_t* index, const dtuple_t* entry, const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, bool no_sys, trx_t* trx, mem_heap_t* heap, @@ -374,7 +375,7 @@ row_upd_rec_sys_fields_in_recovery( /*===============================*/ rec_t* rec, /*!< in/out: record */ page_zip_des_t* page_zip,/*!< in/out: compressed page, or NULL */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint pos, /*!< in: TRX_ID position in rec */ trx_id_t trx_id, /*!< in: transaction id */ roll_ptr_t roll_ptr);/*!< in: roll ptr of the undo log record */ diff --git a/storage/innobase/include/row0upd.ic b/storage/innobase/include/row0upd.ic index deb57f718e9..85d0322302a 100644 --- a/storage/innobase/include/row0upd.ic +++ b/storage/innobase/include/row0upd.ic @@ -163,7 +163,7 @@ row_upd_rec_sys_fields( page_zip_des_t* page_zip,/*!< in/out: compressed page whose uncompressed part will be updated, or NULL */ dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ const trx_t* trx, /*!< in: transaction */ roll_ptr_t roll_ptr)/*!< in: DB_ROLL_PTR to the undo log */ { diff --git a/storage/innobase/include/row0vers.h b/storage/innobase/include/row0vers.h index 948804beafc..0603f7c894c 100644 --- a/storage/innobase/include/row0vers.h +++ b/storage/innobase/include/row0vers.h @@ -52,7 +52,7 @@ row_vers_impl_x_locked( trx_t* caller_trx, const rec_t* rec, dict_index_t* index, - const ulint* offsets); + const offset_t* offsets); /** Finds out if a version of the record, where the version >= the current purge view, should have ientry as its secondary index entry. We check @@ -98,7 +98,7 @@ row_vers_build_for_consistent_read( mtr_t* mtr, /*!< in: mtr holding the latch on rec; it will also hold the latch on purge_view */ dict_index_t* index, /*!< in: the clustered index */ - ulint** offsets,/*!< in/out: offsets returned by + offset_t** offsets,/*!< in/out: offsets returned by rec_get_offsets(rec, index) */ ReadView* view, /*!< in: the consistent read view */ mem_heap_t** offset_heap,/*!< in/out: memory heap from which @@ -126,7 +126,7 @@ row_vers_build_for_semi_consistent_read( of this records */ mtr_t* mtr, /*!< in: mtr holding the latch on rec */ dict_index_t* index, /*!< in: the clustered index */ - ulint** offsets,/*!< in/out: offsets returned by + offset_t** offsets,/*!< in/out: offsets returned by rec_get_offsets(rec, index) */ mem_heap_t** offset_heap,/*!< in/out: memory heap from which the offsets are allocated */ diff --git a/storage/innobase/include/trx0rec.h b/storage/innobase/include/trx0rec.h index f169dd8871e..e2c2fbd8204 100644 --- a/storage/innobase/include/trx0rec.h +++ b/storage/innobase/include/trx0rec.h @@ -191,7 +191,7 @@ trx_undo_report_row_operation( const rec_t* rec, /*!< in: case of an update or delete marking, the record in the clustered index; NULL if insert */ - const ulint* offsets, /*!< in: rec_get_offsets(rec) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec) */ roll_ptr_t* roll_ptr) /*!< out: DB_ROLL_PTR to the undo log record */ MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result)); @@ -224,7 +224,7 @@ trx_undo_prev_version_build( index_rec page and purge_view */ const rec_t* rec, /*!< in: version of a clustered index record */ dict_index_t* index, /*!< in: clustered index */ - ulint* offsets,/*!< in/out: rec_get_offsets(rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */ mem_heap_t* heap, /*!< in: memory heap from which the memory needed is allocated */ rec_t** old_vers,/*!< out, own: previous version, or NULL if diff --git a/storage/innobase/include/ut0rnd.h b/storage/innobase/include/ut0rnd.h index e8604ffa1c3..9af8687bfd0 100644 --- a/storage/innobase/include/ut0rnd.h +++ b/storage/innobase/include/ut0rnd.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -27,37 +28,49 @@ Created 1/20/1994 Heikki Tuuri #define ut0rnd_h #include "ut0byte.h" +#include <my_sys.h> #ifndef UNIV_INNOCHECKSUM -/** The 'character code' for end of field or string (used -in folding records */ -#define UT_END_OF_FIELD 257 +/** Seed value of ut_rnd_gen() */ +extern int32 ut_rnd_current; + +/** @return a pseudo-random 32-bit number */ +inline uint32_t ut_rnd_gen() +{ + /* This is a Galois linear-feedback shift register. + https://en.wikipedia.org/wiki/Linear-feedback_shift_register#Galois_LFSRs + The generating primitive Galois Field polynomial is the Castagnoli + polynomial that was made popular by CRC-32C: + x^32+x^28+x^27+x^26+x^25+x^23+x^22+x^20+ + x^19+x^18+x^14+x^13+x^11+x^10+x^9+x^8+x^6+1 */ + const uint32_t crc32c= 0x1edc6f41; + + uint32_t rnd= my_atomic_load32_explicit(&ut_rnd_current, + MY_MEMORY_ORDER_RELAXED); + + if (UNIV_UNLIKELY(rnd == 0)) + { + rnd= static_cast<uint32_t>(my_interval_timer()); + if (!rnd) rnd= 1; + } + else + { + bool lsb= rnd & 1; + rnd>>= 1; + if (lsb) + rnd^= crc32c; + } + + my_atomic_store32_explicit(&ut_rnd_current, rnd, MY_MEMORY_ORDER_RELAXED); + return rnd; +} + +/** @return a random number between 0 and n-1, inclusive */ +inline ulint ut_rnd_interval(ulint n) +{ + return n > 1 ? static_cast<ulint>(ut_rnd_gen() % n) : 0; +} -/********************************************************//** -This is used to set the random number seed. */ -UNIV_INLINE -void -ut_rnd_set_seed( -/*============*/ - ulint seed); /*!< in: seed */ -/********************************************************//** -The following function generates a series of 'random' ulint integers. -@return the next 'random' number */ -UNIV_INLINE -ulint -ut_rnd_gen_next_ulint( -/*==================*/ - ulint rnd); /*!< in: the previous random number value */ -/*********************************************************//** -The following function generates 'random' ulint integers which -enumerate the value space (let there be N of them) of ulint integers -in a pseudo-random fashion. Note that the same integer is repeated -always after N calls to the generator. -@return the 'random' number */ -UNIV_INLINE -ulint -ut_rnd_gen_ulint(void); -/*==================*/ /*******************************************************//** The following function generates a hash value for a ulint integer to a hash table of size table_size, which should be a prime or some diff --git a/storage/innobase/include/ut0rnd.ic b/storage/innobase/include/ut0rnd.ic index 2516d20f296..c0105160a42 100644 --- a/storage/innobase/include/ut0rnd.ic +++ b/storage/innobase/include/ut0rnd.ic @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -29,74 +29,6 @@ Created 5/30/1994 Heikki Tuuri #ifndef UNIV_INNOCHECKSUM -#define UT_RND1 151117737 -#define UT_RND2 119785373 -#define UT_RND3 85689495 -#define UT_RND4 76595339 -#define UT_SUM_RND2 98781234 -#define UT_SUM_RND3 126792457 -#define UT_SUM_RND4 63498502 -#define UT_XOR_RND1 187678878 -#define UT_XOR_RND2 143537923 - -/** Seed value of ut_rnd_gen_ulint() */ -extern ulint ut_rnd_ulint_counter; - -/********************************************************//** -This is used to set the random number seed. */ -UNIV_INLINE -void -ut_rnd_set_seed( -/*============*/ - ulint seed) /*!< in: seed */ -{ - ut_rnd_ulint_counter = seed; -} - -/********************************************************//** -The following function generates a series of 'random' ulint integers. -@return the next 'random' number */ -UNIV_INLINE -ulint -ut_rnd_gen_next_ulint( -/*==================*/ - ulint rnd) /*!< in: the previous random number value */ -{ - ulint n_bits; - - n_bits = 8 * sizeof(ulint); - - rnd = UT_RND2 * rnd + UT_SUM_RND3; - rnd = UT_XOR_RND1 ^ rnd; - rnd = (rnd << 20) + (rnd >> (n_bits - 20)); - rnd = UT_RND3 * rnd + UT_SUM_RND4; - rnd = UT_XOR_RND2 ^ rnd; - rnd = (rnd << 20) + (rnd >> (n_bits - 20)); - rnd = UT_RND1 * rnd + UT_SUM_RND2; - - return(rnd); -} - -/********************************************************//** -The following function generates 'random' ulint integers which -enumerate the value space of ulint integers in a pseudo random -fashion. Note that the same integer is repeated always after -2 to power 32 calls to the generator (if ulint is 32-bit). -@return the 'random' number */ -UNIV_INLINE -ulint -ut_rnd_gen_ulint(void) -/*==================*/ -{ - ulint rnd; - - ut_rnd_ulint_counter = UT_RND1 * ut_rnd_ulint_counter + UT_RND2; - - rnd = ut_rnd_gen_next_ulint(ut_rnd_ulint_counter); - - return(rnd); -} - /*******************************************************//** The following function generates a hash value for a ulint integer to a hash table of size table_size, which should be a prime diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 23b3b9f4d14..c5a6b81d4e9 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -324,7 +324,7 @@ lock_report_trx_id_insanity( trx_id_t trx_id, /*!< in: trx id */ const rec_t* rec, /*!< in: user record */ dict_index_t* index, /*!< in: index */ - const ulint* offsets, /*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec, index) */ trx_id_t max_trx_id) /*!< in: trx_sys.get_max_trx_id() */ { ut_ad(rec_offs_validate(rec, index, offsets)); @@ -348,7 +348,7 @@ lock_check_trx_id_sanity( trx_id_t trx_id, /*!< in: trx id */ const rec_t* rec, /*!< in: user record */ dict_index_t* index, /*!< in: index */ - const ulint* offsets) /*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets) /*!< in: rec_get_offsets(rec, index) */ { ut_ad(rec_offs_validate(rec, index, offsets)); ut_ad(!rec_is_metadata(rec, *index)); @@ -374,7 +374,7 @@ lock_clust_rec_cons_read_sees( const rec_t* rec, /*!< in: user record which should be read or passed over by a read cursor */ dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ ReadView* view) /*!< in: consistent read view */ { ut_ad(dict_index_is_clust(index)); @@ -1201,7 +1201,7 @@ lock_sec_rec_some_has_impl( trx_t* caller_trx,/*!<in/out: trx of current thread */ const rec_t* rec, /*!< in: user record */ dict_index_t* index, /*!< in: secondary index */ - const ulint* offsets)/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */ { trx_t* trx; trx_id_t max_trx_id; @@ -4466,8 +4466,8 @@ static void lock_rec_print(FILE* file, const lock_t* lock, mtr_t& mtr) putc('\n', file); mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); mtr.start(); @@ -4815,7 +4815,7 @@ lock_rec_queue_validate( const buf_block_t* block, /*!< in: buffer block containing rec */ const rec_t* rec, /*!< in: record to look at */ const dict_index_t* index, /*!< in: index, or NULL if not known */ - const ulint* offsets)/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */ { const lock_t* lock; ulint heap_no; @@ -4982,8 +4982,8 @@ lock_rec_validate_page( ulint nth_bit = 0; ulint i; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(!lock_mutex_own()); @@ -5352,8 +5352,8 @@ lock_rec_insert_check_and_lock( #ifdef UNIV_DEBUG { mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - const ulint* offsets; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + const offset_t* offsets; rec_offs_init(offsets_); offsets = rec_get_offsets(next_rec, index, offsets_, true, @@ -5512,7 +5512,7 @@ lock_rec_convert_impl_to_expl( const buf_block_t* block, const rec_t* rec, dict_index_t* index, - const ulint* offsets) + const offset_t* offsets) { trx_t* trx; @@ -5583,7 +5583,7 @@ lock_clust_rec_modify_check_and_lock( const rec_t* rec, /*!< in: record which should be modified */ dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ que_thr_t* thr) /*!< in: query thread */ { dberr_t err; @@ -5675,8 +5675,8 @@ lock_sec_rec_modify_check_and_lock( #ifdef UNIV_DEBUG { mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - const ulint* offsets; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + const offset_t* offsets; rec_offs_init(offsets_); offsets = rec_get_offsets(rec, index, offsets_, true, @@ -5720,7 +5720,7 @@ lock_sec_rec_read_check_and_lock( be read or passed over by a read cursor */ dict_index_t* index, /*!< in: secondary index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ lock_mode mode, /*!< in: mode of the lock which the read cursor should set on records: LOCK_S or LOCK_X; the @@ -5790,7 +5790,7 @@ lock_clust_rec_read_check_and_lock( be read or passed over by a read cursor */ dict_index_t* index, /*!< in: clustered index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ lock_mode mode, /*!< in: mode of the lock which the read cursor should set on records: LOCK_S or LOCK_X; the @@ -5868,8 +5868,8 @@ lock_clust_rec_read_check_and_lock_alt( que_thr_t* thr) /*!< in: query thread */ { mem_heap_t* tmp_heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; dberr_t err; rec_offs_init(offsets_); diff --git a/storage/innobase/page/page0cur.cc b/storage/innobase/page/page0cur.cc index f777e7b8378..4bc9d1eb094 100644 --- a/storage/innobase/page/page0cur.cc +++ b/storage/innobase/page/page0cur.cc @@ -35,38 +35,6 @@ Created 10/4/1994 Heikki Tuuri #include <algorithm> -/*******************************************************************//** -This is a linear congruential generator PRNG. Returns a pseudo random -number between 0 and 2^64-1 inclusive. The formula and the constants -being used are: -X[n+1] = (a * X[n] + c) mod m -where: -X[0] = my_interval_timer() -a = 1103515245 (3^5 * 5 * 7 * 129749) -c = 12345 (3 * 5 * 823) -m = 18446744073709551616 (2^64) - -@return number between 0 and 2^64-1 */ -static -ib_uint64_t -page_cur_lcg_prng(void) -/*===================*/ -{ -#define LCG_a 1103515245 -#define LCG_c 12345 - static uint64_t lcg_current; - - if (!lcg_current) { - lcg_current = my_interval_timer(); - } - - /* no need to "% 2^64" explicitly because lcg_current is - 64 bit and this will be done anyway */ - lcg_current = LCG_a * lcg_current + LCG_c; - - return(lcg_current); -} - #ifdef BTR_CUR_HASH_ADAPT # ifdef UNIV_SEARCH_PERF_STAT static ulint page_cur_short_succ; @@ -99,8 +67,8 @@ page_cur_try_search_shortcut( ibool success = FALSE; const page_t* page = buf_block_get_frame(block); mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(dtuple_check_typed(tuple)); @@ -183,8 +151,8 @@ page_cur_try_search_shortcut_bytes( ibool success = FALSE; const page_t* page = buf_block_get_frame(block); mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(dtuple_check_typed(tuple)); @@ -255,7 +223,7 @@ page_cur_rec_field_extends( /*=======================*/ const dtuple_t* tuple, /*!< in: data tuple */ const rec_t* rec, /*!< in: record */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint n) /*!< in: compare nth field */ { const dtype_t* type; @@ -331,8 +299,8 @@ page_cur_search_with_match( const page_zip_des_t* page_zip = buf_block_get_page_zip(block); #endif /* UNIV_ZIP_DEBUG */ mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(dtuple_validate(tuple)); @@ -590,8 +558,8 @@ page_cur_search_with_match_bytes( const page_zip_des_t* page_zip = buf_block_get_page_zip(block); #endif /* UNIV_ZIP_DEBUG */ mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(dtuple_validate(tuple)); @@ -803,8 +771,7 @@ page_cur_open_on_rnd_user_rec( buf_block_t* block, /*!< in: page */ page_cur_t* cursor) /*!< out: page cursor */ { - ulint rnd; - ulint n_recs = page_get_n_recs(buf_block_get_frame(block)); + const ulint n_recs = page_get_n_recs(block->frame); page_cur_set_before_first(block, cursor); @@ -813,11 +780,8 @@ page_cur_open_on_rnd_user_rec( return; } - rnd = (ulint) (page_cur_lcg_prng() % n_recs); - - do { - page_cur_move_to_next(cursor); - } while (rnd--); + cursor->rec = page_rec_get_nth(block->frame, + ut_rnd_interval(n_recs) + 1); } /** Write a redo log record of inserting a record into an index page. @@ -857,11 +821,11 @@ page_cur_insert_rec_write_log( { mem_heap_t* heap = NULL; - ulint cur_offs_[REC_OFFS_NORMAL_SIZE]; - ulint ins_offs_[REC_OFFS_NORMAL_SIZE]; + offset_t cur_offs_[REC_OFFS_NORMAL_SIZE]; + offset_t ins_offs_[REC_OFFS_NORMAL_SIZE]; - ulint* cur_offs; - ulint* ins_offs; + offset_t* cur_offs; + offset_t* ins_offs; rec_offs_init(cur_offs_); rec_offs_init(ins_offs_); @@ -1037,8 +1001,8 @@ page_cur_parse_insert_rec( ulint info_and_status_bits = 0; /* remove warning */ page_cur_t cursor; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); page = block ? buf_block_get_frame(block) : NULL; @@ -1255,7 +1219,7 @@ page_cur_insert_rec_low( which the new record is inserted */ dict_index_t* index, /*!< in: record descriptor */ const rec_t* rec, /*!< in: pointer to a physical record */ - ulint* offsets,/*!< in/out: rec_get_offsets(rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */ mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */ { byte* insert_buf; @@ -1306,8 +1270,8 @@ page_cur_insert_rec_low( free_rec = page_header_get_ptr(page, PAGE_FREE); if (UNIV_LIKELY_NULL(free_rec)) { /* Try to allocate from the head of the free list. */ - ulint foffsets_[REC_OFFS_NORMAL_SIZE]; - ulint* foffsets = foffsets_; + offset_t foffsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* foffsets = foffsets_; mem_heap_t* heap = NULL; rec_offs_init(foffsets_); @@ -1478,7 +1442,7 @@ page_cur_insert_rec_zip( page_cur_t* cursor, /*!< in/out: page cursor */ dict_index_t* index, /*!< in: record descriptor */ const rec_t* rec, /*!< in: pointer to a physical record */ - ulint* offsets,/*!< in/out: rec_get_offsets(rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */ mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */ { byte* insert_buf; @@ -1719,8 +1683,8 @@ page_cur_insert_rec_zip( if (UNIV_LIKELY_NULL(free_rec)) { /* Try to allocate from the head of the free list. */ lint extra_size_diff; - ulint foffsets_[REC_OFFS_NORMAL_SIZE]; - ulint* foffsets = foffsets_; + offset_t foffsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* foffsets = foffsets_; mem_heap_t* heap = NULL; rec_offs_init(foffsets_); @@ -2036,8 +2000,8 @@ page_copy_rec_list_end_to_created_page( byte* log_ptr; ulint log_data_len; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(page_dir_get_n_heap(new_page) == PAGE_HEAP_NO_USER_LOW); @@ -2260,7 +2224,7 @@ page_cur_parse_delete_rec( if (block) { page_t* page = buf_block_get_frame(block); mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; rec_t* rec = page + offset; rec_offs_init(offsets_); @@ -2288,7 +2252,7 @@ page_cur_delete_rec( /*================*/ page_cur_t* cursor, /*!< in/out: a page cursor */ const dict_index_t* index, /*!< in: record descriptor */ - const ulint* offsets,/*!< in: rec_get_offsets( + const offset_t* offsets,/*!< in: rec_get_offsets( cursor->rec, index) */ mtr_t* mtr) /*!< in: mini-transaction handle or NULL */ @@ -2425,18 +2389,17 @@ page_cur_delete_rec( #ifdef UNIV_COMPILE_TEST_FUNCS /*******************************************************************//** -Print the first n numbers, generated by page_cur_lcg_prng() to make sure +Print the first n numbers, generated by ut_rnd_gen() to make sure (visually) that it works properly. */ void -test_page_cur_lcg_prng( -/*===================*/ +test_ut_rnd_gen( int n) /*!< in: print first n numbers */ { int i; unsigned long long rnd; for (i = 0; i < n; i++) { - rnd = page_cur_lcg_prng(); + rnd = ut_rnd_gen(); printf("%llu\t%%2=%llu %%3=%llu %%5=%llu %%7=%llu %%11=%llu\n", rnd, rnd % 2, diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc index 36dfabb7c49..28a7d506975 100644 --- a/storage/innobase/page/page0page.cc +++ b/storage/innobase/page/page0page.cc @@ -36,6 +36,7 @@ Created 2/2/1994 Heikki Tuuri #include "fut0lst.h" #include "btr0sea.h" #include "trx0sys.h" +#include <algorithm> /* THE INDEX PAGE ============== @@ -561,8 +562,8 @@ page_copy_rec_list_end_no_locks( page_cur_t cur1; rec_t* cur2; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); page_cur_position(rec, block, &cur1); @@ -791,8 +792,8 @@ page_copy_rec_list_start( rtr_rec_move_t* rec_move = NULL; rec_t* ret = page_rec_get_prev(page_get_supremum_rec(new_page)); - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); /* Here, "ret" may be pointing to a user record or the @@ -1028,8 +1029,8 @@ page_delete_rec_list_end( page_zip_des_t* page_zip = buf_block_get_page_zip(block); page_t* page = page_align(rec); mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(size == ULINT_UNDEFINED || size < srv_page_size); @@ -1230,8 +1231,8 @@ page_delete_rec_list_start( mtr_t* mtr) /*!< in: mtr */ { page_cur_t cur1; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; mem_heap_t* heap = NULL; rec_offs_init(offsets_); @@ -1718,7 +1719,7 @@ void page_rec_print( /*===========*/ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets)/*!< in: record descriptor */ + const offset_t* offsets)/*!< in: record descriptor */ { ut_a(!page_rec_is_comp(rec) == !rec_offs_comp(offsets)); rec_print_new(stderr, rec, offsets); @@ -1793,8 +1794,8 @@ page_print_list( ulint count; ulint n_recs; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_a((ibool)!!page_is_comp(page) == dict_table_is_comp(index->table)); @@ -1906,7 +1907,7 @@ ibool page_rec_validate( /*==============*/ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ulint n_owned; ulint heap_no; @@ -2391,8 +2392,13 @@ bool page_validate(const page_t* page, const dict_index_t* index) ulint n_slots; ibool ret = TRUE; ulint i; - ulint* offsets = NULL; - ulint* old_offsets = NULL; + offset_t offsets_1[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_2[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_1; + offset_t* old_offsets = offsets_2; + + rec_offs_init(offsets_1); + rec_offs_init(offsets_2); #ifdef UNIV_GIS_DEBUG if (dict_index_is_spatial(index)) { @@ -2657,11 +2663,7 @@ next_rec: } /* set old_offsets to offsets; recycle offsets */ - { - ulint* offs = old_offsets; - old_offsets = offsets; - offsets = offs; - } + std::swap(old_offsets, offsets); } if (page_is_comp(page)) { @@ -2822,7 +2824,7 @@ page_delete_rec( page_zip/*!< in: compressed page descriptor */ #endif , - const ulint* offsets)/*!< in: offsets for record */ + const offset_t* offsets)/*!< in: offsets for record */ { bool no_compress_needed; buf_block_t* block = pcur->block; diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc index d0318b51f4a..10697528e25 100644 --- a/storage/innobase/page/page0zip.cc +++ b/storage/innobase/page/page0zip.cc @@ -869,7 +869,7 @@ page_zip_compress_node_ptrs( mem_heap_t* heap) /*!< in: temporary memory heap */ { int err = Z_OK; - ulint* offsets = NULL; + offset_t* offsets = NULL; do { const rec_t* rec = *recs++; @@ -974,7 +974,7 @@ page_zip_compress_clust_ext( FILE_LOGFILE z_stream* c_stream, /*!< in/out: compressed page stream */ const rec_t* rec, /*!< in: record */ - const ulint* offsets, /*!< in: rec_get_offsets(rec) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec) */ ulint trx_id_col, /*!< in: position of of DB_TRX_ID */ byte* deleted, /*!< in: dense directory entry pointing to the head of the free list */ @@ -1113,7 +1113,7 @@ page_zip_compress_clust( mem_heap_t* heap) /*!< in: temporary memory heap */ { int err = Z_OK; - ulint* offsets = NULL; + offset_t* offsets = NULL; /* BTR_EXTERN_FIELD_REF storage */ byte* externs = storage - n_dense * (DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN); @@ -1933,7 +1933,7 @@ const byte* page_zip_apply_log_ext( /*===================*/ rec_t* rec, /*!< in/out: record */ - const ulint* offsets, /*!< in: rec_get_offsets(rec) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec) */ ulint trx_id_col, /*!< in: position of of DB_TRX_ID */ const byte* data, /*!< in: modification log */ const byte* end) /*!< in: end of modification log */ @@ -2034,7 +2034,7 @@ page_zip_apply_log( /*!< in: heap_no and status bits for the next record to uncompress */ dict_index_t* index, /*!< in: index of the page */ - ulint* offsets)/*!< in/out: work area for + offset_t* offsets)/*!< in/out: work area for rec_get_offsets_reverse() */ { const byte* const end = data + size; @@ -2102,7 +2102,7 @@ page_zip_apply_log( if (val & 1) { /* Clear the data bytes of the record. */ mem_heap_t* heap = NULL; - ulint* offs; + offset_t* offs; offs = rec_get_offsets(rec, index, offsets, is_leaf, ULINT_UNDEFINED, &heap); memset(rec, 0, rec_offs_data_size(offs)); @@ -2256,7 +2256,7 @@ page_zip_decompress_node_ptrs( sorted by address */ ulint n_dense, /*!< in: size of recs[] */ dict_index_t* index, /*!< in: the index of the page */ - ulint* offsets, /*!< in/out: temporary offsets */ + offset_t* offsets, /*!< in/out: temporary offsets */ mem_heap_t* heap) /*!< in: temporary memory heap */ { ulint heap_status = REC_STATUS_NODE_PTR @@ -2446,7 +2446,7 @@ page_zip_decompress_sec( sorted by address */ ulint n_dense, /*!< in: size of recs[] */ dict_index_t* index, /*!< in: the index of the page */ - ulint* offsets) /*!< in/out: temporary offsets */ + offset_t* offsets) /*!< in/out: temporary offsets */ { ulint heap_status = REC_STATUS_ORDINARY | PAGE_HEAP_NO_USER_LOW << REC_HEAP_NO_SHIFT; @@ -2579,7 +2579,7 @@ page_zip_decompress_clust_ext( /*==========================*/ z_stream* d_stream, /*!< in/out: compressed page stream */ rec_t* rec, /*!< in/out: record */ - const ulint* offsets, /*!< in: rec_get_offsets(rec) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec) */ ulint trx_id_col) /*!< in: position of of DB_TRX_ID */ { ulint i; @@ -2694,7 +2694,7 @@ page_zip_decompress_clust( ulint n_dense, /*!< in: size of recs[] */ dict_index_t* index, /*!< in: the index of the page */ ulint trx_id_col, /*!< index of the trx_id column */ - ulint* offsets, /*!< in/out: temporary offsets */ + offset_t* offsets, /*!< in/out: temporary offsets */ mem_heap_t* heap) /*!< in: temporary memory heap */ { int err; @@ -2998,7 +2998,7 @@ page_zip_decompress_low( ulint n_dense;/* number of user records on the page */ ulint trx_id_col = ULINT_UNDEFINED; mem_heap_t* heap; - ulint* offsets; + offset_t* offsets; ut_ad(page_zip_simple_validate(page_zip)); UNIV_MEM_ASSERT_W(page, srv_page_size); @@ -3122,10 +3122,10 @@ zlib_error: ulint n = 1 + 1/* node ptr */ + REC_OFFS_HEADER_SIZE + dict_index_get_n_fields(index); - offsets = static_cast<ulint*>( + offsets = static_cast<offset_t*>( mem_heap_alloc(heap, n * sizeof(ulint))); - *offsets = n; + rec_offs_set_n_alloc(offsets, n); } /* Decompress the records in heap_no order. */ @@ -3350,7 +3350,7 @@ page_zip_validate_low( committed. Let us tolerate that difference when we are performing a sloppy validation. */ - ulint* offsets; + offset_t* offsets; mem_heap_t* heap; const rec_t* rec; const rec_t* trec; @@ -3517,7 +3517,7 @@ page_zip_write_rec_ext( const page_t* page, /*!< in: page containing rec */ const byte* rec, /*!< in: record being written */ dict_index_t* index, /*!< in: record descriptor */ - const ulint* offsets, /*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec, index) */ ulint create, /*!< in: nonzero=insert, zero=update */ ulint trx_id_col, /*!< in: position of DB_TRX_ID */ ulint heap_no, /*!< in: heap number of rec */ @@ -3636,7 +3636,7 @@ page_zip_write_rec( page_zip_des_t* page_zip,/*!< in/out: compressed page */ const byte* rec, /*!< in: record being written */ dict_index_t* index, /*!< in: the index the record belongs to */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ ulint create) /*!< in: nonzero=insert, zero=update */ { const page_t* page; @@ -3880,7 +3880,7 @@ page_zip_write_blob_ptr( const byte* rec, /*!< in/out: record whose data is being written */ dict_index_t* index, /*!< in: index of the page */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ ulint n, /*!< in: column index */ mtr_t* mtr) /*!< in: mini-transaction handle, or NULL if no logging is needed */ @@ -4101,7 +4101,7 @@ void page_zip_write_trx_id_and_roll_ptr( page_zip_des_t* page_zip, byte* rec, - const ulint* offsets, + const offset_t* offsets, ulint trx_id_col, trx_id_t trx_id, roll_ptr_t roll_ptr, @@ -4240,7 +4240,7 @@ page_zip_clear_rec( page_zip_des_t* page_zip, /*!< in/out: compressed page */ byte* rec, /*!< in: record to clear */ const dict_index_t* index, /*!< in: index of rec */ - const ulint* offsets) /*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets) /*!< in: rec_get_offsets(rec, index) */ { ulint heap_no; page_t* page = page_align(rec); @@ -4446,7 +4446,7 @@ page_zip_dir_delete( page_zip_des_t* page_zip, /*!< in/out: compressed page */ byte* rec, /*!< in: deleted record */ const dict_index_t* index, /*!< in: index of rec */ - const ulint* offsets, /*!< in: rec_get_offsets(rec) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec) */ const byte* free) /*!< in: previous start of the free list */ { diff --git a/storage/innobase/pars/lexyy.cc b/storage/innobase/pars/lexyy.cc index e7f3981e0fe..1e93ec3ed50 100644 --- a/storage/innobase/pars/lexyy.cc +++ b/storage/innobase/pars/lexyy.cc @@ -356,8 +356,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 123 -#define YY_END_OF_BUFFER 124 +#define YY_NUM_RULES 102 +#define YY_END_OF_BUFFER 103 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -365,53 +365,42 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[404] = +static const flex_int16_t yy_accept[307] = { 0, - 0, 0, 118, 118, 0, 0, 0, 0, 124, 122, - 121, 121, 8, 122, 113, 5, 102, 108, 111, 109, - 106, 110, 122, 112, 1, 122, 107, 105, 103, 104, - 116, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 114, 115, 118, 119, 6, 7, 9, 10, 121, 4, - 97, 117, 2, 1, 3, 98, 99, 101, 100, 0, - 95, 0, 95, 95, 95, 95, 95, 44, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 28, 17, 25, 95, 95, 95, 95, - - 95, 95, 54, 62, 95, 14, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 118, 119, 119, 120, 6, 7, - 9, 10, 2, 0, 96, 13, 45, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 27, 95, 95, 95, 41, - 95, 95, 95, 95, 21, 95, 95, 95, 95, 95, - 15, 95, 95, 95, 18, 95, 95, 95, 95, 95, - 81, 95, 95, 95, 51, 95, 12, 95, 36, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - - 0, 96, 95, 95, 95, 95, 20, 95, 24, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 46, 95, 30, 95, 88, 95, 95, 39, 95, 95, - 95, 95, 95, 48, 95, 93, 90, 32, 92, 95, - 11, 65, 95, 95, 95, 42, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 29, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 86, 0, 95, 26, - 95, 95, 95, 67, 95, 95, 95, 95, 37, 95, - 95, 95, 95, 95, 95, 31, 66, 23, 95, 59, - 95, 76, 95, 95, 95, 43, 95, 95, 95, 95, - - 95, 95, 95, 95, 91, 95, 95, 56, 95, 95, - 95, 95, 95, 95, 95, 40, 33, 0, 80, 94, - 19, 95, 95, 84, 95, 75, 55, 95, 64, 95, - 52, 95, 95, 47, 95, 77, 95, 79, 95, 95, - 34, 95, 95, 95, 35, 73, 95, 95, 95, 95, - 60, 95, 50, 49, 95, 95, 95, 57, 53, 63, - 95, 95, 22, 95, 95, 74, 82, 95, 95, 78, - 95, 69, 95, 95, 95, 95, 95, 38, 89, 68, - 95, 85, 95, 95, 95, 87, 95, 95, 61, 16, - 95, 71, 70, 95, 58, 83, 95, 95, 95, 95, - - 95, 72, 0 + 0, 0, 97, 97, 0, 0, 0, 0, 103, 101, + 100, 100, 8, 101, 92, 5, 81, 87, 90, 88, + 85, 89, 101, 91, 1, 101, 86, 84, 82, 83, + 95, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 93, 94, 97, 98, 6, 7, 9, 10, 100, 4, + 76, 96, 2, 1, 3, 77, 78, 80, 79, 0, + 74, 0, 74, 74, 74, 74, 36, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 23, 17, 20, 74, 74, 74, 74, 74, 74, 46, + + 52, 74, 14, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 97, 98, + 98, 99, 6, 7, 9, 10, 2, 0, 75, 13, + 37, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 22, 74, 74, 34, 74, + 74, 74, 74, 18, 74, 74, 74, 74, 74, 15, + 74, 74, 74, 74, 74, 74, 74, 43, 74, 12, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 0, 75, 74, 74, 19, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 38, 25, 74, 67, 74, + + 32, 74, 74, 74, 74, 40, 74, 72, 69, 27, + 71, 74, 11, 55, 74, 74, 74, 74, 74, 74, + 74, 74, 24, 74, 74, 74, 74, 74, 74, 66, + 0, 21, 74, 57, 74, 74, 74, 31, 74, 74, + 74, 74, 74, 26, 56, 74, 49, 74, 62, 74, + 74, 35, 74, 74, 74, 74, 70, 74, 48, 74, + 74, 74, 74, 33, 28, 0, 73, 74, 64, 61, + 47, 74, 54, 74, 44, 74, 39, 63, 74, 74, + 29, 74, 30, 60, 74, 50, 42, 41, 74, 45, + 53, 74, 74, 74, 74, 74, 74, 68, 58, 74, + + 65, 74, 51, 16, 59, 0 } ; static const YY_CHAR yy_ec[256] = @@ -424,12 +413,12 @@ static const YY_CHAR yy_ec[256] = 17, 17, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 1, 1, 1, 1, 51, 1, 34, 34, 34, 34, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 34, + 1, 1, 1, 1, 50, 1, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 52, 34, 34, - 34, 34, 53, 34, 54, 34, 34, 34, 34, 34, - 34, 34, 55, 1, 56, 1, 1, 1, 1, 1, + 34, 34, 34, 34, 34, 34, 34, 51, 34, 34, + 34, 34, 52, 34, 53, 34, 34, 34, 34, 34, + 34, 34, 54, 1, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -446,418 +435,324 @@ static const YY_CHAR yy_ec[256] = 1, 1, 1, 1, 1 } ; -static const YY_CHAR yy_meta[57] = +static const YY_CHAR yy_meta[56] = { 0, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 5, 1, 1, 1, 1, 6, 7, 1, 1, 1, 8, 1, 1, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 1, 1 + 9, 9, 9, 1, 1 } ; -static const flex_int16_t yy_base[417] = +static const flex_int16_t yy_base[320] = { 0, - 0, 0, 296, 281, 283, 280, 261, 252, 253, 1285, - 55, 57, 1285, 0, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 211, 213, 46, 202, 1285, 43, 1285, 199, - 1285, 46, 50, 56, 52, 66, 64, 51, 81, 92, - 91, 94, 96, 111, 113, 116, 130, 134, 53, 143, - 1285, 1285, 0, 106, 0, 206, 0, 205, 141, 0, - 1285, 1285, 177, 56, 152, 1285, 1285, 1285, 1285, 161, - 140, 147, 152, 154, 155, 161, 167, 171, 177, 172, - 184, 174, 188, 189, 191, 194, 203, 212, 217, 219, - 222, 223, 228, 224, 226, 233, 235, 239, 244, 251, - - 256, 260, 261, 262, 265, 271, 266, 281, 277, 287, - 282, 288, 303, 306, 307, 292, 310, 321, 322, 323, - 324, 325, 335, 338, 0, 112, 173, 1285, 0, 152, - 0, 145, 130, 59, 0, 339, 341, 353, 351, 354, - 365, 367, 355, 372, 376, 383, 379, 386, 388, 385, - 398, 392, 402, 401, 414, 415, 416, 417, 426, 430, - 432, 437, 433, 439, 442, 443, 449, 456, 460, 461, - 463, 470, 472, 473, 479, 483, 485, 489, 492, 495, - 498, 499, 502, 508, 509, 514, 515, 518, 520, 527, - 530, 534, 536, 541, 543, 553, 555, 557, 559, 568, - - 41, 0, 564, 569, 570, 573, 574, 585, 580, 589, - 586, 595, 598, 600, 605, 610, 611, 617, 620, 615, - 622, 627, 626, 631, 641, 642, 646, 647, 648, 651, - 652, 653, 657, 662, 663, 667, 669, 673, 680, 682, - 684, 685, 686, 687, 689, 696, 698, 700, 701, 703, - 699, 710, 714, 716, 729, 732, 731, 733, 735, 734, - 746, 747, 748, 752, 753, 759, 749, 39, 769, 770, - 771, 773, 774, 780, 783, 784, 787, 785, 786, 802, - 800, 803, 816, 817, 818, 819, 820, 823, 833, 835, - 836, 837, 838, 839, 848, 849, 852, 853, 854, 859, - - 863, 870, 868, 872, 875, 884, 885, 887, 889, 890, - 888, 904, 906, 907, 908, 918, 919, 73, 921, 922, - 923, 924, 933, 934, 936, 937, 938, 939, 940, 949, - 952, 955, 953, 965, 969, 970, 971, 972, 974, 975, - 981, 984, 986, 988, 990, 991, 1000, 1006, 1004, 1009, - 1016, 1018, 1020, 1021, 1025, 1027, 1032, 1034, 1038, 1039, - 1041, 1043, 1048, 1050, 1052, 1055, 1059, 1064, 1066, 1068, - 1071, 1073, 1077, 1084, 1086, 1087, 1091, 1093, 1098, 1100, - 1102, 1104, 1105, 1111, 1114, 1116, 1117, 1118, 1120, 1127, - 1129, 1130, 1134, 1139, 1141, 1145, 1146, 1148, 1150, 1151, - - 1155, 1157, 1285, 1197, 1206, 1215, 1218, 1221, 1225, 1234, - 1243, 1252, 1261, 1268, 1272, 1275 + 0, 0, 262, 259, 249, 244, 239, 234, 236, 960, + 54, 56, 960, 0, 960, 960, 960, 960, 960, 960, + 960, 960, 217, 220, 45, 186, 960, 42, 960, 184, + 960, 45, 49, 55, 51, 65, 80, 50, 69, 94, + 90, 92, 104, 60, 114, 116, 131, 134, 135, 149, + 960, 960, 0, 61, 0, 194, 0, 197, 133, 0, + 960, 960, 163, 53, 143, 960, 960, 960, 960, 147, + 125, 123, 138, 151, 152, 153, 155, 166, 169, 173, + 170, 171, 176, 180, 193, 182, 200, 204, 206, 209, + 210, 211, 213, 224, 225, 226, 235, 240, 242, 245, + + 251, 252, 255, 256, 258, 261, 270, 274, 272, 277, + 289, 288, 276, 294, 295, 300, 304, 305, 0, 79, + 110, 960, 0, 116, 0, 113, 98, 58, 0, 306, + 315, 316, 318, 319, 322, 328, 329, 332, 334, 338, + 344, 353, 351, 354, 366, 360, 367, 369, 376, 378, + 381, 385, 388, 382, 394, 400, 403, 404, 406, 407, + 410, 417, 423, 424, 426, 429, 433, 440, 442, 443, + 444, 445, 454, 456, 459, 461, 472, 473, 474, 477, + 53, 0, 475, 478, 479, 490, 502, 504, 505, 507, + 508, 509, 511, 518, 520, 523, 524, 525, 529, 538, + + 541, 542, 543, 545, 547, 544, 556, 557, 558, 559, + 560, 569, 572, 574, 578, 581, 579, 583, 588, 590, + 600, 601, 602, 607, 611, 613, 612, 618, 622, 629, + 41, 634, 636, 638, 639, 643, 645, 648, 649, 650, + 655, 659, 661, 660, 670, 675, 676, 679, 680, 682, + 686, 689, 691, 696, 693, 700, 705, 706, 709, 711, + 712, 716, 722, 723, 726, 72, 727, 736, 737, 738, + 739, 740, 742, 743, 752, 753, 755, 757, 758, 759, + 764, 770, 769, 771, 774, 784, 785, 786, 787, 789, + 790, 791, 796, 801, 802, 803, 806, 807, 812, 817, + + 816, 823, 826, 828, 832, 960, 872, 881, 890, 893, + 896, 900, 909, 918, 927, 936, 943, 947, 950 } ; -static const flex_int16_t yy_def[417] = +static const flex_int16_t yy_def[320] = { 0, - 403, 1, 404, 404, 405, 405, 406, 406, 403, 403, - 403, 403, 403, 407, 403, 403, 403, 403, 403, 403, - 403, 403, 403, 403, 403, 408, 403, 403, 403, 403, - 403, 409, 409, 409, 409, 409, 34, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 403, 403, 410, 411, 412, 403, 413, 403, 403, 407, - 403, 403, 403, 403, 408, 403, 403, 403, 403, 414, - 409, 415, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 410, 411, 411, 403, 412, 403, - 413, 403, 403, 403, 416, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - - 403, 416, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 403, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 403, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, - - 409, 409, 0, 403, 403, 403, 403, 403, 403, 403, - 403, 403, 403, 403, 403, 403 + 306, 1, 307, 307, 308, 308, 309, 309, 306, 306, + 306, 306, 306, 310, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 311, 306, 306, 306, 306, + 306, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 306, 306, 313, 314, 315, 306, 316, 306, 306, 310, + 306, 306, 306, 306, 311, 306, 306, 306, 306, 317, + 312, 318, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 313, 314, + 314, 306, 315, 306, 316, 306, 306, 306, 319, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 306, 319, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 306, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 306, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + + 312, 312, 312, 312, 312, 0, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306 } ; -static const flex_int16_t yy_nxt[1342] = +static const flex_int16_t yy_nxt[1016] = { 0, 10, 11, 12, 13, 10, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 10, 32, 33, 34, 35, 36, 37, 38, 38, 39, 38, 38, 40, 41, 42, 43, 44, 38, 45, 46, 47, 48, 49, 50, 38, 38, 38, - 38, 38, 38, 38, 51, 52, 59, 59, 59, 59, - 63, 70, 64, 67, 68, 70, 70, 70, 70, 72, - 63, 70, 64, 72, 72, 72, 72, 122, 75, 72, - 84, 70, 76, 73, 85, 77, 135, 79, 74, 72, - 318, 80, 89, 268, 81, 71, 70, 82, 78, 90, - - 83, 86, 91, 87, 72, 92, 70, 70, 93, 70, - 94, 70, 201, 88, 72, 72, 127, 72, 95, 72, - 97, 128, 403, 96, 98, 103, 70, 403, 70, 100, - 99, 70, 101, 104, 72, 105, 72, 106, 102, 72, - 107, 109, 59, 59, 112, 70, 133, 113, 132, 70, - 110, 111, 108, 72, 117, 70, 114, 72, 70, 130, - 115, 118, 70, 72, 116, 134, 72, 70, 119, 70, - 70, 120, 403, 121, 123, 72, 70, 72, 72, 136, - 137, 124, 70, 127, 72, 139, 70, 70, 128, 70, - 72, 140, 70, 133, 72, 72, 138, 72, 141, 70, - - 72, 143, 149, 70, 70, 142, 70, 72, 132, 70, - 144, 72, 72, 130, 72, 151, 145, 72, 70, 69, - 146, 147, 66, 62, 152, 61, 72, 70, 148, 150, - 156, 153, 70, 154, 70, 72, 155, 70, 70, 70, - 72, 70, 72, 70, 157, 72, 72, 72, 70, 72, - 70, 72, 403, 163, 70, 58, 72, 159, 72, 70, - 158, 161, 72, 160, 58, 162, 70, 72, 164, 165, - 168, 70, 166, 167, 72, 70, 70, 70, 170, 72, - 70, 70, 169, 72, 72, 72, 70, 56, 72, 72, - 56, 54, 70, 173, 72, 172, 70, 70, 174, 171, - - 72, 178, 70, 70, 72, 72, 54, 70, 403, 175, - 72, 72, 403, 176, 181, 72, 179, 182, 70, 177, - 180, 70, 70, 184, 403, 70, 72, 186, 183, 72, - 72, 185, 188, 72, 190, 191, 70, 70, 70, 70, - 70, 187, 403, 189, 72, 72, 72, 72, 72, 192, - 70, 196, 403, 70, 70, 194, 70, 403, 72, 403, - 197, 72, 72, 198, 72, 195, 70, 199, 70, 70, - 70, 403, 193, 403, 72, 403, 72, 72, 72, 200, - 70, 203, 70, 204, 403, 403, 205, 70, 72, 206, - 72, 70, 207, 208, 70, 72, 209, 403, 70, 72, - - 70, 70, 72, 70, 403, 214, 72, 70, 72, 72, - 403, 72, 216, 70, 210, 72, 70, 70, 211, 212, - 220, 72, 213, 215, 72, 72, 217, 218, 221, 70, - 70, 70, 70, 219, 403, 403, 403, 72, 72, 72, - 72, 70, 223, 226, 222, 70, 224, 70, 70, 72, - 227, 403, 70, 72, 70, 72, 72, 70, 70, 225, - 72, 230, 72, 229, 70, 72, 72, 231, 228, 403, - 233, 70, 72, 235, 403, 70, 70, 236, 70, 72, - 234, 403, 232, 72, 72, 70, 72, 70, 70, 239, - 237, 403, 240, 72, 70, 72, 72, 403, 70, 238, - - 70, 243, 72, 403, 70, 241, 72, 70, 72, 242, - 70, 245, 72, 70, 70, 72, 246, 70, 72, 403, - 244, 72, 72, 70, 70, 72, 403, 247, 403, 70, - 70, 72, 72, 70, 250, 70, 252, 72, 72, 248, - 403, 72, 70, 72, 403, 70, 403, 403, 249, 70, - 72, 70, 251, 72, 255, 253, 70, 72, 70, 72, - 254, 258, 259, 403, 72, 256, 72, 403, 70, 403, - 70, 257, 70, 260, 70, 262, 72, 263, 72, 70, - 72, 261, 72, 70, 70, 70, 403, 72, 70, 70, - 403, 72, 72, 72, 266, 70, 72, 72, 265, 264, - - 70, 70, 267, 72, 70, 269, 270, 271, 72, 72, - 70, 403, 72, 70, 272, 70, 403, 274, 72, 273, - 70, 72, 277, 72, 278, 70, 70, 276, 72, 275, - 70, 403, 70, 72, 72, 70, 403, 70, 72, 281, - 72, 70, 70, 72, 283, 72, 70, 403, 279, 72, - 72, 403, 403, 280, 72, 282, 70, 70, 284, 285, - 286, 70, 70, 70, 72, 72, 70, 70, 70, 72, - 72, 72, 70, 287, 72, 72, 72, 70, 70, 403, - 72, 403, 70, 403, 70, 72, 72, 293, 70, 288, - 72, 289, 72, 291, 292, 70, 72, 70, 290, 70, - - 70, 70, 70, 72, 70, 72, 294, 72, 72, 72, - 72, 70, 72, 70, 70, 70, 70, 298, 70, 72, - 295, 72, 72, 72, 72, 70, 72, 296, 302, 70, - 297, 70, 403, 72, 403, 403, 304, 72, 303, 72, - 299, 300, 305, 301, 70, 403, 70, 70, 70, 70, - 70, 403, 72, 307, 72, 72, 72, 72, 72, 306, - 308, 70, 70, 70, 70, 309, 310, 70, 70, 72, - 72, 72, 72, 403, 70, 72, 72, 313, 311, 403, - 315, 316, 72, 403, 70, 70, 70, 317, 70, 70, - 312, 314, 72, 72, 72, 70, 72, 72, 70, 70, - - 70, 70, 70, 72, 403, 403, 72, 72, 72, 72, - 72, 323, 319, 325, 320, 70, 403, 70, 70, 403, - 403, 321, 403, 72, 322, 72, 72, 324, 326, 403, - 327, 70, 70, 70, 70, 70, 403, 328, 70, 72, - 72, 72, 72, 72, 329, 331, 72, 403, 70, 403, - 70, 70, 70, 70, 70, 332, 72, 330, 72, 72, - 72, 72, 72, 70, 70, 333, 335, 70, 70, 70, - 336, 72, 72, 403, 70, 72, 72, 72, 70, 334, - 339, 338, 72, 70, 403, 70, 72, 70, 403, 403, - 70, 72, 337, 72, 343, 72, 341, 340, 72, 70, - - 70, 403, 70, 70, 70, 70, 342, 72, 72, 344, - 72, 72, 72, 72, 349, 345, 403, 403, 403, 70, - 403, 70, 70, 70, 350, 346, 348, 72, 347, 72, - 72, 72, 351, 70, 70, 353, 70, 70, 70, 70, - 403, 72, 72, 352, 72, 72, 72, 72, 70, 70, - 354, 70, 70, 70, 70, 70, 72, 72, 403, 72, - 72, 72, 72, 72, 70, 403, 356, 70, 70, 403, - 70, 403, 72, 355, 357, 72, 72, 360, 72, 358, - 70, 361, 359, 403, 70, 70, 70, 70, 72, 70, - 70, 362, 72, 72, 72, 72, 70, 72, 72, 70, - - 403, 70, 403, 70, 72, 70, 70, 72, 364, 72, - 363, 72, 368, 72, 72, 70, 366, 403, 365, 70, - 369, 70, 403, 72, 70, 367, 403, 72, 370, 72, - 371, 70, 72, 70, 373, 70, 70, 403, 403, 72, - 70, 72, 70, 72, 72, 372, 374, 70, 72, 70, - 72, 403, 403, 70, 70, 72, 70, 72, 70, 376, - 377, 72, 72, 70, 72, 70, 72, 70, 375, 403, - 70, 72, 403, 72, 70, 72, 403, 380, 72, 70, - 379, 70, 72, 70, 378, 403, 70, 72, 70, 72, - 403, 72, 70, 381, 72, 403, 72, 403, 382, 70, - - 72, 70, 70, 383, 403, 385, 70, 72, 70, 72, - 72, 386, 384, 70, 72, 70, 72, 70, 389, 70, - 70, 72, 403, 72, 387, 72, 70, 72, 72, 70, - 390, 70, 70, 70, 72, 70, 388, 72, 403, 72, - 72, 72, 70, 72, 70, 70, 395, 403, 391, 70, - 72, 403, 72, 72, 70, 393, 70, 72, 396, 392, - 70, 70, 72, 70, 72, 70, 70, 394, 72, 72, - 70, 72, 70, 72, 72, 400, 397, 403, 72, 401, - 72, 403, 403, 403, 399, 403, 403, 403, 403, 403, - 398, 403, 403, 403, 403, 403, 402, 53, 53, 53, - - 53, 53, 53, 53, 53, 53, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 60, 403, 60, 65, 65, 65, - 71, 71, 403, 71, 125, 125, 125, 125, 403, 125, - 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 129, 129, 129, 403, 129, 129, 129, 129, - 129, 131, 403, 131, 131, 131, 131, 131, 131, 131, - 135, 403, 403, 403, 403, 403, 135, 72, 72, 403, - 72, 202, 403, 202, 9, 403, 403, 403, 403, 403, - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - 403 + 38, 38, 38, 51, 52, 59, 59, 59, 59, 63, + 70, 64, 67, 68, 70, 70, 70, 63, 72, 64, + 70, 121, 72, 72, 72, 70, 122, 75, 72, 83, + 70, 76, 73, 72, 70, 129, 78, 74, 72, 306, + 79, 266, 72, 80, 306, 70, 81, 77, 91, 82, + + 84, 104, 85, 72, 231, 70, 92, 70, 87, 70, + 181, 93, 86, 72, 127, 72, 126, 72, 88, 70, + 121, 89, 94, 124, 90, 122, 95, 72, 97, 70, + 98, 70, 96, 100, 59, 59, 99, 72, 70, 72, + 70, 101, 105, 102, 107, 103, 70, 108, 72, 70, + 70, 128, 106, 70, 72, 111, 109, 72, 72, 116, + 110, 72, 112, 306, 70, 130, 70, 70, 70, 113, + 70, 114, 72, 115, 72, 72, 72, 131, 72, 127, + 117, 70, 132, 133, 70, 70, 70, 118, 70, 72, + 134, 70, 72, 72, 72, 70, 72, 70, 140, 72, + + 126, 124, 142, 72, 69, 72, 66, 135, 70, 137, + 138, 143, 141, 136, 147, 70, 72, 139, 144, 70, + 146, 70, 145, 72, 70, 70, 70, 72, 70, 72, + 62, 61, 72, 72, 72, 306, 72, 58, 152, 70, + 70, 70, 58, 148, 150, 149, 151, 72, 72, 72, + 70, 56, 157, 153, 154, 70, 56, 70, 72, 156, + 70, 155, 159, 72, 158, 72, 70, 70, 72, 54, + 70, 70, 54, 70, 72, 72, 70, 161, 72, 72, + 162, 72, 163, 160, 72, 70, 306, 70, 306, 70, + 306, 70, 70, 72, 164, 72, 166, 72, 169, 72, + + 72, 165, 171, 70, 70, 167, 306, 170, 306, 70, + 70, 72, 72, 168, 172, 70, 173, 72, 72, 70, + 70, 70, 176, 72, 306, 174, 175, 72, 72, 72, + 70, 70, 178, 70, 70, 177, 179, 70, 72, 72, + 306, 72, 72, 70, 70, 72, 180, 70, 183, 70, + 184, 72, 72, 70, 306, 72, 306, 72, 189, 70, + 185, 72, 191, 306, 186, 188, 70, 72, 70, 70, + 187, 190, 306, 306, 72, 70, 72, 72, 306, 195, + 196, 70, 70, 72, 70, 192, 193, 306, 194, 72, + 72, 70, 72, 70, 197, 200, 70, 70, 198, 72, + + 70, 72, 306, 70, 72, 72, 306, 202, 72, 70, + 199, 72, 306, 203, 201, 70, 204, 72, 70, 70, + 206, 70, 70, 72, 207, 70, 72, 72, 208, 72, + 72, 205, 70, 72, 211, 306, 212, 209, 70, 70, + 72, 70, 306, 210, 70, 213, 72, 72, 70, 72, + 216, 215, 72, 306, 214, 70, 72, 70, 70, 70, + 70, 219, 306, 72, 218, 72, 72, 72, 72, 70, + 217, 70, 306, 306, 70, 306, 70, 72, 306, 72, + 222, 224, 72, 220, 72, 226, 221, 70, 70, 70, + 70, 223, 70, 70, 70, 72, 72, 72, 72, 225, + + 72, 72, 72, 306, 306, 70, 306, 306, 306, 229, + 306, 230, 232, 72, 228, 233, 227, 70, 234, 70, + 70, 306, 70, 70, 70, 72, 70, 72, 72, 237, + 72, 72, 72, 70, 72, 70, 236, 240, 70, 70, + 70, 72, 242, 72, 70, 235, 72, 72, 72, 241, + 238, 239, 72, 70, 244, 306, 70, 70, 70, 70, + 70, 72, 70, 243, 72, 72, 72, 72, 72, 245, + 72, 70, 70, 70, 70, 70, 306, 306, 306, 72, + 72, 72, 72, 72, 70, 246, 248, 70, 249, 70, + 247, 306, 72, 70, 70, 72, 70, 72, 70, 250, + + 306, 72, 72, 70, 72, 70, 72, 251, 255, 253, + 306, 72, 306, 72, 256, 70, 70, 70, 257, 252, + 254, 306, 70, 72, 72, 72, 70, 70, 70, 259, + 72, 306, 306, 70, 72, 72, 72, 70, 306, 260, + 263, 72, 306, 258, 70, 72, 264, 306, 306, 70, + 265, 70, 72, 70, 70, 261, 262, 72, 70, 72, + 70, 72, 72, 70, 70, 70, 72, 268, 72, 306, + 70, 72, 72, 72, 70, 70, 70, 271, 72, 267, + 306, 306, 72, 72, 72, 70, 269, 272, 270, 275, + 70, 70, 306, 72, 70, 70, 273, 70, 72, 72, + + 274, 70, 72, 72, 70, 72, 70, 276, 70, 72, + 306, 70, 72, 278, 72, 70, 72, 282, 280, 72, + 70, 70, 277, 72, 70, 306, 70, 70, 72, 72, + 279, 70, 72, 281, 72, 72, 306, 70, 70, 72, + 286, 70, 70, 283, 287, 72, 72, 284, 285, 72, + 72, 70, 70, 70, 70, 70, 306, 70, 70, 72, + 72, 72, 72, 72, 288, 72, 72, 70, 70, 306, + 70, 291, 70, 70, 70, 72, 72, 289, 72, 70, + 72, 72, 72, 290, 70, 70, 70, 72, 306, 70, + 306, 292, 72, 72, 72, 293, 295, 72, 296, 70, + + 70, 70, 70, 294, 70, 70, 70, 72, 72, 72, + 72, 70, 72, 72, 72, 297, 70, 70, 70, 72, + 306, 70, 70, 299, 72, 72, 72, 70, 298, 72, + 72, 70, 70, 303, 306, 72, 301, 306, 70, 72, + 72, 70, 300, 70, 302, 304, 72, 70, 306, 72, + 306, 72, 306, 306, 306, 72, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 305, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 60, + + 306, 60, 65, 65, 65, 71, 71, 306, 71, 119, + 119, 119, 119, 306, 119, 119, 119, 119, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 123, 123, 123, + 306, 123, 123, 123, 123, 123, 125, 306, 125, 125, + 125, 125, 125, 125, 125, 129, 306, 306, 306, 306, + 306, 129, 72, 72, 306, 72, 182, 306, 182, 9, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306 } ; -static const flex_int16_t yy_chk[1342] = +static const flex_int16_t yy_chk[1016] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 11, 11, 12, 12, - 25, 32, 25, 28, 28, 33, 38, 35, 49, 32, - 64, 34, 64, 33, 38, 35, 49, 49, 33, 34, - 35, 36, 33, 32, 35, 33, 318, 34, 32, 36, - 268, 34, 37, 201, 34, 37, 39, 34, 33, 37, - - 34, 36, 37, 36, 39, 37, 41, 40, 37, 42, - 39, 43, 134, 36, 41, 40, 54, 42, 39, 43, - 40, 54, 126, 39, 40, 43, 44, 126, 45, 41, - 40, 46, 42, 43, 44, 43, 45, 43, 42, 46, - 43, 45, 59, 59, 46, 47, 133, 46, 132, 48, - 45, 45, 44, 47, 47, 71, 46, 48, 50, 130, - 46, 47, 72, 71, 46, 70, 50, 73, 47, 74, - 75, 48, 65, 48, 50, 73, 76, 74, 75, 73, - 74, 50, 77, 127, 76, 75, 78, 80, 127, 82, - 77, 76, 79, 63, 78, 80, 74, 82, 76, 81, - - 79, 79, 82, 83, 84, 77, 85, 81, 58, 86, - 80, 83, 84, 56, 85, 84, 80, 86, 87, 30, - 81, 81, 26, 24, 84, 23, 87, 88, 81, 83, - 87, 84, 89, 85, 90, 88, 86, 91, 92, 94, - 89, 95, 90, 93, 88, 91, 92, 94, 96, 95, - 97, 93, 9, 95, 98, 8, 96, 90, 97, 99, - 89, 92, 98, 91, 7, 93, 100, 99, 95, 95, - 99, 101, 97, 98, 100, 102, 103, 104, 100, 101, - 105, 107, 99, 102, 103, 104, 106, 6, 105, 107, - 5, 4, 109, 105, 106, 102, 108, 111, 106, 101, - - 109, 109, 110, 112, 108, 111, 3, 116, 0, 107, - 110, 112, 0, 108, 110, 116, 109, 111, 113, 108, - 109, 114, 115, 112, 0, 117, 113, 113, 111, 114, - 115, 112, 115, 117, 116, 117, 118, 119, 120, 121, - 122, 114, 0, 115, 118, 119, 120, 121, 122, 118, - 123, 121, 0, 124, 136, 120, 137, 0, 123, 0, - 122, 124, 136, 123, 137, 120, 139, 123, 138, 140, - 143, 0, 119, 0, 139, 0, 138, 140, 143, 124, - 141, 138, 142, 139, 0, 0, 140, 144, 141, 141, - 142, 145, 142, 142, 147, 144, 143, 0, 146, 145, - - 150, 148, 147, 149, 0, 147, 146, 152, 150, 148, - 0, 149, 149, 151, 144, 152, 154, 153, 145, 146, - 152, 151, 146, 148, 154, 153, 150, 150, 153, 155, - 156, 157, 158, 151, 0, 0, 0, 155, 156, 157, - 158, 159, 155, 158, 154, 160, 155, 161, 163, 159, - 159, 0, 162, 160, 164, 161, 163, 165, 166, 157, - 162, 163, 164, 162, 167, 165, 166, 164, 161, 0, - 165, 168, 167, 166, 0, 169, 170, 167, 171, 168, - 165, 0, 164, 169, 170, 172, 171, 173, 174, 170, - 168, 0, 171, 172, 175, 173, 174, 0, 176, 169, - - 177, 174, 175, 0, 178, 172, 176, 179, 177, 173, - 180, 177, 178, 181, 182, 179, 178, 183, 180, 0, - 176, 181, 182, 184, 185, 183, 0, 179, 0, 186, - 187, 184, 185, 188, 182, 189, 184, 186, 187, 180, - 0, 188, 190, 189, 0, 191, 0, 0, 181, 192, - 190, 193, 183, 191, 190, 186, 194, 192, 195, 193, - 188, 193, 193, 0, 194, 191, 195, 0, 196, 0, - 197, 192, 198, 193, 199, 195, 196, 196, 197, 203, - 198, 194, 199, 200, 204, 205, 0, 203, 206, 207, - 0, 200, 204, 205, 199, 209, 206, 207, 198, 197, - - 208, 211, 200, 209, 210, 203, 204, 205, 208, 211, - 212, 0, 210, 213, 206, 214, 0, 210, 212, 208, - 215, 213, 213, 214, 214, 216, 217, 212, 215, 211, - 220, 0, 218, 216, 217, 219, 0, 221, 220, 217, - 218, 223, 222, 219, 219, 221, 224, 0, 215, 223, - 222, 0, 0, 216, 224, 218, 225, 226, 220, 222, - 224, 227, 228, 229, 225, 226, 230, 231, 232, 227, - 228, 229, 233, 226, 230, 231, 232, 234, 235, 0, - 233, 0, 236, 0, 237, 234, 235, 233, 238, 227, - 236, 229, 237, 231, 232, 239, 238, 240, 230, 241, - - 242, 243, 244, 239, 245, 240, 235, 241, 242, 243, - 244, 246, 245, 247, 251, 248, 249, 245, 250, 246, - 240, 247, 251, 248, 249, 252, 250, 243, 250, 253, - 244, 254, 0, 252, 0, 0, 252, 253, 251, 254, - 247, 248, 253, 249, 255, 0, 257, 256, 258, 260, - 259, 0, 255, 255, 257, 256, 258, 260, 259, 254, - 256, 261, 262, 263, 267, 258, 259, 264, 265, 261, - 262, 263, 267, 0, 266, 264, 265, 262, 260, 0, - 264, 265, 266, 0, 269, 270, 271, 266, 272, 273, - 261, 263, 269, 270, 271, 274, 272, 273, 275, 276, - - 278, 279, 277, 274, 0, 0, 275, 276, 278, 279, - 277, 275, 269, 277, 271, 281, 0, 280, 282, 0, - 0, 272, 0, 281, 273, 280, 282, 276, 278, 0, - 280, 283, 284, 285, 286, 287, 0, 281, 288, 283, - 284, 285, 286, 287, 282, 284, 288, 0, 289, 0, - 290, 291, 292, 293, 294, 285, 289, 283, 290, 291, - 292, 293, 294, 295, 296, 289, 293, 297, 298, 299, - 294, 295, 296, 0, 300, 297, 298, 299, 301, 291, - 298, 297, 300, 303, 0, 302, 301, 304, 0, 0, - 305, 303, 295, 302, 302, 304, 300, 299, 305, 306, - - 307, 0, 308, 311, 309, 310, 301, 306, 307, 303, - 308, 311, 309, 310, 310, 304, 0, 0, 0, 312, - 0, 313, 314, 315, 311, 306, 309, 312, 307, 313, - 314, 315, 312, 316, 317, 314, 319, 320, 321, 322, - 0, 316, 317, 313, 319, 320, 321, 322, 323, 324, - 315, 325, 326, 327, 328, 329, 323, 324, 0, 325, - 326, 327, 328, 329, 330, 0, 322, 331, 333, 0, - 332, 0, 330, 321, 323, 331, 333, 330, 332, 325, - 334, 332, 328, 0, 335, 336, 337, 338, 334, 339, - 340, 333, 335, 336, 337, 338, 341, 339, 340, 342, - - 0, 343, 0, 344, 341, 345, 346, 342, 337, 343, - 335, 344, 343, 345, 346, 347, 340, 0, 339, 349, - 344, 348, 0, 347, 350, 342, 0, 349, 347, 348, - 348, 351, 350, 352, 350, 353, 354, 0, 0, 351, - 355, 352, 356, 353, 354, 349, 352, 357, 355, 358, - 356, 0, 0, 359, 360, 357, 361, 358, 362, 356, - 357, 359, 360, 363, 361, 364, 362, 365, 355, 0, - 366, 363, 0, 364, 367, 365, 0, 364, 366, 368, - 362, 369, 367, 370, 361, 0, 371, 368, 372, 369, - 0, 370, 373, 365, 371, 0, 372, 0, 368, 374, - - 373, 375, 376, 369, 0, 373, 377, 374, 378, 375, - 376, 374, 371, 379, 377, 380, 378, 381, 377, 382, - 383, 379, 0, 380, 375, 381, 384, 382, 383, 385, - 381, 386, 387, 388, 384, 389, 376, 385, 0, 386, - 387, 388, 390, 389, 391, 392, 388, 0, 383, 393, - 390, 0, 391, 392, 394, 385, 395, 393, 391, 384, - 396, 397, 394, 398, 395, 399, 400, 387, 396, 397, - 401, 398, 402, 399, 400, 399, 394, 0, 401, 400, - 402, 0, 0, 0, 398, 0, 0, 0, 0, 0, - 397, 0, 0, 0, 0, 0, 401, 404, 404, 404, - - 404, 404, 404, 404, 404, 404, 405, 405, 405, 405, - 405, 405, 405, 405, 405, 406, 406, 406, 406, 406, - 406, 406, 406, 406, 407, 0, 407, 408, 408, 408, - 409, 409, 0, 409, 410, 410, 410, 410, 0, 410, - 410, 410, 410, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 412, 412, 412, 0, 412, 412, 412, 412, - 412, 413, 0, 413, 413, 413, 413, 413, 413, 413, - 414, 0, 0, 0, 0, 0, 414, 415, 415, 0, - 415, 416, 0, 416, 403, 403, 403, 403, 403, 403, - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - 403 + 1, 1, 1, 1, 1, 11, 11, 12, 12, 25, + 32, 25, 28, 28, 33, 38, 35, 64, 32, 64, + 34, 54, 33, 38, 35, 44, 54, 33, 34, 35, + 36, 33, 32, 44, 39, 266, 34, 32, 36, 120, + 34, 231, 39, 34, 120, 37, 34, 33, 39, 34, + + 36, 44, 36, 37, 181, 41, 39, 42, 37, 40, + 128, 39, 36, 41, 127, 42, 126, 40, 37, 43, + 121, 37, 40, 124, 37, 121, 40, 43, 41, 45, + 42, 46, 40, 43, 59, 59, 42, 45, 72, 46, + 71, 43, 45, 43, 46, 43, 47, 46, 71, 48, + 49, 70, 45, 73, 47, 47, 46, 48, 49, 49, + 46, 73, 47, 65, 50, 73, 74, 75, 76, 47, + 77, 48, 50, 48, 74, 75, 76, 74, 77, 63, + 50, 78, 75, 76, 79, 81, 82, 50, 80, 78, + 78, 83, 79, 81, 82, 84, 80, 86, 81, 83, + + 58, 56, 83, 84, 30, 86, 26, 79, 85, 80, + 80, 83, 82, 79, 86, 87, 85, 80, 83, 88, + 85, 89, 84, 87, 90, 91, 92, 88, 93, 89, + 24, 23, 90, 91, 92, 9, 93, 8, 92, 94, + 95, 96, 7, 87, 89, 88, 90, 94, 95, 96, + 97, 6, 96, 92, 92, 98, 5, 99, 97, 95, + 100, 94, 97, 98, 96, 99, 101, 102, 100, 4, + 103, 104, 3, 105, 101, 102, 106, 99, 103, 104, + 102, 105, 103, 98, 106, 107, 0, 109, 0, 108, + 0, 113, 110, 107, 104, 109, 106, 108, 108, 113, + + 110, 105, 110, 112, 111, 107, 0, 109, 0, 114, + 115, 112, 111, 107, 111, 116, 112, 114, 115, 117, + 118, 130, 115, 116, 0, 113, 114, 117, 118, 130, + 131, 132, 117, 133, 134, 116, 117, 135, 131, 132, + 0, 133, 134, 136, 137, 135, 118, 138, 132, 139, + 133, 136, 137, 140, 0, 138, 0, 139, 138, 141, + 134, 140, 140, 0, 135, 137, 143, 141, 142, 144, + 136, 139, 0, 0, 143, 146, 142, 144, 0, 143, + 144, 145, 147, 146, 148, 141, 141, 0, 142, 145, + 147, 149, 148, 150, 145, 148, 151, 154, 145, 149, + + 152, 150, 0, 153, 151, 154, 0, 151, 152, 155, + 147, 153, 0, 152, 150, 156, 153, 155, 157, 158, + 154, 159, 160, 156, 155, 161, 157, 158, 156, 159, + 160, 153, 162, 161, 159, 0, 160, 157, 163, 164, + 162, 165, 0, 158, 166, 161, 163, 164, 167, 165, + 164, 163, 166, 0, 162, 168, 167, 169, 170, 171, + 172, 167, 0, 168, 166, 169, 170, 171, 172, 173, + 165, 174, 0, 0, 175, 0, 176, 173, 0, 174, + 172, 174, 175, 169, 176, 176, 171, 177, 178, 179, + 183, 173, 180, 184, 185, 177, 178, 179, 183, 175, + + 180, 184, 185, 0, 0, 186, 0, 0, 0, 179, + 0, 180, 183, 186, 178, 184, 177, 187, 186, 188, + 189, 0, 190, 191, 192, 187, 193, 188, 189, 189, + 190, 191, 192, 194, 193, 195, 188, 192, 196, 197, + 198, 194, 194, 195, 199, 187, 196, 197, 198, 193, + 190, 191, 199, 200, 198, 0, 201, 202, 203, 206, + 204, 200, 205, 195, 201, 202, 203, 206, 204, 200, + 205, 207, 208, 209, 210, 211, 0, 0, 0, 207, + 208, 209, 210, 211, 212, 202, 204, 213, 205, 214, + 203, 0, 212, 215, 217, 213, 216, 214, 218, 207, + + 0, 215, 217, 219, 216, 220, 218, 212, 218, 216, + 0, 219, 0, 220, 219, 221, 222, 223, 220, 215, + 217, 0, 224, 221, 222, 223, 225, 227, 226, 222, + 224, 0, 0, 228, 225, 227, 226, 229, 0, 224, + 227, 228, 0, 221, 230, 229, 228, 0, 0, 232, + 229, 233, 230, 234, 235, 225, 226, 232, 236, 233, + 237, 234, 235, 238, 239, 240, 236, 235, 237, 0, + 241, 238, 239, 240, 242, 244, 243, 239, 241, 233, + 0, 0, 242, 244, 243, 245, 236, 240, 237, 243, + 246, 247, 0, 245, 248, 249, 241, 250, 246, 247, + + 242, 251, 248, 249, 252, 250, 253, 246, 255, 251, + 0, 254, 252, 250, 253, 256, 255, 255, 253, 254, + 257, 258, 248, 256, 259, 0, 260, 261, 257, 258, + 251, 262, 259, 254, 260, 261, 0, 263, 264, 262, + 261, 265, 267, 256, 262, 263, 264, 258, 260, 265, + 267, 268, 269, 270, 271, 272, 0, 273, 274, 268, + 269, 270, 271, 272, 263, 273, 274, 275, 276, 0, + 277, 274, 278, 279, 280, 275, 276, 268, 277, 281, + 278, 279, 280, 272, 283, 282, 284, 281, 0, 285, + 0, 276, 283, 282, 284, 279, 282, 285, 285, 286, + + 287, 288, 289, 280, 290, 291, 292, 286, 287, 288, + 289, 293, 290, 291, 292, 289, 294, 295, 296, 293, + 0, 297, 298, 293, 294, 295, 296, 299, 292, 297, + 298, 301, 300, 297, 0, 299, 295, 0, 302, 301, + 300, 303, 294, 304, 296, 300, 302, 305, 0, 303, + 0, 304, 0, 0, 0, 305, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 302, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 308, 308, 308, 308, 308, 308, 308, 308, 308, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 310, + + 0, 310, 311, 311, 311, 312, 312, 0, 312, 313, + 313, 313, 313, 0, 313, 313, 313, 313, 314, 314, + 314, 314, 314, 314, 314, 314, 314, 315, 315, 315, + 0, 315, 315, 315, 315, 315, 316, 0, 316, 316, + 316, 316, 316, 316, 316, 317, 0, 0, 0, 0, + 0, 317, 318, 318, 0, 318, 319, 0, 319, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306 } ; static yy_state_type yy_last_accepting_state; @@ -961,9 +856,9 @@ string_append( stringbuf_len += len; } -#line 964 "lexyy.cc" +#line 859 "lexyy.cc" -#line 966 "lexyy.cc" +#line 861 "lexyy.cc" #define INITIAL 0 #define comment 1 @@ -1184,7 +1079,7 @@ YY_DECL #line 112 "pars0lex.l" -#line 1187 "lexyy.cc" +#line 1082 "lexyy.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -1211,13 +1106,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 404 ) + if ( yy_current_state >= 307 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 403 ); + while ( yy_current_state != 306 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -1436,554 +1331,407 @@ case 18: YY_RULE_SETUP #line 252 "pars0lex.l" { - return(PARS_OUT_TOKEN); + return(PARS_INT_TOKEN); } YY_BREAK case 19: YY_RULE_SETUP #line 256 "pars0lex.l" { - return(PARS_BINARY_TOKEN); + return(PARS_CHAR_TOKEN); } YY_BREAK case 20: YY_RULE_SETUP #line 260 "pars0lex.l" { - return(PARS_BLOB_TOKEN); + return(PARS_IS_TOKEN); } YY_BREAK case 21: YY_RULE_SETUP #line 264 "pars0lex.l" { - return(PARS_INT_TOKEN); + return(PARS_BEGIN_TOKEN); } YY_BREAK case 22: YY_RULE_SETUP #line 268 "pars0lex.l" { - return(PARS_INT_TOKEN); + return(PARS_END_TOKEN); } YY_BREAK case 23: YY_RULE_SETUP #line 272 "pars0lex.l" { - return(PARS_FLOAT_TOKEN); + return(PARS_IF_TOKEN); } YY_BREAK case 24: YY_RULE_SETUP #line 276 "pars0lex.l" { - return(PARS_CHAR_TOKEN); + return(PARS_THEN_TOKEN); } YY_BREAK case 25: YY_RULE_SETUP #line 280 "pars0lex.l" { - return(PARS_IS_TOKEN); + return(PARS_ELSE_TOKEN); } YY_BREAK case 26: YY_RULE_SETUP #line 284 "pars0lex.l" { - return(PARS_BEGIN_TOKEN); + return(PARS_ELSIF_TOKEN); } YY_BREAK case 27: YY_RULE_SETUP #line 288 "pars0lex.l" { - return(PARS_END_TOKEN); + return(PARS_LOOP_TOKEN); } YY_BREAK case 28: YY_RULE_SETUP #line 292 "pars0lex.l" { - return(PARS_IF_TOKEN); + return(PARS_WHILE_TOKEN); } YY_BREAK case 29: YY_RULE_SETUP #line 296 "pars0lex.l" { - return(PARS_THEN_TOKEN); + return(PARS_RETURN_TOKEN); } YY_BREAK case 30: YY_RULE_SETUP #line 300 "pars0lex.l" { - return(PARS_ELSE_TOKEN); + return(PARS_SELECT_TOKEN); } YY_BREAK case 31: YY_RULE_SETUP #line 304 "pars0lex.l" { - return(PARS_ELSIF_TOKEN); + return(PARS_COUNT_TOKEN); } YY_BREAK case 32: YY_RULE_SETUP #line 308 "pars0lex.l" { - return(PARS_LOOP_TOKEN); + return(PARS_FROM_TOKEN); } YY_BREAK case 33: YY_RULE_SETUP #line 312 "pars0lex.l" { - return(PARS_WHILE_TOKEN); + return(PARS_WHERE_TOKEN); } YY_BREAK case 34: YY_RULE_SETUP #line 316 "pars0lex.l" { - return(PARS_RETURN_TOKEN); + return(PARS_FOR_TOKEN); } YY_BREAK case 35: YY_RULE_SETUP #line 320 "pars0lex.l" { - return(PARS_SELECT_TOKEN); + return(PARS_ORDER_TOKEN); } YY_BREAK case 36: YY_RULE_SETUP #line 324 "pars0lex.l" { - return(PARS_SUM_TOKEN); + return(PARS_BY_TOKEN); } YY_BREAK case 37: YY_RULE_SETUP #line 328 "pars0lex.l" { - return(PARS_COUNT_TOKEN); + return(PARS_ASC_TOKEN); } YY_BREAK case 38: YY_RULE_SETUP #line 332 "pars0lex.l" { - return(PARS_DISTINCT_TOKEN); + return(PARS_DESC_TOKEN); } YY_BREAK case 39: YY_RULE_SETUP #line 336 "pars0lex.l" { - return(PARS_FROM_TOKEN); + return(PARS_INSERT_TOKEN); } YY_BREAK case 40: YY_RULE_SETUP #line 340 "pars0lex.l" { - return(PARS_WHERE_TOKEN); + return(PARS_INTO_TOKEN); } YY_BREAK case 41: YY_RULE_SETUP #line 344 "pars0lex.l" { - return(PARS_FOR_TOKEN); + return(PARS_VALUES_TOKEN); } YY_BREAK case 42: YY_RULE_SETUP #line 348 "pars0lex.l" { - return(PARS_READ_TOKEN); + return(PARS_UPDATE_TOKEN); } YY_BREAK case 43: YY_RULE_SETUP #line 352 "pars0lex.l" { - return(PARS_ORDER_TOKEN); + return(PARS_SET_TOKEN); } YY_BREAK case 44: YY_RULE_SETUP #line 356 "pars0lex.l" { - return(PARS_BY_TOKEN); + return(PARS_DELETE_TOKEN); } YY_BREAK case 45: YY_RULE_SETUP #line 360 "pars0lex.l" { - return(PARS_ASC_TOKEN); + return(PARS_CURRENT_TOKEN); } YY_BREAK case 46: YY_RULE_SETUP #line 364 "pars0lex.l" { - return(PARS_DESC_TOKEN); + return(PARS_OF_TOKEN); } YY_BREAK case 47: YY_RULE_SETUP #line 368 "pars0lex.l" { - return(PARS_INSERT_TOKEN); + return(PARS_CREATE_TOKEN); } YY_BREAK case 48: YY_RULE_SETUP #line 372 "pars0lex.l" { - return(PARS_INTO_TOKEN); + return(PARS_TABLE_TOKEN); } YY_BREAK case 49: YY_RULE_SETUP #line 376 "pars0lex.l" { - return(PARS_VALUES_TOKEN); + return(PARS_INDEX_TOKEN); } YY_BREAK case 50: YY_RULE_SETUP #line 380 "pars0lex.l" { - return(PARS_UPDATE_TOKEN); + return(PARS_UNIQUE_TOKEN); } YY_BREAK case 51: YY_RULE_SETUP #line 384 "pars0lex.l" { - return(PARS_SET_TOKEN); + return(PARS_CLUSTERED_TOKEN); } YY_BREAK case 52: YY_RULE_SETUP #line 388 "pars0lex.l" { - return(PARS_DELETE_TOKEN); + return(PARS_ON_TOKEN); } YY_BREAK case 53: YY_RULE_SETUP #line 392 "pars0lex.l" { - return(PARS_CURRENT_TOKEN); + return(PARS_DECLARE_TOKEN); } YY_BREAK case 54: YY_RULE_SETUP #line 396 "pars0lex.l" { - return(PARS_OF_TOKEN); + return(PARS_CURSOR_TOKEN); } YY_BREAK case 55: YY_RULE_SETUP #line 400 "pars0lex.l" { - return(PARS_CREATE_TOKEN); + return(PARS_OPEN_TOKEN); } YY_BREAK case 56: YY_RULE_SETUP #line 404 "pars0lex.l" { - return(PARS_TABLE_TOKEN); + return(PARS_FETCH_TOKEN); } YY_BREAK case 57: YY_RULE_SETUP #line 408 "pars0lex.l" { - return(PARS_COMPACT_TOKEN); + return(PARS_CLOSE_TOKEN); } YY_BREAK case 58: YY_RULE_SETUP #line 412 "pars0lex.l" { - return(PARS_BLOCK_SIZE_TOKEN); + return(PARS_NOTFOUND_TOKEN); } YY_BREAK case 59: YY_RULE_SETUP #line 416 "pars0lex.l" { - return(PARS_INDEX_TOKEN); + return(PARS_TO_BINARY_TOKEN); } YY_BREAK case 60: YY_RULE_SETUP #line 420 "pars0lex.l" { - return(PARS_UNIQUE_TOKEN); + return(PARS_SUBSTR_TOKEN); } YY_BREAK case 61: YY_RULE_SETUP #line 424 "pars0lex.l" { - return(PARS_CLUSTERED_TOKEN); + return(PARS_CONCAT_TOKEN); } YY_BREAK case 62: YY_RULE_SETUP #line 428 "pars0lex.l" { - return(PARS_ON_TOKEN); + return(PARS_INSTR_TOKEN); } YY_BREAK case 63: YY_RULE_SETUP #line 432 "pars0lex.l" { - return(PARS_DECLARE_TOKEN); + return(PARS_LENGTH_TOKEN); } YY_BREAK case 64: YY_RULE_SETUP #line 436 "pars0lex.l" { - return(PARS_CURSOR_TOKEN); + return(PARS_COMMIT_TOKEN); } YY_BREAK case 65: YY_RULE_SETUP #line 440 "pars0lex.l" { - return(PARS_OPEN_TOKEN); + return(PARS_ROLLBACK_TOKEN); } YY_BREAK case 66: YY_RULE_SETUP #line 444 "pars0lex.l" { - return(PARS_FETCH_TOKEN); + return(PARS_WORK_TOKEN); } YY_BREAK case 67: YY_RULE_SETUP #line 448 "pars0lex.l" { - return(PARS_CLOSE_TOKEN); + return(PARS_EXIT_TOKEN); } YY_BREAK case 68: YY_RULE_SETUP #line 452 "pars0lex.l" { - return(PARS_NOTFOUND_TOKEN); + return(PARS_FUNCTION_TOKEN); } YY_BREAK case 69: YY_RULE_SETUP #line 456 "pars0lex.l" { - return(PARS_TO_CHAR_TOKEN); + return(PARS_LOCK_TOKEN); } YY_BREAK case 70: YY_RULE_SETUP #line 460 "pars0lex.l" { - return(PARS_TO_NUMBER_TOKEN); + return(PARS_SHARE_TOKEN); } YY_BREAK case 71: YY_RULE_SETUP #line 464 "pars0lex.l" { - return(PARS_TO_BINARY_TOKEN); + return(PARS_MODE_TOKEN); } YY_BREAK case 72: YY_RULE_SETUP #line 468 "pars0lex.l" { - return(PARS_BINARY_TO_NUMBER_TOKEN); + return(PARS_LIKE_TOKEN); } YY_BREAK case 73: YY_RULE_SETUP #line 472 "pars0lex.l" { - return(PARS_SUBSTR_TOKEN); + return(PARS_BIGINT_TOKEN); } YY_BREAK case 74: YY_RULE_SETUP #line 476 "pars0lex.l" { - return(PARS_REPLSTR_TOKEN); -} - YY_BREAK -case 75: -YY_RULE_SETUP -#line 480 "pars0lex.l" -{ - return(PARS_CONCAT_TOKEN); -} - YY_BREAK -case 76: -YY_RULE_SETUP -#line 484 "pars0lex.l" -{ - return(PARS_INSTR_TOKEN); -} - YY_BREAK -case 77: -YY_RULE_SETUP -#line 488 "pars0lex.l" -{ - return(PARS_LENGTH_TOKEN); -} - YY_BREAK -case 78: -YY_RULE_SETUP -#line 492 "pars0lex.l" -{ - return(PARS_SYSDATE_TOKEN); -} - YY_BREAK -case 79: -YY_RULE_SETUP -#line 496 "pars0lex.l" -{ - return(PARS_PRINTF_TOKEN); -} - YY_BREAK -case 80: -YY_RULE_SETUP -#line 500 "pars0lex.l" -{ - return(PARS_ASSERT_TOKEN); -} - YY_BREAK -case 81: -YY_RULE_SETUP -#line 504 "pars0lex.l" -{ - return(PARS_RND_TOKEN); -} - YY_BREAK -case 82: -YY_RULE_SETUP -#line 508 "pars0lex.l" -{ - return(PARS_RND_STR_TOKEN); -} - YY_BREAK -case 83: -YY_RULE_SETUP -#line 512 "pars0lex.l" -{ - return(PARS_ROW_PRINTF_TOKEN); -} - YY_BREAK -case 84: -YY_RULE_SETUP -#line 516 "pars0lex.l" -{ - return(PARS_COMMIT_TOKEN); -} - YY_BREAK -case 85: -YY_RULE_SETUP -#line 520 "pars0lex.l" -{ - return(PARS_ROLLBACK_TOKEN); -} - YY_BREAK -case 86: -YY_RULE_SETUP -#line 524 "pars0lex.l" -{ - return(PARS_WORK_TOKEN); -} - YY_BREAK -case 87: -YY_RULE_SETUP -#line 528 "pars0lex.l" -{ - return(PARS_UNSIGNED_TOKEN); -} - YY_BREAK -case 88: -YY_RULE_SETUP -#line 532 "pars0lex.l" -{ - return(PARS_EXIT_TOKEN); -} - YY_BREAK -case 89: -YY_RULE_SETUP -#line 536 "pars0lex.l" -{ - return(PARS_FUNCTION_TOKEN); -} - YY_BREAK -case 90: -YY_RULE_SETUP -#line 540 "pars0lex.l" -{ - return(PARS_LOCK_TOKEN); -} - YY_BREAK -case 91: -YY_RULE_SETUP -#line 544 "pars0lex.l" -{ - return(PARS_SHARE_TOKEN); -} - YY_BREAK -case 92: -YY_RULE_SETUP -#line 548 "pars0lex.l" -{ - return(PARS_MODE_TOKEN); -} - YY_BREAK -case 93: -YY_RULE_SETUP -#line 552 "pars0lex.l" -{ - return(PARS_LIKE_TOKEN); -} - YY_BREAK -case 94: -YY_RULE_SETUP -#line 556 "pars0lex.l" -{ - return(PARS_BIGINT_TOKEN); -} - YY_BREAK -case 95: -YY_RULE_SETUP -#line 560 "pars0lex.l" -{ yylval = sym_tab_add_id(pars_sym_tab_global, (byte*) yytext, ut_strlen(yytext)); return(PARS_ID_TOKEN); } YY_BREAK -case 96: +case 75: YY_RULE_SETUP -#line 567 "pars0lex.l" +#line 483 "pars0lex.l" { yylval = sym_tab_add_id(pars_sym_tab_global, (byte*) yytext, @@ -1991,192 +1739,192 @@ YY_RULE_SETUP return(PARS_TABLE_NAME_TOKEN); } YY_BREAK -case 97: +case 76: YY_RULE_SETUP -#line 574 "pars0lex.l" +#line 490 "pars0lex.l" { return(PARS_DDOT_TOKEN); } YY_BREAK -case 98: +case 77: YY_RULE_SETUP -#line 578 "pars0lex.l" +#line 494 "pars0lex.l" { return(PARS_ASSIGN_TOKEN); } YY_BREAK -case 99: +case 78: YY_RULE_SETUP -#line 582 "pars0lex.l" +#line 498 "pars0lex.l" { return(PARS_LE_TOKEN); } YY_BREAK -case 100: +case 79: YY_RULE_SETUP -#line 586 "pars0lex.l" +#line 502 "pars0lex.l" { return(PARS_GE_TOKEN); } YY_BREAK -case 101: +case 80: YY_RULE_SETUP -#line 590 "pars0lex.l" +#line 506 "pars0lex.l" { return(PARS_NE_TOKEN); } YY_BREAK -case 102: +case 81: YY_RULE_SETUP -#line 594 "pars0lex.l" +#line 510 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 103: +case 82: YY_RULE_SETUP -#line 599 "pars0lex.l" +#line 515 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 104: +case 83: YY_RULE_SETUP -#line 604 "pars0lex.l" +#line 520 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 105: +case 84: YY_RULE_SETUP -#line 609 "pars0lex.l" +#line 525 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 106: +case 85: YY_RULE_SETUP -#line 614 "pars0lex.l" +#line 530 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 107: +case 86: YY_RULE_SETUP -#line 619 "pars0lex.l" +#line 535 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 108: +case 87: YY_RULE_SETUP -#line 624 "pars0lex.l" +#line 540 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 109: +case 88: YY_RULE_SETUP -#line 629 "pars0lex.l" +#line 545 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 110: +case 89: YY_RULE_SETUP -#line 634 "pars0lex.l" +#line 550 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 111: +case 90: YY_RULE_SETUP -#line 639 "pars0lex.l" +#line 555 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 112: +case 91: YY_RULE_SETUP -#line 644 "pars0lex.l" +#line 560 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 113: +case 92: YY_RULE_SETUP -#line 649 "pars0lex.l" +#line 565 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 114: +case 93: YY_RULE_SETUP -#line 654 "pars0lex.l" +#line 570 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 115: +case 94: YY_RULE_SETUP -#line 659 "pars0lex.l" +#line 575 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 116: +case 95: YY_RULE_SETUP -#line 664 "pars0lex.l" +#line 580 "pars0lex.l" { return((int)(*yytext)); } YY_BREAK -case 117: +case 96: YY_RULE_SETUP -#line 669 "pars0lex.l" +#line 585 "pars0lex.l" BEGIN(comment); /* eat up comment */ YY_BREAK -case 118: -/* rule 118 can match eol */ +case 97: +/* rule 97 can match eol */ YY_RULE_SETUP -#line 671 "pars0lex.l" +#line 587 "pars0lex.l" YY_BREAK -case 119: -/* rule 119 can match eol */ +case 98: +/* rule 98 can match eol */ YY_RULE_SETUP -#line 672 "pars0lex.l" +#line 588 "pars0lex.l" YY_BREAK -case 120: +case 99: YY_RULE_SETUP -#line 673 "pars0lex.l" +#line 589 "pars0lex.l" BEGIN(INITIAL); YY_BREAK -case 121: -/* rule 121 can match eol */ +case 100: +/* rule 100 can match eol */ YY_RULE_SETUP -#line 675 "pars0lex.l" +#line 591 "pars0lex.l" /* eat up whitespace */ YY_BREAK -case 122: +case 101: YY_RULE_SETUP -#line 678 "pars0lex.l" +#line 594 "pars0lex.l" { fprintf(stderr,"Unrecognized character: %02x\n", *yytext); @@ -2186,12 +1934,12 @@ YY_RULE_SETUP return(0); } YY_BREAK -case 123: +case 102: YY_RULE_SETUP -#line 687 "pars0lex.l" +#line 603 "pars0lex.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 2194 "lexyy.cc" +#line 1942 "lexyy.cc" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(comment): case YY_STATE_EOF(quoted): @@ -2492,7 +2240,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 404 ) + if ( yy_current_state >= 307 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -2520,11 +2268,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 404 ) + if ( yy_current_state >= 307 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 403); + yy_is_jam = (yy_current_state == 306); return yy_is_jam ? 0 : yy_current_state; } @@ -3077,7 +2825,7 @@ static void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 687 "pars0lex.l" +#line 603 "pars0lex.l" /********************************************************************** diff --git a/storage/innobase/pars/pars0grm.cc b/storage/innobase/pars/pars0grm.cc index a0a09771106..7e10a783310 100644 --- a/storage/innobase/pars/pars0grm.cc +++ b/storage/innobase/pars/pars0grm.cc @@ -1,8 +1,9 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ +/* A Bison parser, made by GNU Bison 3.4.2. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, + Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,11 +41,14 @@ define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ +/* Undocumented macros, especially those whose name start with YY_, + are private implementation details. Do not rely on them. */ + /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "3.0.4" +#define YYBISON_VERSION "3.4.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -61,8 +65,8 @@ -/* Copy the first part of user declarations. */ -#line 29 "pars0grm.y" /* yacc.c:339 */ +/* First part of user prologue. */ +#line 29 "pars0grm.y" /* The value of the semantic attribute is a pointer to a query tree node que_node_t */ @@ -81,13 +85,17 @@ que_node_t */ int yylex(void); -#line 85 "pars0grm.cc" /* yacc.c:339 */ +#line 89 "pars0grm.cc" # ifndef YY_NULLPTR -# if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULLPTR nullptr +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif # else -# define YY_NULLPTR 0 +# define YY_NULLPTR ((void*)0) # endif # endif @@ -99,8 +107,8 @@ yylex(void); # define YYERROR_VERBOSE 0 #endif -/* In a future release of Bison, this section will be replaced - by #include "pars0grm.tab.h". */ +/* Use api.header.include to #include this header + instead of duplicating it here. */ #ifndef YY_YY_PARS0GRM_TAB_H_INCLUDED # define YY_YY_PARS0GRM_TAB_H_INCLUDED /* Debug traces. */ @@ -129,91 +137,71 @@ extern int yydebug; PARS_NE_TOKEN = 268, PARS_PROCEDURE_TOKEN = 269, PARS_IN_TOKEN = 270, - PARS_OUT_TOKEN = 271, - PARS_BINARY_TOKEN = 272, - PARS_BLOB_TOKEN = 273, - PARS_INT_TOKEN = 274, - PARS_FLOAT_TOKEN = 275, - PARS_CHAR_TOKEN = 276, - PARS_IS_TOKEN = 277, - PARS_BEGIN_TOKEN = 278, - PARS_END_TOKEN = 279, - PARS_IF_TOKEN = 280, - PARS_THEN_TOKEN = 281, - PARS_ELSE_TOKEN = 282, - PARS_ELSIF_TOKEN = 283, - PARS_LOOP_TOKEN = 284, - PARS_WHILE_TOKEN = 285, - PARS_RETURN_TOKEN = 286, - PARS_SELECT_TOKEN = 287, - PARS_SUM_TOKEN = 288, - PARS_COUNT_TOKEN = 289, - PARS_DISTINCT_TOKEN = 290, - PARS_FROM_TOKEN = 291, - PARS_WHERE_TOKEN = 292, - PARS_FOR_TOKEN = 293, - PARS_DDOT_TOKEN = 294, - PARS_READ_TOKEN = 295, - PARS_ORDER_TOKEN = 296, - PARS_BY_TOKEN = 297, - PARS_ASC_TOKEN = 298, - PARS_DESC_TOKEN = 299, - PARS_INSERT_TOKEN = 300, - PARS_INTO_TOKEN = 301, - PARS_VALUES_TOKEN = 302, - PARS_UPDATE_TOKEN = 303, - PARS_SET_TOKEN = 304, - PARS_DELETE_TOKEN = 305, - PARS_CURRENT_TOKEN = 306, - PARS_OF_TOKEN = 307, - PARS_CREATE_TOKEN = 308, - PARS_TABLE_TOKEN = 309, - PARS_INDEX_TOKEN = 310, - PARS_UNIQUE_TOKEN = 311, - PARS_CLUSTERED_TOKEN = 312, - PARS_ON_TOKEN = 313, - PARS_ASSIGN_TOKEN = 314, - PARS_DECLARE_TOKEN = 315, - PARS_CURSOR_TOKEN = 316, - PARS_SQL_TOKEN = 317, - PARS_OPEN_TOKEN = 318, - PARS_FETCH_TOKEN = 319, - PARS_CLOSE_TOKEN = 320, - PARS_NOTFOUND_TOKEN = 321, - PARS_TO_CHAR_TOKEN = 322, - PARS_TO_NUMBER_TOKEN = 323, - PARS_TO_BINARY_TOKEN = 324, - PARS_BINARY_TO_NUMBER_TOKEN = 325, - PARS_SUBSTR_TOKEN = 326, - PARS_REPLSTR_TOKEN = 327, - PARS_CONCAT_TOKEN = 328, - PARS_INSTR_TOKEN = 329, - PARS_LENGTH_TOKEN = 330, - PARS_SYSDATE_TOKEN = 331, - PARS_PRINTF_TOKEN = 332, - PARS_ASSERT_TOKEN = 333, - PARS_RND_TOKEN = 334, - PARS_RND_STR_TOKEN = 335, - PARS_ROW_PRINTF_TOKEN = 336, - PARS_COMMIT_TOKEN = 337, - PARS_ROLLBACK_TOKEN = 338, - PARS_WORK_TOKEN = 339, - PARS_UNSIGNED_TOKEN = 340, - PARS_EXIT_TOKEN = 341, - PARS_FUNCTION_TOKEN = 342, - PARS_LOCK_TOKEN = 343, - PARS_SHARE_TOKEN = 344, - PARS_MODE_TOKEN = 345, - PARS_LIKE_TOKEN = 346, - PARS_LIKE_TOKEN_EXACT = 347, - PARS_LIKE_TOKEN_PREFIX = 348, - PARS_LIKE_TOKEN_SUFFIX = 349, - PARS_LIKE_TOKEN_SUBSTR = 350, - PARS_TABLE_NAME_TOKEN = 351, - PARS_COMPACT_TOKEN = 352, - PARS_BLOCK_SIZE_TOKEN = 353, - PARS_BIGINT_TOKEN = 354, - NEG = 355 + PARS_INT_TOKEN = 271, + PARS_CHAR_TOKEN = 272, + PARS_IS_TOKEN = 273, + PARS_BEGIN_TOKEN = 274, + PARS_END_TOKEN = 275, + PARS_IF_TOKEN = 276, + PARS_THEN_TOKEN = 277, + PARS_ELSE_TOKEN = 278, + PARS_ELSIF_TOKEN = 279, + PARS_LOOP_TOKEN = 280, + PARS_WHILE_TOKEN = 281, + PARS_RETURN_TOKEN = 282, + PARS_SELECT_TOKEN = 283, + PARS_COUNT_TOKEN = 284, + PARS_FROM_TOKEN = 285, + PARS_WHERE_TOKEN = 286, + PARS_FOR_TOKEN = 287, + PARS_DDOT_TOKEN = 288, + PARS_ORDER_TOKEN = 289, + PARS_BY_TOKEN = 290, + PARS_ASC_TOKEN = 291, + PARS_DESC_TOKEN = 292, + PARS_INSERT_TOKEN = 293, + PARS_INTO_TOKEN = 294, + PARS_VALUES_TOKEN = 295, + PARS_UPDATE_TOKEN = 296, + PARS_SET_TOKEN = 297, + PARS_DELETE_TOKEN = 298, + PARS_CURRENT_TOKEN = 299, + PARS_OF_TOKEN = 300, + PARS_CREATE_TOKEN = 301, + PARS_TABLE_TOKEN = 302, + PARS_INDEX_TOKEN = 303, + PARS_UNIQUE_TOKEN = 304, + PARS_CLUSTERED_TOKEN = 305, + PARS_ON_TOKEN = 306, + PARS_ASSIGN_TOKEN = 307, + PARS_DECLARE_TOKEN = 308, + PARS_CURSOR_TOKEN = 309, + PARS_SQL_TOKEN = 310, + PARS_OPEN_TOKEN = 311, + PARS_FETCH_TOKEN = 312, + PARS_CLOSE_TOKEN = 313, + PARS_NOTFOUND_TOKEN = 314, + PARS_TO_BINARY_TOKEN = 315, + PARS_SUBSTR_TOKEN = 316, + PARS_CONCAT_TOKEN = 317, + PARS_INSTR_TOKEN = 318, + PARS_LENGTH_TOKEN = 319, + PARS_COMMIT_TOKEN = 320, + PARS_ROLLBACK_TOKEN = 321, + PARS_WORK_TOKEN = 322, + PARS_EXIT_TOKEN = 323, + PARS_FUNCTION_TOKEN = 324, + PARS_LOCK_TOKEN = 325, + PARS_SHARE_TOKEN = 326, + PARS_MODE_TOKEN = 327, + PARS_LIKE_TOKEN = 328, + PARS_LIKE_TOKEN_EXACT = 329, + PARS_LIKE_TOKEN_PREFIX = 330, + PARS_LIKE_TOKEN_SUFFIX = 331, + PARS_LIKE_TOKEN_SUBSTR = 332, + PARS_TABLE_NAME_TOKEN = 333, + PARS_BIGINT_TOKEN = 334, + NEG = 335 }; #endif @@ -231,9 +219,7 @@ int yyparse (void); #endif /* !YY_YY_PARS0GRM_TAB_H_INCLUDED */ -/* Copy the second part of user declarations. */ -#line 237 "pars0grm.cc" /* yacc.c:358 */ #ifdef short # undef short @@ -254,13 +240,13 @@ typedef signed char yytype_int8; #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else -typedef unsigned short int yytype_uint16; +typedef unsigned short yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else -typedef short int yytype_int16; +typedef short yytype_int16; #endif #ifndef YYSIZE_T @@ -272,7 +258,7 @@ typedef short int yytype_int16; # include <stddef.h> /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else -# define YYSIZE_T unsigned int +# define YYSIZE_T unsigned # endif #endif @@ -308,15 +294,6 @@ typedef short int yytype_int16; # define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) #endif -#if !defined _Noreturn \ - && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) -# if defined _MSC_VER && 1200 <= _MSC_VER -# define _Noreturn __declspec (noreturn) -# else -# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) -# endif -#endif - /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) @@ -324,7 +301,7 @@ typedef short int yytype_int16; # define YYUSE(E) /* empty */ #endif -#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ @@ -344,6 +321,8 @@ typedef short int yytype_int16; #endif +#define YY_ASSERT(E) ((void) (0 && (E))) + #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ @@ -475,42 +454,42 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 5 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 780 +#define YYLAST 603 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 116 +#define YYNTOKENS 96 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 72 +#define YYNNTS 64 /* YYNRULES -- Number of rules. */ -#define YYNRULES 178 +#define YYNRULES 150 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 345 +#define YYNSTATES 300 -/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned - by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 355 +#define YYMAXUTOK 335 +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ #define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, without out-of-bounds checking. */ + as returned by yylex. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 108, 2, 2, - 110, 111, 105, 104, 113, 103, 2, 106, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 109, - 101, 100, 102, 112, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 88, 2, 2, + 90, 91, 85, 84, 93, 83, 2, 86, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 89, + 81, 80, 82, 92, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 114, 2, 115, 2, 2, 2, 2, + 2, 2, 2, 94, 2, 95, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -531,33 +510,29 @@ static const yytype_uint8 yytranslate[] = 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 107 + 75, 76, 77, 78, 79, 87 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 160, 160, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 188, 189, 194, 195, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 221, 226, 227, 228, 229, 231, 232, 233, 234, - 235, 236, 237, 240, 242, 243, 247, 253, 258, 259, - 260, 264, 268, 269, 274, 275, 276, 281, 282, 283, - 287, 288, 293, 299, 306, 307, 308, 313, 315, 318, - 322, 323, 327, 328, 333, 334, 339, 340, 341, 345, - 346, 353, 368, 373, 376, 384, 390, 391, 396, 402, - 411, 419, 427, 434, 442, 450, 456, 463, 469, 470, - 475, 476, 478, 482, 489, 495, 505, 509, 513, 520, - 527, 531, 539, 548, 549, 554, 555, 560, 561, 567, - 568, 574, 575, 580, 581, 586, 597, 598, 603, 604, - 608, 609, 613, 627, 628, 632, 637, 642, 643, 644, - 645, 646, 650, 655, 663, 664, 665, 670, 676, 678, - 679, 683, 691, 697, 698, 701, 703, 704, 708 + 0, 140, 140, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 166, 167, 172, 173, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 199, + 204, 205, 206, 207, 208, 211, 213, 214, 218, 224, + 228, 229, 234, 235, 236, 241, 242, 243, 247, 248, + 256, 257, 258, 263, 265, 268, 272, 273, 277, 278, + 283, 284, 289, 290, 291, 295, 296, 303, 318, 323, + 326, 334, 340, 341, 346, 352, 361, 369, 377, 384, + 392, 400, 407, 413, 414, 419, 420, 422, 426, 433, + 439, 449, 453, 457, 464, 471, 475, 483, 492, 493, + 498, 499, 504, 505, 511, 519, 520, 525, 526, 530, + 531, 535, 549, 550, 554, 559, 564, 565, 566, 570, + 576, 578, 579, 583, 591, 597, 598, 601, 603, 604, + 608 }; #endif @@ -570,39 +545,30 @@ static const char *const yytname[] = "PARS_STR_LIT", "PARS_NULL_LIT", "PARS_ID_TOKEN", "PARS_AND_TOKEN", "PARS_OR_TOKEN", "PARS_NOT_TOKEN", "PARS_GE_TOKEN", "PARS_LE_TOKEN", "PARS_NE_TOKEN", "PARS_PROCEDURE_TOKEN", "PARS_IN_TOKEN", - "PARS_OUT_TOKEN", "PARS_BINARY_TOKEN", "PARS_BLOB_TOKEN", - "PARS_INT_TOKEN", "PARS_FLOAT_TOKEN", "PARS_CHAR_TOKEN", "PARS_IS_TOKEN", - "PARS_BEGIN_TOKEN", "PARS_END_TOKEN", "PARS_IF_TOKEN", "PARS_THEN_TOKEN", - "PARS_ELSE_TOKEN", "PARS_ELSIF_TOKEN", "PARS_LOOP_TOKEN", - "PARS_WHILE_TOKEN", "PARS_RETURN_TOKEN", "PARS_SELECT_TOKEN", - "PARS_SUM_TOKEN", "PARS_COUNT_TOKEN", "PARS_DISTINCT_TOKEN", + "PARS_INT_TOKEN", "PARS_CHAR_TOKEN", "PARS_IS_TOKEN", "PARS_BEGIN_TOKEN", + "PARS_END_TOKEN", "PARS_IF_TOKEN", "PARS_THEN_TOKEN", "PARS_ELSE_TOKEN", + "PARS_ELSIF_TOKEN", "PARS_LOOP_TOKEN", "PARS_WHILE_TOKEN", + "PARS_RETURN_TOKEN", "PARS_SELECT_TOKEN", "PARS_COUNT_TOKEN", "PARS_FROM_TOKEN", "PARS_WHERE_TOKEN", "PARS_FOR_TOKEN", - "PARS_DDOT_TOKEN", "PARS_READ_TOKEN", "PARS_ORDER_TOKEN", - "PARS_BY_TOKEN", "PARS_ASC_TOKEN", "PARS_DESC_TOKEN", - "PARS_INSERT_TOKEN", "PARS_INTO_TOKEN", "PARS_VALUES_TOKEN", - "PARS_UPDATE_TOKEN", "PARS_SET_TOKEN", "PARS_DELETE_TOKEN", - "PARS_CURRENT_TOKEN", "PARS_OF_TOKEN", "PARS_CREATE_TOKEN", - "PARS_TABLE_TOKEN", "PARS_INDEX_TOKEN", "PARS_UNIQUE_TOKEN", - "PARS_CLUSTERED_TOKEN", "PARS_ON_TOKEN", "PARS_ASSIGN_TOKEN", - "PARS_DECLARE_TOKEN", "PARS_CURSOR_TOKEN", "PARS_SQL_TOKEN", - "PARS_OPEN_TOKEN", "PARS_FETCH_TOKEN", "PARS_CLOSE_TOKEN", - "PARS_NOTFOUND_TOKEN", "PARS_TO_CHAR_TOKEN", "PARS_TO_NUMBER_TOKEN", - "PARS_TO_BINARY_TOKEN", "PARS_BINARY_TO_NUMBER_TOKEN", - "PARS_SUBSTR_TOKEN", "PARS_REPLSTR_TOKEN", "PARS_CONCAT_TOKEN", - "PARS_INSTR_TOKEN", "PARS_LENGTH_TOKEN", "PARS_SYSDATE_TOKEN", - "PARS_PRINTF_TOKEN", "PARS_ASSERT_TOKEN", "PARS_RND_TOKEN", - "PARS_RND_STR_TOKEN", "PARS_ROW_PRINTF_TOKEN", "PARS_COMMIT_TOKEN", - "PARS_ROLLBACK_TOKEN", "PARS_WORK_TOKEN", "PARS_UNSIGNED_TOKEN", - "PARS_EXIT_TOKEN", "PARS_FUNCTION_TOKEN", "PARS_LOCK_TOKEN", - "PARS_SHARE_TOKEN", "PARS_MODE_TOKEN", "PARS_LIKE_TOKEN", - "PARS_LIKE_TOKEN_EXACT", "PARS_LIKE_TOKEN_PREFIX", + "PARS_DDOT_TOKEN", "PARS_ORDER_TOKEN", "PARS_BY_TOKEN", "PARS_ASC_TOKEN", + "PARS_DESC_TOKEN", "PARS_INSERT_TOKEN", "PARS_INTO_TOKEN", + "PARS_VALUES_TOKEN", "PARS_UPDATE_TOKEN", "PARS_SET_TOKEN", + "PARS_DELETE_TOKEN", "PARS_CURRENT_TOKEN", "PARS_OF_TOKEN", + "PARS_CREATE_TOKEN", "PARS_TABLE_TOKEN", "PARS_INDEX_TOKEN", + "PARS_UNIQUE_TOKEN", "PARS_CLUSTERED_TOKEN", "PARS_ON_TOKEN", + "PARS_ASSIGN_TOKEN", "PARS_DECLARE_TOKEN", "PARS_CURSOR_TOKEN", + "PARS_SQL_TOKEN", "PARS_OPEN_TOKEN", "PARS_FETCH_TOKEN", + "PARS_CLOSE_TOKEN", "PARS_NOTFOUND_TOKEN", "PARS_TO_BINARY_TOKEN", + "PARS_SUBSTR_TOKEN", "PARS_CONCAT_TOKEN", "PARS_INSTR_TOKEN", + "PARS_LENGTH_TOKEN", "PARS_COMMIT_TOKEN", "PARS_ROLLBACK_TOKEN", + "PARS_WORK_TOKEN", "PARS_EXIT_TOKEN", "PARS_FUNCTION_TOKEN", + "PARS_LOCK_TOKEN", "PARS_SHARE_TOKEN", "PARS_MODE_TOKEN", + "PARS_LIKE_TOKEN", "PARS_LIKE_TOKEN_EXACT", "PARS_LIKE_TOKEN_PREFIX", "PARS_LIKE_TOKEN_SUFFIX", "PARS_LIKE_TOKEN_SUBSTR", - "PARS_TABLE_NAME_TOKEN", "PARS_COMPACT_TOKEN", "PARS_BLOCK_SIZE_TOKEN", - "PARS_BIGINT_TOKEN", "'='", "'<'", "'>'", "'-'", "'+'", "'*'", "'/'", - "NEG", "'%'", "';'", "'('", "')'", "'?'", "','", "'{'", "'}'", "$accept", - "top_statement", "statement", "statement_list", "exp", "function_name", - "question_mark_list", "stored_procedure_call", - "predefined_procedure_call", "predefined_procedure_name", + "PARS_TABLE_NAME_TOKEN", "PARS_BIGINT_TOKEN", "'='", "'<'", "'>'", "'-'", + "'+'", "'*'", "'/'", "NEG", "'%'", "';'", "'('", "')'", "'?'", "','", + "'{'", "'}'", "$accept", "top_statement", "statement", "statement_list", + "exp", "function_name", "question_mark_list", "stored_procedure_call", "user_function_call", "table_list", "variable_list", "exp_list", "select_item", "select_item_list", "select_list", "search_condition", "for_update_clause", "lock_shared_clause", "order_direction", @@ -611,16 +577,14 @@ static const char *const yytname[] = "cursor_positioned", "update_statement_start", "update_statement_searched", "update_statement_positioned", "delete_statement_start", "delete_statement_searched", - "delete_statement_positioned", "row_printf_statement", - "assignment_statement", "elsif_element", "elsif_list", "else_part", - "if_statement", "while_statement", "for_statement", "exit_statement", - "return_statement", "open_cursor_statement", "close_cursor_statement", - "fetch_statement", "column_def", "column_def_list", "opt_column_len", - "opt_unsigned", "opt_not_null", "compact", "block_size", "create_table", - "column_list", "unique_def", "clustered_def", "create_index", - "table_name", "commit_statement", "rollback_statement", "type_name", - "parameter_declaration", "parameter_declaration_list", - "variable_declaration", "variable_declaration_list", + "delete_statement_positioned", "assignment_statement", "elsif_element", + "elsif_list", "else_part", "if_statement", "while_statement", + "for_statement", "exit_statement", "return_statement", + "open_cursor_statement", "close_cursor_statement", "fetch_statement", + "column_def", "column_def_list", "opt_column_len", "opt_not_null", + "create_table", "column_list", "unique_def", "clustered_def", + "create_index", "table_name", "commit_statement", "rollback_statement", + "type_name", "variable_declaration", "variable_declaration_list", "cursor_declaration", "function_declaration", "declaration", "declaration_list", "procedure_definition", YY_NULLPTR }; @@ -639,17 +603,15 @@ static const yytype_uint16 yytoknum[] = 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 61, 60, 62, 45, 43, 42, 47, 355, 37, 59, + 61, 60, 62, 45, 43, 42, 47, 335, 37, 59, 40, 41, 63, 44, 123, 125 }; # endif -#define YYPACT_NINF -176 +#define YYPACT_NINF -129 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-176))) + (!!((Yystate) == (-129))) #define YYTABLE_NINF -1 @@ -660,41 +622,36 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - 20, 21, 41, -64, -59, -176, -176, 48, 54, -176, - -74, 12, 12, 45, 48, -176, -176, -176, -176, -176, - -176, -176, 69, -176, 12, -176, 8, -32, -43, -176, - -176, -176, -176, -13, -176, 72, 81, 445, -176, 75, - -11, 42, 530, 530, -176, 16, 99, 67, -3, 78, - -14, 108, 109, 110, -176, -176, -176, 86, 36, 44, - -176, 122, -176, 216, -176, 22, 23, 25, 6, 26, - 93, 27, 33, 93, 46, 51, 53, 56, 61, 63, - 64, 66, 68, 70, 71, 76, 79, 89, 94, 95, - 86, -176, 530, -176, -176, -176, -176, 43, 530, 49, - -176, -176, -176, -176, -176, -176, -176, -176, -176, -176, - -176, 530, 530, 570, 77, 603, 80, 96, -176, 674, - -176, -38, 118, 161, -3, -176, -176, 129, -3, -3, - -176, 148, -176, 163, -176, -176, -176, -176, 97, -176, - -176, -176, 530, -176, 100, -176, -176, 481, -176, -176, - -176, -176, -176, -176, -176, -176, -176, -176, -176, -176, - -176, -176, -176, -176, -176, -176, -176, -176, -176, -176, - 102, 674, 149, 220, 155, 14, 91, 530, 530, 530, - 530, 530, 445, 219, 530, 530, 530, 530, 530, 530, - 530, 530, 445, 530, -24, 218, 267, -3, 530, -176, - 221, -176, 117, -176, 179, 228, 124, 674, -65, 530, - 185, 674, -176, -176, -176, -176, 220, 220, 19, 19, - 674, 136, -176, 19, 19, 19, 3, 3, 14, 14, - -57, 326, 554, 231, 128, -176, 130, -176, -1, -176, - 610, 142, -176, 131, 238, 242, 141, -176, 130, -176, - -52, -176, 530, -51, 246, 445, 530, -176, 227, 233, - -176, 229, -176, 151, -176, 252, 530, -3, 225, 530, - 530, 221, 12, -176, -48, 207, 156, 153, 164, 674, - -176, -176, 445, 626, -176, 250, -176, -176, -176, -176, - 230, 194, 655, 674, -176, 173, 187, 238, -3, -176, - -176, -176, 445, -176, -176, 270, 245, 445, 284, 204, - -176, 192, -176, 181, 445, 203, 253, -176, 386, 193, - -176, 286, 205, -176, 296, 217, 299, 279, -176, 303, - -176, 307, -176, -47, -176, 30, -176, -176, -176, -176, - 305, -176, -176, -176, -176 + 5, 34, 46, -28, -41, -129, -129, -12, 45, 57, + 23, -129, 9, -129, -129, -129, 20, -9, -129, -129, + -129, -129, 2, -129, 83, 87, 278, -129, 93, 28, + 71, 427, 427, -129, 335, 105, 85, -1, 104, -27, + 129, 132, 133, 76, 77, -129, 141, -129, 149, -129, + 61, 19, 62, 118, 65, 66, 118, 68, 69, 70, + 72, 73, 74, 75, 78, 79, 82, 84, 89, 90, + 91, 94, 138, -129, 427, -129, -129, -129, -129, 86, + 427, 96, -129, -129, -129, -129, -129, 427, 427, 438, + 92, 454, 95, -129, 1, -129, -24, 130, 157, -1, + -129, -129, 144, -1, -1, -129, 139, -129, 154, -129, + -129, -129, 98, -129, -129, -129, 108, -129, -129, 345, + -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, + -129, -129, -129, -129, -129, -129, -129, -129, -129, -129, + -129, 112, 1, 135, 285, 143, -8, 15, 427, 427, + 427, 427, 427, 278, 203, 427, 427, 427, 427, 427, + 427, 427, 427, 278, 124, 204, 381, -1, 427, -129, + 209, -129, 120, -129, 173, 215, 131, 427, 180, 1, + -129, -129, -129, -129, 285, 285, 30, 30, 1, 10, + -129, 30, 30, 30, 60, 60, -8, -8, 1, -39, + 192, 137, -129, 136, -129, -13, -129, 472, 146, -129, + 147, 225, 227, 151, -129, 136, -129, -21, 0, 229, + 278, 427, -129, 213, 219, -129, 427, 220, -129, 237, + 427, -1, 214, 427, 427, 209, 23, -129, 14, 196, + 160, 158, 162, -129, -129, 278, 486, -129, 231, 1, + -129, -129, -129, 218, 194, 517, 1, -129, 175, -129, + 225, -1, -129, -129, -129, 278, -129, -129, 251, 234, + 278, 266, 260, -129, 181, 278, 201, 239, -129, 235, + 184, 271, -129, 272, 208, 275, 258, -129, -129, -129, + 17, -129, -7, -129, -129, 277, -129, -129, -129, -129 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -702,67 +659,60 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 0, 0, 0, 0, 0, 1, 2, 164, 0, 165, - 0, 0, 0, 0, 0, 160, 161, 157, 159, 158, - 162, 163, 168, 166, 0, 169, 175, 0, 0, 170, - 173, 174, 176, 0, 167, 0, 0, 0, 177, 0, - 0, 0, 0, 0, 127, 84, 0, 0, 0, 0, - 148, 0, 0, 0, 68, 69, 70, 0, 0, 0, - 126, 0, 25, 0, 3, 0, 0, 0, 0, 0, - 90, 0, 0, 90, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 0, 0, 140, + 0, 141, 147, 136, 138, 137, 0, 0, 142, 145, + 146, 148, 0, 139, 0, 0, 0, 149, 0, 0, + 0, 0, 0, 112, 70, 0, 0, 0, 0, 127, + 0, 0, 0, 0, 0, 111, 0, 23, 0, 3, + 0, 0, 0, 76, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 172, 0, 29, 30, 31, 32, 27, 0, 33, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 0, 0, 0, 0, 0, 0, 0, 87, 80, - 85, 89, 0, 0, 0, 153, 154, 0, 0, 0, - 149, 150, 128, 0, 129, 115, 155, 156, 0, 178, - 26, 4, 77, 11, 0, 104, 12, 0, 110, 111, - 16, 17, 113, 114, 14, 15, 13, 10, 8, 5, - 6, 7, 9, 18, 20, 19, 23, 24, 21, 22, - 0, 116, 0, 49, 0, 38, 0, 0, 0, 0, + 0, 0, 0, 144, 0, 27, 28, 29, 30, 25, + 0, 31, 50, 51, 52, 53, 54, 0, 0, 0, + 0, 0, 0, 73, 68, 71, 75, 0, 0, 0, + 132, 133, 0, 0, 0, 128, 129, 113, 0, 114, + 134, 135, 0, 150, 24, 10, 0, 90, 11, 0, + 96, 97, 14, 15, 99, 100, 12, 13, 9, 7, + 4, 5, 6, 8, 16, 18, 17, 21, 22, 19, + 20, 0, 101, 0, 47, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 77, 0, 0, 0, 74, 0, 0, 0, 102, - 0, 112, 0, 151, 0, 74, 63, 78, 0, 77, - 0, 91, 171, 50, 51, 39, 47, 48, 44, 45, - 46, 120, 41, 40, 42, 43, 35, 34, 36, 37, - 0, 0, 0, 0, 0, 75, 88, 86, 90, 72, - 0, 0, 106, 109, 0, 0, 75, 131, 130, 64, - 0, 67, 0, 0, 0, 0, 0, 118, 122, 0, - 28, 0, 83, 0, 81, 0, 0, 0, 92, 0, - 0, 0, 0, 133, 0, 0, 0, 0, 0, 79, - 103, 108, 121, 0, 119, 0, 124, 82, 76, 73, - 0, 94, 0, 105, 107, 135, 141, 0, 0, 71, - 66, 65, 0, 123, 93, 0, 99, 0, 0, 137, - 142, 143, 134, 0, 117, 0, 0, 101, 0, 0, - 138, 139, 0, 145, 0, 0, 0, 0, 136, 0, - 132, 0, 146, 0, 95, 96, 125, 140, 144, 152, - 0, 97, 98, 100, 147 + 0, 0, 65, 0, 0, 62, 0, 0, 0, 88, + 0, 98, 0, 130, 0, 62, 55, 65, 0, 77, + 143, 48, 49, 37, 45, 46, 42, 43, 44, 105, + 39, 38, 40, 41, 33, 32, 34, 35, 66, 0, + 0, 0, 63, 74, 72, 76, 60, 0, 0, 92, + 95, 0, 0, 63, 116, 115, 56, 0, 0, 0, + 0, 0, 103, 107, 0, 26, 0, 0, 69, 0, + 0, 0, 78, 0, 0, 0, 0, 118, 0, 0, + 0, 0, 0, 89, 94, 106, 0, 104, 0, 67, + 109, 64, 61, 0, 80, 0, 91, 93, 120, 124, + 0, 0, 59, 58, 57, 0, 108, 79, 0, 85, + 0, 0, 122, 119, 0, 102, 0, 0, 87, 0, + 0, 0, 117, 0, 0, 0, 0, 121, 123, 125, + 0, 81, 82, 110, 131, 0, 83, 84, 86, 126 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -176, -176, -62, -175, -40, -176, -176, -176, -176, -176, - -176, -176, 111, -166, 119, -176, -176, -67, -176, -176, - -176, -176, -33, -176, -176, 47, -176, 240, -176, -176, - -176, -176, -176, -176, -176, -176, 59, -176, -176, -176, - -176, -176, -176, -176, -176, -176, -176, 17, -176, -176, - -176, -176, -176, -176, -176, -176, -176, -176, -176, -115, - -176, -176, -12, 313, -176, 293, -176, -176, -176, 295, - -176, -176 + -129, -129, -48, -128, -30, -129, -129, -129, -129, -129, + 113, 110, 123, -129, -129, -52, -129, -129, -129, -129, + -40, -129, -129, 55, -129, 238, -129, -129, -129, -129, + -129, -129, -129, 88, -129, -129, -129, -129, -129, -129, + -129, -129, -129, -129, 35, -129, -129, -129, -129, -129, + -129, -129, -129, -96, -129, -129, 81, 290, -129, -129, + -129, 286, -129, -129 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 2, 62, 63, 207, 114, 250, 64, 65, 66, - 247, 238, 236, 208, 120, 121, 122, 148, 291, 306, - 343, 317, 67, 68, 69, 242, 243, 149, 70, 71, - 72, 73, 74, 75, 76, 77, 257, 258, 259, 78, - 79, 80, 81, 82, 83, 84, 85, 273, 274, 309, - 321, 330, 311, 323, 86, 333, 131, 204, 87, 127, - 88, 89, 20, 9, 10, 25, 26, 30, 31, 32, - 33, 3 + -1, 2, 47, 48, 94, 90, 217, 49, 214, 205, + 203, 199, 95, 96, 97, 120, 254, 269, 298, 278, + 50, 51, 52, 209, 210, 121, 53, 54, 55, 56, + 57, 58, 59, 222, 223, 224, 60, 61, 62, 63, + 64, 65, 66, 67, 237, 238, 272, 282, 68, 290, + 106, 174, 69, 102, 70, 71, 16, 11, 12, 19, + 20, 21, 22, 3 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -770,232 +720,189 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_uint16 yytable[] = { - 21, 140, 113, 115, 125, 119, 152, 221, 195, 199, - 37, 233, 27, 201, 202, 24, 181, 231, 35, 93, - 94, 95, 96, 97, 135, 230, 98, 181, 4, 15, - 16, 17, 181, 18, 1, 145, 266, 13, 45, 14, - 129, 5, 130, 253, 36, 6, 251, 28, 252, 116, - 117, 7, 171, 144, 260, 8, 252, 170, 173, 277, - 280, 278, 252, 296, 339, 297, 340, 22, 28, 11, - 12, 175, 176, 341, 342, 196, 24, 34, 99, 39, - 282, 234, 239, 100, 101, 102, 103, 104, 40, 105, - 106, 107, 108, 126, 183, 109, 110, 90, 91, 177, - 178, 92, 179, 180, 181, 183, 123, 211, 189, 190, - 183, 19, 267, 124, 128, 132, 133, 134, 45, 111, - 136, 118, 187, 188, 189, 190, 112, 314, 137, 138, - 147, 141, 318, 142, 143, 146, 150, 216, 217, 218, - 219, 220, 151, 41, 223, 224, 225, 226, 227, 228, - 229, 172, 289, 232, 197, 154, 119, 174, 240, 140, - 155, 42, 156, 255, 256, 157, 43, 44, 45, 140, - 158, 268, 159, 160, 46, 161, 198, 162, 200, 163, - 164, 47, 183, 313, 48, 165, 49, 191, 166, 50, - 193, 184, 185, 186, 187, 188, 189, 190, 167, 51, - 52, 53, 215, 168, 169, 203, 194, 206, 54, 205, - 209, 212, 279, 55, 56, 213, 283, 57, 58, 59, - 140, 214, 60, 41, 222, 235, 211, 244, 241, 292, - 293, 179, 180, 181, 245, 246, 249, 254, 263, 264, - 139, 42, 270, 265, 271, 272, 43, 44, 45, 275, - 61, 276, 140, 281, 46, 256, 140, 285, 286, 288, - 295, 47, 287, 290, 48, 298, 49, 299, 300, 50, - 93, 94, 95, 96, 97, 303, 301, 98, 304, 51, - 52, 53, 305, 308, 310, 315, 316, 319, 54, 320, - 322, 324, 325, 55, 56, 326, 329, 57, 58, 59, - 116, 117, 60, 332, 328, 331, 335, 334, 336, 337, - 338, 183, 344, 153, 312, 237, 248, 284, 294, 29, - 184, 185, 186, 187, 188, 189, 190, 23, 38, 99, - 61, 0, 0, 41, 100, 101, 102, 103, 104, 0, - 105, 106, 107, 108, 0, 0, 109, 110, 0, 0, - 261, 42, 0, 0, 0, 0, 43, 44, 45, 0, - 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, - 111, 47, 0, 0, 48, 0, 49, 112, 0, 50, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, - 52, 53, 0, 41, 0, 0, 0, 0, 54, 0, - 0, 0, 0, 55, 56, 0, 0, 57, 58, 59, - 327, 42, 60, 0, 0, 0, 43, 44, 45, 0, - 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, - 0, 47, 0, 0, 48, 0, 49, 0, 0, 50, - 61, 0, 0, 0, 0, 0, 0, 0, 0, 51, - 52, 53, 41, 0, 0, 0, 0, 0, 54, 0, - 0, 0, 0, 55, 56, 0, 0, 57, 58, 59, - 42, 0, 60, 0, 0, 43, 44, 45, 0, 0, - 0, 0, 0, 46, 93, 94, 95, 96, 97, 0, - 47, 98, 0, 48, 0, 49, 0, 0, 50, 0, - 61, 0, 0, 0, 0, 0, 0, 0, 51, 52, - 53, 0, 0, 0, 0, 0, 0, 54, 0, 0, - 0, 0, 55, 56, 0, 0, 57, 58, 59, 0, - 0, 60, 210, 93, 94, 95, 96, 97, 0, 0, - 98, 0, 0, 99, 0, 0, 0, 0, 100, 101, - 102, 103, 104, 0, 105, 106, 107, 108, 0, 61, - 109, 110, 177, 178, 0, 179, 180, 181, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, - 0, 179, 180, 181, 111, 0, 0, 0, 0, 0, - 0, 112, 99, 0, 0, 0, 182, 100, 101, 102, - 103, 104, 0, 105, 106, 107, 108, 0, 0, 109, - 110, 177, 178, 0, 179, 180, 181, 0, 177, 178, - 0, 179, 180, 181, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 111, 177, 178, 0, 179, 180, 181, - 112, 0, 0, 0, 0, 183, 0, 0, 0, 269, - 0, 0, 302, 0, 184, 185, 186, 187, 188, 189, - 190, 183, 0, 177, 178, 262, 179, 180, 181, 0, - 184, 185, 186, 187, 188, 189, 190, 0, 0, 0, - 0, 0, 177, 178, 307, 179, 180, 181, 0, 0, - 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, - 0, 183, 0, 184, 185, 186, 187, 188, 189, 190, - 184, 185, 186, 187, 188, 189, 190, 183, 0, 0, - 0, 0, 0, 0, 0, 0, 184, 185, 186, 187, - 188, 189, 190, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, - 0, 0, 0, 0, 0, 184, 185, 186, 187, 188, - 189, 190, 0, 0, 0, 183, 0, 0, 0, 0, - 0, 0, 0, 0, 184, 185, 186, 187, 188, 189, - 190 + 114, 89, 91, 169, 124, 152, 100, 171, 172, 148, + 149, 117, 150, 151, 152, 165, 10, 30, 230, 1, + 104, 26, 105, 148, 149, 189, 150, 151, 152, 296, + 297, 31, 141, 220, 221, 200, 32, 33, 34, 13, + 14, 4, 35, 152, 142, 24, 5, 34, 36, 7, + 144, 37, 225, 38, 226, 17, 39, 146, 147, 116, + 25, 6, 17, 9, 10, 154, 40, 41, 42, 166, + 241, 206, 242, 152, 154, 43, 44, 101, 45, 8, + 231, 155, 156, 157, 158, 159, 160, 161, 154, 179, + 28, 243, 245, 226, 29, 155, 156, 157, 158, 159, + 160, 161, 15, 154, 46, 259, 183, 260, 294, 23, + 295, 72, 98, 158, 159, 160, 161, 73, 184, 185, + 186, 187, 188, 74, 99, 191, 192, 193, 194, 195, + 196, 197, 198, 154, 103, 252, 107, 275, 207, 108, + 109, 114, 279, 110, 111, 160, 161, 198, 112, 119, + 115, 118, 114, 232, 122, 123, 30, 126, 127, 128, + 167, 129, 130, 131, 132, 274, 34, 133, 134, 113, + 31, 135, 168, 136, 143, 32, 33, 34, 137, 138, + 139, 35, 162, 140, 145, 164, 170, 36, 176, 173, + 37, 246, 38, 175, 181, 39, 249, 114, 177, 30, + 179, 180, 182, 255, 256, 40, 41, 42, 190, 201, + 211, 202, 227, 31, 43, 44, 208, 45, 32, 33, + 34, 212, 213, 216, 35, 219, 234, 114, 228, 229, + 36, 114, 236, 37, 239, 38, 244, 221, 39, 248, + 235, 240, 30, 46, 251, 250, 253, 261, 40, 41, + 42, 262, 266, 263, 264, 286, 31, 43, 44, 267, + 45, 32, 33, 34, 268, 271, 276, 35, 277, 280, + 281, 283, 284, 36, 285, 287, 37, 288, 38, 289, + 291, 39, 292, 293, 299, 30, 46, 218, 215, 204, + 257, 40, 41, 42, 125, 273, 150, 151, 152, 31, + 43, 44, 18, 45, 32, 33, 34, 0, 27, 0, + 35, 247, 0, 0, 0, 0, 36, 258, 0, 37, + 0, 38, 0, 0, 39, 0, 0, 0, 0, 46, + 0, 0, 0, 0, 40, 41, 42, 0, 75, 76, + 77, 78, 79, 43, 44, 80, 45, 0, 75, 76, + 77, 78, 79, 0, 0, 80, 0, 0, 154, 0, + 0, 0, 0, 0, 92, 155, 156, 157, 158, 159, + 160, 161, 46, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 75, 76, 77, 78, 79, 178, + 81, 80, 0, 0, 0, 82, 83, 84, 85, 86, + 81, 0, 0, 0, 0, 82, 83, 84, 85, 86, + 92, 0, 0, 0, 0, 0, 0, 0, 87, 0, + 93, 0, 0, 0, 0, 88, 0, 0, 87, 0, + 75, 76, 77, 78, 79, 88, 81, 80, 0, 0, + 0, 82, 83, 84, 85, 86, 148, 149, 0, 150, + 151, 152, 0, 0, 0, 0, 0, 0, 0, 0, + 153, 0, 148, 149, 87, 150, 151, 152, 0, 0, + 0, 88, 0, 0, 0, 0, 0, 0, 0, 163, + 148, 149, 81, 150, 151, 152, 0, 82, 83, 84, + 85, 86, 0, 0, 148, 149, 0, 150, 151, 152, + 0, 0, 0, 0, 0, 233, 0, 0, 265, 0, + 87, 154, 0, 0, 0, 0, 0, 88, 155, 156, + 157, 158, 159, 160, 161, 148, 149, 154, 150, 151, + 152, 0, 0, 0, 155, 156, 157, 158, 159, 160, + 161, 0, 270, 0, 0, 154, 0, 0, 0, 0, + 0, 0, 155, 156, 157, 158, 159, 160, 161, 154, + 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, + 159, 160, 161, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 154, 0, 0, 0, 0, 0, 0, 155, 156, 157, + 158, 159, 160, 161 }; static const yytype_int16 yycheck[] = { - 12, 63, 42, 43, 7, 45, 73, 182, 46, 124, - 23, 35, 24, 128, 129, 7, 13, 192, 61, 3, - 4, 5, 6, 7, 57, 191, 10, 13, 7, 17, - 18, 19, 13, 21, 14, 68, 37, 111, 32, 113, - 54, 0, 56, 209, 87, 109, 111, 60, 113, 33, - 34, 110, 92, 47, 111, 7, 113, 90, 98, 111, - 111, 113, 113, 111, 111, 113, 113, 22, 60, 15, - 16, 111, 112, 43, 44, 113, 7, 109, 62, 7, - 255, 105, 197, 67, 68, 69, 70, 71, 7, 73, - 74, 75, 76, 96, 91, 79, 80, 22, 109, 8, - 9, 59, 11, 12, 13, 91, 7, 147, 105, 106, - 91, 99, 113, 46, 36, 7, 7, 7, 32, 103, - 84, 105, 103, 104, 105, 106, 110, 302, 84, 7, - 37, 109, 307, 110, 109, 109, 109, 177, 178, 179, - 180, 181, 109, 7, 184, 185, 186, 187, 188, 189, - 190, 108, 267, 193, 36, 109, 196, 108, 198, 221, - 109, 25, 109, 27, 28, 109, 30, 31, 32, 231, - 109, 238, 109, 109, 38, 109, 15, 109, 49, 109, - 109, 45, 91, 298, 48, 109, 50, 110, 109, 53, - 110, 100, 101, 102, 103, 104, 105, 106, 109, 63, - 64, 65, 111, 109, 109, 57, 110, 110, 72, 46, - 110, 109, 252, 77, 78, 66, 256, 81, 82, 83, - 282, 66, 86, 7, 5, 7, 266, 110, 7, 269, - 270, 11, 12, 13, 55, 7, 112, 52, 7, 111, - 24, 25, 100, 113, 113, 7, 30, 31, 32, 7, - 114, 110, 314, 7, 38, 28, 318, 24, 29, 7, - 272, 45, 111, 38, 48, 58, 50, 111, 115, 53, - 3, 4, 5, 6, 7, 25, 112, 10, 48, 63, - 64, 65, 88, 110, 97, 15, 41, 3, 72, 85, - 98, 110, 89, 77, 78, 42, 10, 81, 82, 83, - 33, 34, 86, 7, 111, 100, 7, 90, 29, 6, - 3, 91, 7, 73, 297, 196, 205, 258, 271, 26, - 100, 101, 102, 103, 104, 105, 106, 14, 33, 62, - 114, -1, -1, 7, 67, 68, 69, 70, 71, -1, - 73, 74, 75, 76, -1, -1, 79, 80, -1, -1, - 24, 25, -1, -1, -1, -1, 30, 31, 32, -1, - -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, - 103, 45, -1, -1, 48, -1, 50, 110, -1, 53, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, - 64, 65, -1, 7, -1, -1, -1, -1, 72, -1, - -1, -1, -1, 77, 78, -1, -1, 81, 82, 83, - 24, 25, 86, -1, -1, -1, 30, 31, 32, -1, - -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, - -1, 45, -1, -1, 48, -1, 50, -1, -1, 53, - 114, -1, -1, -1, -1, -1, -1, -1, -1, 63, - 64, 65, 7, -1, -1, -1, -1, -1, 72, -1, - -1, -1, -1, 77, 78, -1, -1, 81, 82, 83, - 25, -1, 86, -1, -1, 30, 31, 32, -1, -1, - -1, -1, -1, 38, 3, 4, 5, 6, 7, -1, - 45, 10, -1, 48, -1, 50, -1, -1, 53, -1, - 114, -1, -1, -1, -1, -1, -1, -1, 63, 64, - 65, -1, -1, -1, -1, -1, -1, 72, -1, -1, - -1, -1, 77, 78, -1, -1, 81, 82, 83, -1, - -1, 86, 51, 3, 4, 5, 6, 7, -1, -1, - 10, -1, -1, 62, -1, -1, -1, -1, 67, 68, - 69, 70, 71, -1, 73, 74, 75, 76, -1, 114, - 79, 80, 8, 9, -1, 11, 12, 13, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 8, 9, - -1, 11, 12, 13, 103, -1, -1, -1, -1, -1, - -1, 110, 62, -1, -1, -1, 26, 67, 68, 69, - 70, 71, -1, 73, 74, 75, 76, -1, -1, 79, - 80, 8, 9, -1, 11, 12, 13, -1, 8, 9, - -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, - -1, -1, 29, 103, 8, 9, -1, 11, 12, 13, - 110, -1, -1, -1, -1, 91, -1, -1, -1, 39, - -1, -1, 26, -1, 100, 101, 102, 103, 104, 105, - 106, 91, -1, 8, 9, 111, 11, 12, 13, -1, - 100, 101, 102, 103, 104, 105, 106, -1, -1, -1, - -1, -1, 8, 9, 29, 11, 12, 13, -1, -1, - -1, -1, -1, -1, 91, -1, -1, -1, -1, -1, - -1, 91, -1, 100, 101, 102, 103, 104, 105, 106, - 100, 101, 102, 103, 104, 105, 106, 91, -1, -1, - -1, -1, -1, -1, -1, -1, 100, 101, 102, 103, - 104, 105, 106, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 91, -1, -1, -1, - -1, -1, -1, -1, -1, 100, 101, 102, 103, 104, - 105, 106, -1, -1, -1, 91, -1, -1, -1, -1, - -1, -1, -1, -1, 100, 101, 102, 103, 104, 105, - 106 + 48, 31, 32, 99, 56, 13, 7, 103, 104, 8, + 9, 51, 11, 12, 13, 39, 7, 7, 31, 14, + 47, 19, 49, 8, 9, 153, 11, 12, 13, 36, + 37, 21, 72, 23, 24, 163, 26, 27, 28, 16, + 17, 7, 32, 13, 74, 54, 0, 28, 38, 90, + 80, 41, 91, 43, 93, 53, 46, 87, 88, 40, + 69, 89, 53, 18, 7, 73, 56, 57, 58, 93, + 91, 167, 93, 13, 73, 65, 66, 78, 68, 91, + 93, 80, 81, 82, 83, 84, 85, 86, 73, 119, + 7, 91, 220, 93, 7, 80, 81, 82, 83, 84, + 85, 86, 79, 73, 94, 91, 91, 93, 91, 89, + 93, 18, 7, 83, 84, 85, 86, 89, 148, 149, + 150, 151, 152, 52, 39, 155, 156, 157, 158, 159, + 160, 161, 162, 73, 30, 231, 7, 265, 168, 7, + 7, 189, 270, 67, 67, 85, 86, 177, 7, 31, + 89, 89, 200, 205, 89, 89, 7, 89, 89, 89, + 30, 89, 89, 89, 89, 261, 28, 89, 89, 20, + 21, 89, 15, 89, 88, 26, 27, 28, 89, 89, + 89, 32, 90, 89, 88, 90, 42, 38, 90, 50, + 41, 221, 43, 39, 59, 46, 226, 245, 90, 7, + 230, 89, 59, 233, 234, 56, 57, 58, 5, 85, + 90, 7, 20, 21, 65, 66, 7, 68, 26, 27, + 28, 48, 7, 92, 32, 45, 80, 275, 91, 93, + 38, 279, 7, 41, 7, 43, 7, 24, 46, 20, + 93, 90, 7, 94, 7, 25, 32, 51, 56, 57, + 58, 91, 21, 95, 92, 20, 21, 65, 66, 41, + 68, 26, 27, 28, 70, 90, 15, 32, 34, 3, + 10, 90, 71, 38, 35, 91, 41, 6, 43, 7, + 72, 46, 7, 25, 7, 7, 94, 177, 175, 166, + 235, 56, 57, 58, 56, 260, 11, 12, 13, 21, + 65, 66, 12, 68, 26, 27, 28, -1, 22, -1, + 32, 223, -1, -1, -1, -1, 38, 236, -1, 41, + -1, 43, -1, -1, 46, -1, -1, -1, -1, 94, + -1, -1, -1, -1, 56, 57, 58, -1, 3, 4, + 5, 6, 7, 65, 66, 10, 68, -1, 3, 4, + 5, 6, 7, -1, -1, 10, -1, -1, 73, -1, + -1, -1, -1, -1, 29, 80, 81, 82, 83, 84, + 85, 86, 94, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3, 4, 5, 6, 7, 44, + 55, 10, -1, -1, -1, 60, 61, 62, 63, 64, + 55, -1, -1, -1, -1, 60, 61, 62, 63, 64, + 29, -1, -1, -1, -1, -1, -1, -1, 83, -1, + 85, -1, -1, -1, -1, 90, -1, -1, 83, -1, + 3, 4, 5, 6, 7, 90, 55, 10, -1, -1, + -1, 60, 61, 62, 63, 64, 8, 9, -1, 11, + 12, 13, -1, -1, -1, -1, -1, -1, -1, -1, + 22, -1, 8, 9, 83, 11, 12, 13, -1, -1, + -1, 90, -1, -1, -1, -1, -1, -1, -1, 25, + 8, 9, 55, 11, 12, 13, -1, 60, 61, 62, + 63, 64, -1, -1, 8, 9, -1, 11, 12, 13, + -1, -1, -1, -1, -1, 33, -1, -1, 22, -1, + 83, 73, -1, -1, -1, -1, -1, 90, 80, 81, + 82, 83, 84, 85, 86, 8, 9, 73, 11, 12, + 13, -1, -1, -1, 80, 81, 82, 83, 84, 85, + 86, -1, 25, -1, -1, 73, -1, -1, -1, -1, + -1, -1, 80, 81, 82, 83, 84, 85, 86, 73, + -1, -1, -1, -1, -1, -1, 80, 81, 82, 83, + 84, 85, 86, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 73, -1, -1, -1, -1, -1, -1, 80, 81, 82, + 83, 84, 85, 86 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 14, 117, 187, 7, 0, 109, 110, 7, 179, - 180, 15, 16, 111, 113, 17, 18, 19, 21, 99, - 178, 178, 22, 179, 7, 181, 182, 178, 60, 181, - 183, 184, 185, 186, 109, 61, 87, 23, 185, 7, - 7, 7, 25, 30, 31, 32, 38, 45, 48, 50, - 53, 63, 64, 65, 72, 77, 78, 81, 82, 83, - 86, 114, 118, 119, 123, 124, 125, 138, 139, 140, - 144, 145, 146, 147, 148, 149, 150, 151, 155, 156, - 157, 158, 159, 160, 161, 162, 170, 174, 176, 177, - 22, 109, 59, 3, 4, 5, 6, 7, 10, 62, - 67, 68, 69, 70, 71, 73, 74, 75, 76, 79, - 80, 103, 110, 120, 121, 120, 33, 34, 105, 120, - 130, 131, 132, 7, 46, 7, 96, 175, 36, 54, - 56, 172, 7, 7, 7, 138, 84, 84, 7, 24, - 118, 109, 110, 109, 47, 138, 109, 37, 133, 143, - 109, 109, 133, 143, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 138, 120, 108, 120, 108, 120, 120, 8, 9, 11, - 12, 13, 26, 91, 100, 101, 102, 103, 104, 105, - 106, 110, 29, 110, 110, 46, 113, 36, 15, 175, - 49, 175, 175, 57, 173, 46, 110, 120, 129, 110, - 51, 120, 109, 66, 66, 111, 120, 120, 120, 120, - 120, 119, 5, 120, 120, 120, 120, 120, 120, 120, - 129, 119, 120, 35, 105, 7, 128, 130, 127, 175, - 120, 7, 141, 142, 110, 55, 7, 126, 128, 112, - 122, 111, 113, 129, 52, 27, 28, 152, 153, 154, - 111, 24, 111, 7, 111, 113, 37, 113, 133, 39, - 100, 113, 7, 163, 164, 7, 110, 111, 113, 120, - 111, 7, 119, 120, 152, 24, 29, 111, 7, 175, - 38, 134, 120, 120, 141, 178, 111, 113, 58, 111, - 115, 112, 26, 25, 48, 88, 135, 29, 110, 165, - 97, 168, 163, 175, 119, 15, 41, 137, 119, 3, - 85, 166, 98, 169, 110, 89, 42, 24, 111, 10, - 167, 100, 7, 171, 90, 7, 29, 6, 3, 111, - 113, 43, 44, 136, 7 + 0, 14, 97, 159, 7, 0, 89, 90, 91, 18, + 7, 153, 154, 16, 17, 79, 152, 53, 153, 155, + 156, 157, 158, 89, 54, 69, 19, 157, 7, 7, + 7, 21, 26, 27, 28, 32, 38, 41, 43, 46, + 56, 57, 58, 65, 66, 68, 94, 98, 99, 103, + 116, 117, 118, 122, 123, 124, 125, 126, 127, 128, + 132, 133, 134, 135, 136, 137, 138, 139, 144, 148, + 150, 151, 18, 89, 52, 3, 4, 5, 6, 7, + 10, 55, 60, 61, 62, 63, 64, 83, 90, 100, + 101, 100, 29, 85, 100, 108, 109, 110, 7, 39, + 7, 78, 149, 30, 47, 49, 146, 7, 7, 7, + 67, 67, 7, 20, 98, 89, 40, 116, 89, 31, + 111, 121, 89, 89, 111, 121, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 116, 100, 88, 100, 88, 100, 100, 8, 9, + 11, 12, 13, 22, 73, 80, 81, 82, 83, 84, + 85, 86, 90, 25, 90, 39, 93, 30, 15, 149, + 42, 149, 149, 50, 147, 39, 90, 90, 44, 100, + 89, 59, 59, 91, 100, 100, 100, 100, 100, 99, + 5, 100, 100, 100, 100, 100, 100, 100, 100, 107, + 99, 85, 7, 106, 108, 105, 149, 100, 7, 119, + 120, 90, 48, 7, 104, 106, 92, 102, 107, 45, + 23, 24, 129, 130, 131, 91, 93, 20, 91, 93, + 31, 93, 111, 33, 80, 93, 7, 140, 141, 7, + 90, 91, 93, 91, 7, 99, 100, 129, 20, 100, + 25, 7, 149, 32, 112, 100, 100, 119, 152, 91, + 93, 51, 91, 95, 92, 22, 21, 41, 70, 113, + 25, 90, 142, 140, 149, 99, 15, 34, 115, 99, + 3, 10, 143, 90, 71, 35, 20, 91, 6, 7, + 145, 72, 7, 25, 91, 93, 36, 37, 114, 7 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 116, 117, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 119, 119, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 122, 122, 122, 123, 124, 125, 125, - 125, 126, 127, 127, 128, 128, 128, 129, 129, 129, - 130, 130, 130, 130, 131, 131, 131, 132, 132, 132, - 133, 133, 134, 134, 135, 135, 136, 136, 136, 137, - 137, 138, 139, 140, 140, 141, 142, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 153, - 154, 154, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 162, 163, 164, 164, 165, 165, 166, 166, 167, - 167, 168, 168, 169, 169, 170, 171, 171, 172, 172, - 173, 173, 174, 175, 175, 176, 177, 178, 178, 178, - 178, 178, 179, 179, 180, 180, 180, 181, 182, 182, - 182, 183, 184, 185, 185, 186, 186, 186, 187 + 0, 96, 97, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 99, 99, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 101, 101, 101, 101, 101, 102, 102, 102, 103, 104, + 105, 105, 106, 106, 106, 107, 107, 107, 108, 108, + 109, 109, 109, 110, 110, 110, 111, 111, 112, 112, + 113, 113, 114, 114, 114, 115, 115, 116, 117, 118, + 118, 119, 120, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 130, 131, 131, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 139, 140, 141, 141, + 142, 142, 143, 143, 144, 145, 145, 146, 146, 147, + 147, 148, 149, 149, 150, 151, 152, 152, 152, 153, + 154, 154, 154, 155, 156, 157, 157, 158, 158, 158, + 159 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -1003,22 +910,20 @@ static const yytype_uint8 yyr2[] = { 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 1, 4, 1, - 1, 1, 1, 1, 3, 3, 3, 3, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, - 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 3, 6, 4, 1, 1, - 1, 3, 1, 3, 0, 1, 3, 0, 1, 3, - 1, 4, 5, 4, 0, 1, 3, 1, 3, 1, - 0, 2, 0, 2, 0, 4, 0, 1, 1, 0, - 4, 8, 3, 5, 2, 3, 1, 3, 4, 4, - 2, 2, 3, 2, 2, 2, 3, 4, 1, 2, - 0, 2, 1, 7, 6, 10, 1, 1, 2, 2, - 4, 4, 5, 1, 3, 0, 3, 0, 1, 0, - 2, 0, 1, 0, 3, 8, 1, 3, 0, 1, - 0, 1, 10, 1, 1, 2, 2, 1, 1, 1, - 1, 1, 3, 3, 0, 1, 3, 3, 0, 1, - 2, 6, 4, 1, 1, 0, 1, 2, 11 + 2, 2, 2, 1, 2, 1, 4, 1, 1, 1, + 1, 1, 3, 3, 3, 3, 2, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, + 1, 1, 1, 1, 1, 0, 1, 3, 6, 3, + 1, 3, 0, 1, 3, 0, 1, 3, 1, 4, + 0, 1, 3, 1, 3, 1, 0, 2, 0, 2, + 0, 4, 0, 1, 1, 0, 4, 8, 3, 5, + 2, 3, 1, 3, 4, 4, 2, 2, 3, 2, + 2, 3, 4, 1, 2, 0, 2, 1, 7, 6, + 10, 1, 1, 2, 2, 4, 4, 4, 1, 3, + 0, 3, 0, 2, 6, 1, 3, 0, 1, 0, + 1, 10, 1, 1, 2, 2, 1, 1, 1, 3, + 0, 1, 2, 6, 4, 1, 1, 0, 1, 2, + 10 }; @@ -1034,22 +939,22 @@ static const yytype_uint8 yyr2[] = #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (0) +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) /* Error token number */ #define YYTERROR 1 @@ -1089,37 +994,39 @@ do { \ } while (0) -/*----------------------------------------. -| Print this symbol's value on YYOUTPUT. | -`----------------------------------------*/ +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep) { - FILE *yyo = yyoutput; - YYUSE (yyo); + FILE *yyoutput = yyo; + YYUSE (yyoutput); if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); + YYPRINT (yyo, yytoknum[yytype], *yyvaluep); # endif + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YYUSE (yytype); + YY_IGNORE_MAYBE_UNINITIALIZED_END } -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep) { - YYFPRINTF (yyoutput, "%s %s (", + YYFPRINTF (yyo, "%s %s (", yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); + yy_symbol_value_print (yyo, yytype, yyvaluep); + YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. @@ -1153,7 +1060,7 @@ do { \ static void yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule) { - unsigned long int yylno = yyrline[yyrule]; + unsigned long yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", @@ -1164,7 +1071,7 @@ yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule) YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yystos[yyssp[yyi + 1 - yynrhs]], - &(yyvsp[(yyi + 1) - (yynrhs)]) + &yyvsp[(yyi + 1) - (yynrhs)] ); YYFPRINTF (stderr, "\n"); } @@ -1268,7 +1175,10 @@ yytnamerr (char *yyres, const char *yystr) case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; - /* Fall through. */ + else + goto append; + + append: default: if (yyres) yyres[yyn] = *yyp; @@ -1286,7 +1196,7 @@ yytnamerr (char *yyres, const char *yystr) if (! yyres) return yystrlen (yystr); - return yystpcpy (yyres, yystr) - yyres; + return (YYSIZE_T) (yystpcpy (yyres, yystr) - yyres); } # endif @@ -1364,10 +1274,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yyarg[yycount++] = yytname[yyx]; { YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) + yysize = yysize1; + else return 2; - yysize = yysize1; } } } @@ -1379,6 +1289,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, case N: \ yyformat = S; \ break + default: /* Avoid compiler warnings. */ YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); @@ -1390,9 +1301,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, { YYSIZE_T yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) + yysize = yysize1; + else return 2; - yysize = yysize1; } if (*yymsg_alloc < yysize) @@ -1518,23 +1430,33 @@ yyparse (void) yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; + /*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | +| yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ - yynewstate: +yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; - yysetstate: - *yyssp = yystate; + +/*--------------------------------------------------------------------. +| yynewstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + *yyssp = (yytype_int16) yystate; if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + goto yyexhaustedlab; +#else { /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + YYSIZE_T yysize = (YYSIZE_T) (yyssp - yyss + 1); -#ifdef yyoverflow +# if defined yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into @@ -1550,14 +1472,10 @@ yyparse (void) &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); - yyss = yyss1; yyvs = yyvs1; } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else +# else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; @@ -1573,35 +1491,33 @@ yyparse (void) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); -# undef YYSTACK_RELOCATE +# undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif -#endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + (unsigned long) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ if (yystate == YYFINAL) YYACCEPT; goto yybackup; + /*-----------. | yybackup. | `-----------*/ yybackup: - /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ @@ -1659,7 +1575,6 @@ yybackup: YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END - goto yynewstate; @@ -1674,7 +1589,7 @@ yydefault: /*-----------------------------. -| yyreduce -- Do a reduction. | +| yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ @@ -1694,953 +1609,779 @@ yyreduce: YY_REDUCE_PRINT (yyn); switch (yyn) { - case 25: -#line 188 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last(NULL, (yyvsp[0])); } -#line 1701 "pars0grm.cc" /* yacc.c:1646 */ + case 23: +#line 166 "pars0grm.y" + { yyval = que_node_list_add_last(NULL, yyvsp[0]); } +#line 1616 "pars0grm.cc" + break; + + case 24: +#line 168 "pars0grm.y" + { yyval = que_node_list_add_last(yyvsp[-1], yyvsp[0]); } +#line 1622 "pars0grm.cc" + break; + + case 25: +#line 172 "pars0grm.y" + { yyval = yyvsp[0];} +#line 1628 "pars0grm.cc" break; case 26: -#line 190 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last((yyvsp[-1]), (yyvsp[0])); } -#line 1707 "pars0grm.cc" /* yacc.c:1646 */ +#line 174 "pars0grm.y" + { yyval = pars_func(yyvsp[-3], yyvsp[-1]); } +#line 1634 "pars0grm.cc" break; case 27: -#line 194 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]);} -#line 1713 "pars0grm.cc" /* yacc.c:1646 */ +#line 175 "pars0grm.y" + { yyval = yyvsp[0];} +#line 1640 "pars0grm.cc" break; case 28: -#line 196 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_func((yyvsp[-3]), (yyvsp[-1])); } -#line 1719 "pars0grm.cc" /* yacc.c:1646 */ +#line 176 "pars0grm.y" + { yyval = yyvsp[0];} +#line 1646 "pars0grm.cc" break; case 29: -#line 197 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]);} -#line 1725 "pars0grm.cc" /* yacc.c:1646 */ +#line 177 "pars0grm.y" + { yyval = yyvsp[0];} +#line 1652 "pars0grm.cc" break; case 30: -#line 198 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]);} -#line 1731 "pars0grm.cc" /* yacc.c:1646 */ +#line 178 "pars0grm.y" + { yyval = yyvsp[0];} +#line 1658 "pars0grm.cc" break; case 31: -#line 199 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]);} -#line 1737 "pars0grm.cc" /* yacc.c:1646 */ +#line 179 "pars0grm.y" + { yyval = yyvsp[0];} +#line 1664 "pars0grm.cc" break; case 32: -#line 200 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]);} -#line 1743 "pars0grm.cc" /* yacc.c:1646 */ +#line 180 "pars0grm.y" + { yyval = pars_op('+', yyvsp[-2], yyvsp[0]); } +#line 1670 "pars0grm.cc" break; case 33: -#line 201 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]);} -#line 1749 "pars0grm.cc" /* yacc.c:1646 */ +#line 181 "pars0grm.y" + { yyval = pars_op('-', yyvsp[-2], yyvsp[0]); } +#line 1676 "pars0grm.cc" break; case 34: -#line 202 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op('+', (yyvsp[-2]), (yyvsp[0])); } -#line 1755 "pars0grm.cc" /* yacc.c:1646 */ +#line 182 "pars0grm.y" + { yyval = pars_op('*', yyvsp[-2], yyvsp[0]); } +#line 1682 "pars0grm.cc" break; case 35: -#line 203 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op('-', (yyvsp[-2]), (yyvsp[0])); } -#line 1761 "pars0grm.cc" /* yacc.c:1646 */ +#line 183 "pars0grm.y" + { yyval = pars_op('/', yyvsp[-2], yyvsp[0]); } +#line 1688 "pars0grm.cc" break; case 36: -#line 204 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op('*', (yyvsp[-2]), (yyvsp[0])); } -#line 1767 "pars0grm.cc" /* yacc.c:1646 */ +#line 184 "pars0grm.y" + { yyval = pars_op('-', yyvsp[0], NULL); } +#line 1694 "pars0grm.cc" break; case 37: -#line 205 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op('/', (yyvsp[-2]), (yyvsp[0])); } -#line 1773 "pars0grm.cc" /* yacc.c:1646 */ +#line 185 "pars0grm.y" + { yyval = yyvsp[-1]; } +#line 1700 "pars0grm.cc" break; case 38: -#line 206 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op('-', (yyvsp[0]), NULL); } -#line 1779 "pars0grm.cc" /* yacc.c:1646 */ +#line 186 "pars0grm.y" + { yyval = pars_op('=', yyvsp[-2], yyvsp[0]); } +#line 1706 "pars0grm.cc" break; case 39: -#line 207 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[-1]); } -#line 1785 "pars0grm.cc" /* yacc.c:1646 */ +#line 188 "pars0grm.y" + { yyval = pars_op(PARS_LIKE_TOKEN, yyvsp[-2], yyvsp[0]); } +#line 1712 "pars0grm.cc" break; case 40: -#line 208 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op('=', (yyvsp[-2]), (yyvsp[0])); } -#line 1791 "pars0grm.cc" /* yacc.c:1646 */ +#line 189 "pars0grm.y" + { yyval = pars_op('<', yyvsp[-2], yyvsp[0]); } +#line 1718 "pars0grm.cc" break; case 41: -#line 210 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op(PARS_LIKE_TOKEN, (yyvsp[-2]), (yyvsp[0])); } -#line 1797 "pars0grm.cc" /* yacc.c:1646 */ +#line 190 "pars0grm.y" + { yyval = pars_op('>', yyvsp[-2], yyvsp[0]); } +#line 1724 "pars0grm.cc" break; case 42: -#line 211 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op('<', (yyvsp[-2]), (yyvsp[0])); } -#line 1803 "pars0grm.cc" /* yacc.c:1646 */ +#line 191 "pars0grm.y" + { yyval = pars_op(PARS_GE_TOKEN, yyvsp[-2], yyvsp[0]); } +#line 1730 "pars0grm.cc" break; case 43: -#line 212 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op('>', (yyvsp[-2]), (yyvsp[0])); } -#line 1809 "pars0grm.cc" /* yacc.c:1646 */ +#line 192 "pars0grm.y" + { yyval = pars_op(PARS_LE_TOKEN, yyvsp[-2], yyvsp[0]); } +#line 1736 "pars0grm.cc" break; case 44: -#line 213 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op(PARS_GE_TOKEN, (yyvsp[-2]), (yyvsp[0])); } -#line 1815 "pars0grm.cc" /* yacc.c:1646 */ +#line 193 "pars0grm.y" + { yyval = pars_op(PARS_NE_TOKEN, yyvsp[-2], yyvsp[0]); } +#line 1742 "pars0grm.cc" break; case 45: -#line 214 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op(PARS_LE_TOKEN, (yyvsp[-2]), (yyvsp[0])); } -#line 1821 "pars0grm.cc" /* yacc.c:1646 */ +#line 194 "pars0grm.y" + { yyval = pars_op(PARS_AND_TOKEN, yyvsp[-2], yyvsp[0]); } +#line 1748 "pars0grm.cc" break; case 46: -#line 215 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op(PARS_NE_TOKEN, (yyvsp[-2]), (yyvsp[0])); } -#line 1827 "pars0grm.cc" /* yacc.c:1646 */ +#line 195 "pars0grm.y" + { yyval = pars_op(PARS_OR_TOKEN, yyvsp[-2], yyvsp[0]); } +#line 1754 "pars0grm.cc" break; case 47: -#line 216 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op(PARS_AND_TOKEN, (yyvsp[-2]), (yyvsp[0])); } -#line 1833 "pars0grm.cc" /* yacc.c:1646 */ +#line 196 "pars0grm.y" + { yyval = pars_op(PARS_NOT_TOKEN, yyvsp[0], NULL); } +#line 1760 "pars0grm.cc" break; case 48: -#line 217 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op(PARS_OR_TOKEN, (yyvsp[-2]), (yyvsp[0])); } -#line 1839 "pars0grm.cc" /* yacc.c:1646 */ +#line 198 "pars0grm.y" + { yyval = pars_op(PARS_NOTFOUND_TOKEN, yyvsp[-2], NULL); } +#line 1766 "pars0grm.cc" break; case 49: -#line 218 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op(PARS_NOT_TOKEN, (yyvsp[0]), NULL); } -#line 1845 "pars0grm.cc" /* yacc.c:1646 */ +#line 200 "pars0grm.y" + { yyval = pars_op(PARS_NOTFOUND_TOKEN, yyvsp[-2], NULL); } +#line 1772 "pars0grm.cc" break; case 50: -#line 220 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op(PARS_NOTFOUND_TOKEN, (yyvsp[-2]), NULL); } -#line 1851 "pars0grm.cc" /* yacc.c:1646 */ +#line 204 "pars0grm.y" + { yyval = &pars_to_binary_token; } +#line 1778 "pars0grm.cc" break; case 51: -#line 222 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_op(PARS_NOTFOUND_TOKEN, (yyvsp[-2]), NULL); } -#line 1857 "pars0grm.cc" /* yacc.c:1646 */ +#line 205 "pars0grm.y" + { yyval = &pars_substr_token; } +#line 1784 "pars0grm.cc" break; case 52: -#line 226 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_to_char_token; } -#line 1863 "pars0grm.cc" /* yacc.c:1646 */ +#line 206 "pars0grm.y" + { yyval = &pars_concat_token; } +#line 1790 "pars0grm.cc" break; case 53: -#line 227 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_to_number_token; } -#line 1869 "pars0grm.cc" /* yacc.c:1646 */ +#line 207 "pars0grm.y" + { yyval = &pars_instr_token; } +#line 1796 "pars0grm.cc" break; case 54: -#line 228 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_to_binary_token; } -#line 1875 "pars0grm.cc" /* yacc.c:1646 */ +#line 208 "pars0grm.y" + { yyval = &pars_length_token; } +#line 1802 "pars0grm.cc" break; - case 55: -#line 230 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_binary_to_number_token; } -#line 1881 "pars0grm.cc" /* yacc.c:1646 */ + case 58: +#line 219 "pars0grm.y" + { yyval = pars_stored_procedure_call( + static_cast<sym_node_t*>(yyvsp[-4])); } +#line 1809 "pars0grm.cc" break; - case 56: -#line 231 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_substr_token; } -#line 1887 "pars0grm.cc" /* yacc.c:1646 */ + case 59: +#line 224 "pars0grm.y" + { yyval = yyvsp[-2]; } +#line 1815 "pars0grm.cc" break; - case 57: -#line 232 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_concat_token; } -#line 1893 "pars0grm.cc" /* yacc.c:1646 */ + case 60: +#line 228 "pars0grm.y" + { yyval = que_node_list_add_last(NULL, yyvsp[0]); } +#line 1821 "pars0grm.cc" break; - case 58: -#line 233 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_instr_token; } -#line 1899 "pars0grm.cc" /* yacc.c:1646 */ + case 61: +#line 230 "pars0grm.y" + { yyval = que_node_list_add_last(yyvsp[-2], yyvsp[0]); } +#line 1827 "pars0grm.cc" break; - case 59: -#line 234 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_length_token; } -#line 1905 "pars0grm.cc" /* yacc.c:1646 */ + case 62: +#line 234 "pars0grm.y" + { yyval = NULL; } +#line 1833 "pars0grm.cc" break; - case 60: -#line 235 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_sysdate_token; } -#line 1911 "pars0grm.cc" /* yacc.c:1646 */ + case 63: +#line 235 "pars0grm.y" + { yyval = que_node_list_add_last(NULL, yyvsp[0]); } +#line 1839 "pars0grm.cc" break; - case 61: -#line 236 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_rnd_token; } -#line 1917 "pars0grm.cc" /* yacc.c:1646 */ + case 64: +#line 237 "pars0grm.y" + { yyval = que_node_list_add_last(yyvsp[-2], yyvsp[0]); } +#line 1845 "pars0grm.cc" break; - case 62: -#line 237 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_rnd_str_token; } -#line 1923 "pars0grm.cc" /* yacc.c:1646 */ + case 65: +#line 241 "pars0grm.y" + { yyval = NULL; } +#line 1851 "pars0grm.cc" break; case 66: -#line 248 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_stored_procedure_call( - static_cast<sym_node_t*>((yyvsp[-4]))); } -#line 1930 "pars0grm.cc" /* yacc.c:1646 */ +#line 242 "pars0grm.y" + { yyval = que_node_list_add_last(NULL, yyvsp[0]);} +#line 1857 "pars0grm.cc" break; case 67: -#line 254 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_procedure_call((yyvsp[-3]), (yyvsp[-1])); } -#line 1936 "pars0grm.cc" /* yacc.c:1646 */ +#line 243 "pars0grm.y" + { yyval = que_node_list_add_last(yyvsp[-2], yyvsp[0]); } +#line 1863 "pars0grm.cc" break; case 68: -#line 258 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_replstr_token; } -#line 1942 "pars0grm.cc" /* yacc.c:1646 */ +#line 247 "pars0grm.y" + { yyval = yyvsp[0]; } +#line 1869 "pars0grm.cc" break; case 69: -#line 259 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_printf_token; } -#line 1948 "pars0grm.cc" /* yacc.c:1646 */ +#line 249 "pars0grm.y" + { yyval = pars_func(&pars_count_token, + que_node_list_add_last(NULL, + sym_tab_add_int_lit( + pars_sym_tab_global, 1))); } +#line 1878 "pars0grm.cc" break; case 70: -#line 260 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_assert_token; } -#line 1954 "pars0grm.cc" /* yacc.c:1646 */ +#line 256 "pars0grm.y" + { yyval = NULL; } +#line 1884 "pars0grm.cc" break; case 71: -#line 264 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[-2]); } -#line 1960 "pars0grm.cc" /* yacc.c:1646 */ +#line 257 "pars0grm.y" + { yyval = que_node_list_add_last(NULL, yyvsp[0]); } +#line 1890 "pars0grm.cc" break; case 72: -#line 268 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last(NULL, (yyvsp[0])); } -#line 1966 "pars0grm.cc" /* yacc.c:1646 */ +#line 259 "pars0grm.y" + { yyval = que_node_list_add_last(yyvsp[-2], yyvsp[0]); } +#line 1896 "pars0grm.cc" break; case 73: -#line 270 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last((yyvsp[-2]), (yyvsp[0])); } -#line 1972 "pars0grm.cc" /* yacc.c:1646 */ +#line 263 "pars0grm.y" + { yyval = pars_select_list(&pars_star_denoter, + NULL); } +#line 1903 "pars0grm.cc" break; case 74: -#line 274 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 1978 "pars0grm.cc" /* yacc.c:1646 */ +#line 266 "pars0grm.y" + { yyval = pars_select_list( + yyvsp[-2], static_cast<sym_node_t*>(yyvsp[0])); } +#line 1910 "pars0grm.cc" break; case 75: -#line 275 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last(NULL, (yyvsp[0])); } -#line 1984 "pars0grm.cc" /* yacc.c:1646 */ +#line 268 "pars0grm.y" + { yyval = pars_select_list(yyvsp[0], NULL); } +#line 1916 "pars0grm.cc" break; case 76: -#line 277 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last((yyvsp[-2]), (yyvsp[0])); } -#line 1990 "pars0grm.cc" /* yacc.c:1646 */ +#line 272 "pars0grm.y" + { yyval = NULL; } +#line 1922 "pars0grm.cc" break; case 77: -#line 281 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 1996 "pars0grm.cc" /* yacc.c:1646 */ +#line 273 "pars0grm.y" + { yyval = yyvsp[0]; } +#line 1928 "pars0grm.cc" break; case 78: -#line 282 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last(NULL, (yyvsp[0]));} -#line 2002 "pars0grm.cc" /* yacc.c:1646 */ +#line 277 "pars0grm.y" + { yyval = NULL; } +#line 1934 "pars0grm.cc" break; case 79: -#line 283 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last((yyvsp[-2]), (yyvsp[0])); } -#line 2008 "pars0grm.cc" /* yacc.c:1646 */ +#line 279 "pars0grm.y" + { yyval = &pars_update_token; } +#line 1940 "pars0grm.cc" break; case 80: -#line 287 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]); } -#line 2014 "pars0grm.cc" /* yacc.c:1646 */ +#line 283 "pars0grm.y" + { yyval = NULL; } +#line 1946 "pars0grm.cc" break; case 81: -#line 289 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_func(&pars_count_token, - que_node_list_add_last(NULL, - sym_tab_add_int_lit( - pars_sym_tab_global, 1))); } -#line 2023 "pars0grm.cc" /* yacc.c:1646 */ +#line 285 "pars0grm.y" + { yyval = &pars_share_token; } +#line 1952 "pars0grm.cc" break; case 82: -#line 294 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_func(&pars_count_token, - que_node_list_add_last(NULL, - pars_func(&pars_distinct_token, - que_node_list_add_last( - NULL, (yyvsp[-1]))))); } -#line 2033 "pars0grm.cc" /* yacc.c:1646 */ +#line 289 "pars0grm.y" + { yyval = &pars_asc_token; } +#line 1958 "pars0grm.cc" break; case 83: -#line 300 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_func(&pars_sum_token, - que_node_list_add_last(NULL, - (yyvsp[-1]))); } -#line 2041 "pars0grm.cc" /* yacc.c:1646 */ +#line 290 "pars0grm.y" + { yyval = &pars_asc_token; } +#line 1964 "pars0grm.cc" break; case 84: -#line 306 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2047 "pars0grm.cc" /* yacc.c:1646 */ +#line 291 "pars0grm.y" + { yyval = &pars_desc_token; } +#line 1970 "pars0grm.cc" break; case 85: -#line 307 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last(NULL, (yyvsp[0])); } -#line 2053 "pars0grm.cc" /* yacc.c:1646 */ +#line 295 "pars0grm.y" + { yyval = NULL; } +#line 1976 "pars0grm.cc" break; case 86: -#line 309 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last((yyvsp[-2]), (yyvsp[0])); } -#line 2059 "pars0grm.cc" /* yacc.c:1646 */ +#line 297 "pars0grm.y" + { yyval = pars_order_by( + static_cast<sym_node_t*>(yyvsp[-1]), + static_cast<pars_res_word_t*>(yyvsp[0])); } +#line 1984 "pars0grm.cc" break; case 87: -#line 313 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_select_list(&pars_star_denoter, - NULL); } -#line 2066 "pars0grm.cc" /* yacc.c:1646 */ +#line 308 "pars0grm.y" + { yyval = pars_select_statement( + static_cast<sel_node_t*>(yyvsp[-6]), + static_cast<sym_node_t*>(yyvsp[-4]), + static_cast<que_node_t*>(yyvsp[-3]), + static_cast<pars_res_word_t*>(yyvsp[-2]), + static_cast<pars_res_word_t*>(yyvsp[-1]), + static_cast<order_node_t*>(yyvsp[0])); } +#line 1996 "pars0grm.cc" break; case 88: -#line 316 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_select_list( - (yyvsp[-2]), static_cast<sym_node_t*>((yyvsp[0]))); } -#line 2073 "pars0grm.cc" /* yacc.c:1646 */ +#line 319 "pars0grm.y" + { yyval = yyvsp[0]; } +#line 2002 "pars0grm.cc" break; case 89: -#line 318 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_select_list((yyvsp[0]), NULL); } -#line 2079 "pars0grm.cc" /* yacc.c:1646 */ +#line 324 "pars0grm.y" + { yyval = pars_insert_statement( + static_cast<sym_node_t*>(yyvsp[-4]), yyvsp[-1], NULL); } +#line 2009 "pars0grm.cc" break; case 90: -#line 322 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2085 "pars0grm.cc" /* yacc.c:1646 */ +#line 327 "pars0grm.y" + { yyval = pars_insert_statement( + static_cast<sym_node_t*>(yyvsp[-1]), + NULL, + static_cast<sel_node_t*>(yyvsp[0])); } +#line 2018 "pars0grm.cc" break; case 91: -#line 323 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]); } -#line 2091 "pars0grm.cc" /* yacc.c:1646 */ +#line 334 "pars0grm.y" + { yyval = pars_column_assignment( + static_cast<sym_node_t*>(yyvsp[-2]), + static_cast<que_node_t*>(yyvsp[0])); } +#line 2026 "pars0grm.cc" break; case 92: -#line 327 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2097 "pars0grm.cc" /* yacc.c:1646 */ +#line 340 "pars0grm.y" + { yyval = que_node_list_add_last(NULL, yyvsp[0]); } +#line 2032 "pars0grm.cc" break; case 93: -#line 329 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_update_token; } -#line 2103 "pars0grm.cc" /* yacc.c:1646 */ +#line 342 "pars0grm.y" + { yyval = que_node_list_add_last(yyvsp[-2], yyvsp[0]); } +#line 2038 "pars0grm.cc" break; case 94: -#line 333 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2109 "pars0grm.cc" /* yacc.c:1646 */ +#line 348 "pars0grm.y" + { yyval = yyvsp[0]; } +#line 2044 "pars0grm.cc" break; case 95: -#line 335 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_share_token; } -#line 2115 "pars0grm.cc" /* yacc.c:1646 */ +#line 354 "pars0grm.y" + { yyval = pars_update_statement_start( + FALSE, + static_cast<sym_node_t*>(yyvsp[-2]), + static_cast<col_assign_node_t*>(yyvsp[0])); } +#line 2053 "pars0grm.cc" break; case 96: -#line 339 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_asc_token; } -#line 2121 "pars0grm.cc" /* yacc.c:1646 */ +#line 362 "pars0grm.y" + { yyval = pars_update_statement( + static_cast<upd_node_t*>(yyvsp[-1]), + NULL, + static_cast<que_node_t*>(yyvsp[0])); } +#line 2062 "pars0grm.cc" break; case 97: -#line 340 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_asc_token; } -#line 2127 "pars0grm.cc" /* yacc.c:1646 */ +#line 370 "pars0grm.y" + { yyval = pars_update_statement( + static_cast<upd_node_t*>(yyvsp[-1]), + static_cast<sym_node_t*>(yyvsp[0]), + NULL); } +#line 2071 "pars0grm.cc" break; case 98: -#line 341 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_desc_token; } -#line 2133 "pars0grm.cc" /* yacc.c:1646 */ +#line 378 "pars0grm.y" + { yyval = pars_update_statement_start( + TRUE, + static_cast<sym_node_t*>(yyvsp[0]), NULL); } +#line 2079 "pars0grm.cc" break; case 99: -#line 345 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2139 "pars0grm.cc" /* yacc.c:1646 */ +#line 385 "pars0grm.y" + { yyval = pars_update_statement( + static_cast<upd_node_t*>(yyvsp[-1]), + NULL, + static_cast<que_node_t*>(yyvsp[0])); } +#line 2088 "pars0grm.cc" break; case 100: -#line 347 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_order_by( - static_cast<sym_node_t*>((yyvsp[-1])), - static_cast<pars_res_word_t*>((yyvsp[0]))); } -#line 2147 "pars0grm.cc" /* yacc.c:1646 */ +#line 393 "pars0grm.y" + { yyval = pars_update_statement( + static_cast<upd_node_t*>(yyvsp[-1]), + static_cast<sym_node_t*>(yyvsp[0]), + NULL); } +#line 2097 "pars0grm.cc" break; case 101: -#line 358 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_select_statement( - static_cast<sel_node_t*>((yyvsp[-6])), - static_cast<sym_node_t*>((yyvsp[-4])), - static_cast<que_node_t*>((yyvsp[-3])), - static_cast<pars_res_word_t*>((yyvsp[-2])), - static_cast<pars_res_word_t*>((yyvsp[-1])), - static_cast<order_node_t*>((yyvsp[0]))); } -#line 2159 "pars0grm.cc" /* yacc.c:1646 */ +#line 401 "pars0grm.y" + { yyval = pars_assignment_statement( + static_cast<sym_node_t*>(yyvsp[-2]), + static_cast<que_node_t*>(yyvsp[0])); } +#line 2105 "pars0grm.cc" break; case 102: -#line 369 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]); } -#line 2165 "pars0grm.cc" /* yacc.c:1646 */ +#line 409 "pars0grm.y" + { yyval = pars_elsif_element(yyvsp[-2], yyvsp[0]); } +#line 2111 "pars0grm.cc" break; case 103: -#line 374 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_insert_statement( - static_cast<sym_node_t*>((yyvsp[-4])), (yyvsp[-1]), NULL); } -#line 2172 "pars0grm.cc" /* yacc.c:1646 */ +#line 413 "pars0grm.y" + { yyval = que_node_list_add_last(NULL, yyvsp[0]); } +#line 2117 "pars0grm.cc" break; case 104: -#line 377 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_insert_statement( - static_cast<sym_node_t*>((yyvsp[-1])), - NULL, - static_cast<sel_node_t*>((yyvsp[0]))); } -#line 2181 "pars0grm.cc" /* yacc.c:1646 */ +#line 415 "pars0grm.y" + { yyval = que_node_list_add_last(yyvsp[-1], yyvsp[0]); } +#line 2123 "pars0grm.cc" break; case 105: -#line 384 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_column_assignment( - static_cast<sym_node_t*>((yyvsp[-2])), - static_cast<que_node_t*>((yyvsp[0]))); } -#line 2189 "pars0grm.cc" /* yacc.c:1646 */ +#line 419 "pars0grm.y" + { yyval = NULL; } +#line 2129 "pars0grm.cc" break; case 106: -#line 390 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last(NULL, (yyvsp[0])); } -#line 2195 "pars0grm.cc" /* yacc.c:1646 */ +#line 421 "pars0grm.y" + { yyval = yyvsp[0]; } +#line 2135 "pars0grm.cc" break; case 107: -#line 392 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last((yyvsp[-2]), (yyvsp[0])); } -#line 2201 "pars0grm.cc" /* yacc.c:1646 */ +#line 422 "pars0grm.y" + { yyval = yyvsp[0]; } +#line 2141 "pars0grm.cc" break; case 108: -#line 398 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]); } -#line 2207 "pars0grm.cc" /* yacc.c:1646 */ +#line 429 "pars0grm.y" + { yyval = pars_if_statement(yyvsp[-5], yyvsp[-3], yyvsp[-2]); } +#line 2147 "pars0grm.cc" break; case 109: -#line 404 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_update_statement_start( - FALSE, - static_cast<sym_node_t*>((yyvsp[-2])), - static_cast<col_assign_node_t*>((yyvsp[0]))); } -#line 2216 "pars0grm.cc" /* yacc.c:1646 */ +#line 435 "pars0grm.y" + { yyval = pars_while_statement(yyvsp[-4], yyvsp[-2]); } +#line 2153 "pars0grm.cc" break; case 110: -#line 412 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_update_statement( - static_cast<upd_node_t*>((yyvsp[-1])), - NULL, - static_cast<que_node_t*>((yyvsp[0]))); } -#line 2225 "pars0grm.cc" /* yacc.c:1646 */ +#line 443 "pars0grm.y" + { yyval = pars_for_statement( + static_cast<sym_node_t*>(yyvsp[-8]), + yyvsp[-6], yyvsp[-4], yyvsp[-2]); } +#line 2161 "pars0grm.cc" break; case 111: -#line 420 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_update_statement( - static_cast<upd_node_t*>((yyvsp[-1])), - static_cast<sym_node_t*>((yyvsp[0])), - NULL); } -#line 2234 "pars0grm.cc" /* yacc.c:1646 */ +#line 449 "pars0grm.y" + { yyval = pars_exit_statement(); } +#line 2167 "pars0grm.cc" break; case 112: -#line 428 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_update_statement_start( - TRUE, - static_cast<sym_node_t*>((yyvsp[0])), NULL); } -#line 2242 "pars0grm.cc" /* yacc.c:1646 */ +#line 453 "pars0grm.y" + { yyval = pars_return_statement(); } +#line 2173 "pars0grm.cc" break; case 113: -#line 435 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_update_statement( - static_cast<upd_node_t*>((yyvsp[-1])), - NULL, - static_cast<que_node_t*>((yyvsp[0]))); } -#line 2251 "pars0grm.cc" /* yacc.c:1646 */ +#line 458 "pars0grm.y" + { yyval = pars_open_statement( + ROW_SEL_OPEN_CURSOR, + static_cast<sym_node_t*>(yyvsp[0])); } +#line 2181 "pars0grm.cc" break; case 114: -#line 443 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_update_statement( - static_cast<upd_node_t*>((yyvsp[-1])), - static_cast<sym_node_t*>((yyvsp[0])), - NULL); } -#line 2260 "pars0grm.cc" /* yacc.c:1646 */ +#line 465 "pars0grm.y" + { yyval = pars_open_statement( + ROW_SEL_CLOSE_CURSOR, + static_cast<sym_node_t*>(yyvsp[0])); } +#line 2189 "pars0grm.cc" break; case 115: -#line 451 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_row_printf_statement( - static_cast<sel_node_t*>((yyvsp[0]))); } -#line 2267 "pars0grm.cc" /* yacc.c:1646 */ +#line 472 "pars0grm.y" + { yyval = pars_fetch_statement( + static_cast<sym_node_t*>(yyvsp[-2]), + static_cast<sym_node_t*>(yyvsp[0]), NULL); } +#line 2197 "pars0grm.cc" break; case 116: -#line 457 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_assignment_statement( - static_cast<sym_node_t*>((yyvsp[-2])), - static_cast<que_node_t*>((yyvsp[0]))); } -#line 2275 "pars0grm.cc" /* yacc.c:1646 */ +#line 476 "pars0grm.y" + { yyval = pars_fetch_statement( + static_cast<sym_node_t*>(yyvsp[-2]), + NULL, + static_cast<sym_node_t*>(yyvsp[0])); } +#line 2206 "pars0grm.cc" break; case 117: -#line 465 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_elsif_element((yyvsp[-2]), (yyvsp[0])); } -#line 2281 "pars0grm.cc" /* yacc.c:1646 */ +#line 484 "pars0grm.y" + { yyval = pars_column_def( + static_cast<sym_node_t*>(yyvsp[-3]), + static_cast<pars_res_word_t*>(yyvsp[-2]), + static_cast<sym_node_t*>(yyvsp[-1]), + yyvsp[0]); } +#line 2216 "pars0grm.cc" break; case 118: -#line 469 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last(NULL, (yyvsp[0])); } -#line 2287 "pars0grm.cc" /* yacc.c:1646 */ +#line 492 "pars0grm.y" + { yyval = que_node_list_add_last(NULL, yyvsp[0]); } +#line 2222 "pars0grm.cc" break; case 119: -#line 471 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last((yyvsp[-1]), (yyvsp[0])); } -#line 2293 "pars0grm.cc" /* yacc.c:1646 */ +#line 494 "pars0grm.y" + { yyval = que_node_list_add_last(yyvsp[-2], yyvsp[0]); } +#line 2228 "pars0grm.cc" break; case 120: -#line 475 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2299 "pars0grm.cc" /* yacc.c:1646 */ +#line 498 "pars0grm.y" + { yyval = NULL; } +#line 2234 "pars0grm.cc" break; case 121: -#line 477 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]); } -#line 2305 "pars0grm.cc" /* yacc.c:1646 */ +#line 500 "pars0grm.y" + { yyval = yyvsp[-1]; } +#line 2240 "pars0grm.cc" break; case 122: -#line 478 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]); } -#line 2311 "pars0grm.cc" /* yacc.c:1646 */ +#line 504 "pars0grm.y" + { yyval = NULL; } +#line 2246 "pars0grm.cc" break; case 123: -#line 485 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_if_statement((yyvsp[-5]), (yyvsp[-3]), (yyvsp[-2])); } -#line 2317 "pars0grm.cc" /* yacc.c:1646 */ +#line 506 "pars0grm.y" + { yyval = &pars_int_token; + /* pass any non-NULL pointer */ } +#line 2253 "pars0grm.cc" break; case 124: -#line 491 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_while_statement((yyvsp[-4]), (yyvsp[-2])); } -#line 2323 "pars0grm.cc" /* yacc.c:1646 */ +#line 513 "pars0grm.y" + { yyval = pars_create_table( + static_cast<sym_node_t*>(yyvsp[-3]), + static_cast<sym_node_t*>(yyvsp[-1])); } +#line 2261 "pars0grm.cc" break; case 125: -#line 499 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_for_statement( - static_cast<sym_node_t*>((yyvsp[-8])), - (yyvsp[-6]), (yyvsp[-4]), (yyvsp[-2])); } -#line 2331 "pars0grm.cc" /* yacc.c:1646 */ +#line 519 "pars0grm.y" + { yyval = que_node_list_add_last(NULL, yyvsp[0]); } +#line 2267 "pars0grm.cc" break; case 126: -#line 505 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_exit_statement(); } -#line 2337 "pars0grm.cc" /* yacc.c:1646 */ +#line 521 "pars0grm.y" + { yyval = que_node_list_add_last(yyvsp[-2], yyvsp[0]); } +#line 2273 "pars0grm.cc" break; case 127: -#line 509 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_return_statement(); } -#line 2343 "pars0grm.cc" /* yacc.c:1646 */ +#line 525 "pars0grm.y" + { yyval = NULL; } +#line 2279 "pars0grm.cc" break; case 128: -#line 514 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_open_statement( - ROW_SEL_OPEN_CURSOR, - static_cast<sym_node_t*>((yyvsp[0]))); } -#line 2351 "pars0grm.cc" /* yacc.c:1646 */ +#line 526 "pars0grm.y" + { yyval = &pars_unique_token; } +#line 2285 "pars0grm.cc" break; case 129: -#line 521 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_open_statement( - ROW_SEL_CLOSE_CURSOR, - static_cast<sym_node_t*>((yyvsp[0]))); } -#line 2359 "pars0grm.cc" /* yacc.c:1646 */ +#line 530 "pars0grm.y" + { yyval = NULL; } +#line 2291 "pars0grm.cc" break; case 130: -#line 528 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_fetch_statement( - static_cast<sym_node_t*>((yyvsp[-2])), - static_cast<sym_node_t*>((yyvsp[0])), NULL); } -#line 2367 "pars0grm.cc" /* yacc.c:1646 */ +#line 531 "pars0grm.y" + { yyval = &pars_clustered_token; } +#line 2297 "pars0grm.cc" break; case 131: -#line 532 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_fetch_statement( - static_cast<sym_node_t*>((yyvsp[-2])), - NULL, - static_cast<sym_node_t*>((yyvsp[0]))); } -#line 2376 "pars0grm.cc" /* yacc.c:1646 */ +#line 540 "pars0grm.y" + { yyval = pars_create_index( + static_cast<pars_res_word_t*>(yyvsp[-8]), + static_cast<pars_res_word_t*>(yyvsp[-7]), + static_cast<sym_node_t*>(yyvsp[-5]), + static_cast<sym_node_t*>(yyvsp[-3]), + static_cast<sym_node_t*>(yyvsp[-1])); } +#line 2308 "pars0grm.cc" break; case 132: -#line 540 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_column_def( - static_cast<sym_node_t*>((yyvsp[-4])), - static_cast<pars_res_word_t*>((yyvsp[-3])), - static_cast<sym_node_t*>((yyvsp[-2])), - (yyvsp[-1]), (yyvsp[0])); } -#line 2386 "pars0grm.cc" /* yacc.c:1646 */ +#line 549 "pars0grm.y" + { yyval = yyvsp[0]; } +#line 2314 "pars0grm.cc" break; case 133: -#line 548 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last(NULL, (yyvsp[0])); } -#line 2392 "pars0grm.cc" /* yacc.c:1646 */ +#line 550 "pars0grm.y" + { yyval = yyvsp[0]; } +#line 2320 "pars0grm.cc" break; case 134: -#line 550 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last((yyvsp[-2]), (yyvsp[0])); } -#line 2398 "pars0grm.cc" /* yacc.c:1646 */ +#line 555 "pars0grm.y" + { yyval = pars_commit_statement(); } +#line 2326 "pars0grm.cc" break; case 135: -#line 554 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2404 "pars0grm.cc" /* yacc.c:1646 */ +#line 560 "pars0grm.y" + { yyval = pars_rollback_statement(); } +#line 2332 "pars0grm.cc" break; case 136: -#line 556 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[-1]); } -#line 2410 "pars0grm.cc" /* yacc.c:1646 */ +#line 564 "pars0grm.y" + { yyval = &pars_int_token; } +#line 2338 "pars0grm.cc" break; case 137: -#line 560 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2416 "pars0grm.cc" /* yacc.c:1646 */ +#line 565 "pars0grm.y" + { yyval = &pars_bigint_token; } +#line 2344 "pars0grm.cc" break; case 138: -#line 562 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_int_token; - /* pass any non-NULL pointer */ } -#line 2423 "pars0grm.cc" /* yacc.c:1646 */ +#line 566 "pars0grm.y" + { yyval = &pars_char_token; } +#line 2350 "pars0grm.cc" break; case 139: -#line 567 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2429 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 140: -#line 569 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_int_token; - /* pass any non-NULL pointer */ } -#line 2436 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 141: -#line 574 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2442 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 142: -#line 575 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_int_token; - /* pass any non-NULL pointer */ } -#line 2449 "pars0grm.cc" /* yacc.c:1646 */ +#line 571 "pars0grm.y" + { yyval = pars_variable_declaration( + static_cast<sym_node_t*>(yyvsp[-2]), + static_cast<pars_res_word_t*>(yyvsp[-1])); } +#line 2358 "pars0grm.cc" break; case 143: -#line 580 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2455 "pars0grm.cc" /* yacc.c:1646 */ +#line 585 "pars0grm.y" + { yyval = pars_cursor_declaration( + static_cast<sym_node_t*>(yyvsp[-3]), + static_cast<sel_node_t*>(yyvsp[-1])); } +#line 2366 "pars0grm.cc" break; case 144: -#line 582 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]); } -#line 2461 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 145: -#line 589 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_create_table( - static_cast<sym_node_t*>((yyvsp[-5])), - static_cast<sym_node_t*>((yyvsp[-3])), - static_cast<sym_node_t*>((yyvsp[-1])), - static_cast<sym_node_t*>((yyvsp[0]))); } -#line 2471 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 146: -#line 597 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last(NULL, (yyvsp[0])); } -#line 2477 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 147: -#line 599 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last((yyvsp[-2]), (yyvsp[0])); } -#line 2483 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 148: -#line 603 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2489 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 149: -#line 604 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_unique_token; } -#line 2495 "pars0grm.cc" /* yacc.c:1646 */ +#line 592 "pars0grm.y" + { yyval = pars_function_declaration( + static_cast<sym_node_t*>(yyvsp[-1])); } +#line 2373 "pars0grm.cc" break; case 150: -#line 608 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2501 "pars0grm.cc" /* yacc.c:1646 */ +#line 614 "pars0grm.y" + { yyval = pars_procedure_definition( + static_cast<sym_node_t*>(yyvsp[-8]), yyvsp[-1]); } +#line 2380 "pars0grm.cc" break; - case 151: -#line 609 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_clustered_token; } -#line 2507 "pars0grm.cc" /* yacc.c:1646 */ - break; - case 152: -#line 618 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_create_index( - static_cast<pars_res_word_t*>((yyvsp[-8])), - static_cast<pars_res_word_t*>((yyvsp[-7])), - static_cast<sym_node_t*>((yyvsp[-5])), - static_cast<sym_node_t*>((yyvsp[-3])), - static_cast<sym_node_t*>((yyvsp[-1]))); } -#line 2518 "pars0grm.cc" /* yacc.c:1646 */ - break; +#line 2384 "pars0grm.cc" - case 153: -#line 627 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]); } -#line 2524 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 154: -#line 628 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = (yyvsp[0]); } -#line 2530 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 155: -#line 633 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_commit_statement(); } -#line 2536 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 156: -#line 638 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_rollback_statement(); } -#line 2542 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 157: -#line 642 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_int_token; } -#line 2548 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 158: -#line 643 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_bigint_token; } -#line 2554 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 159: -#line 644 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_char_token; } -#line 2560 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 160: -#line 645 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_binary_token; } -#line 2566 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 161: -#line 646 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = &pars_blob_token; } -#line 2572 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 162: -#line 651 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_parameter_declaration( - static_cast<sym_node_t*>((yyvsp[-2])), - PARS_INPUT, - static_cast<pars_res_word_t*>((yyvsp[0]))); } -#line 2581 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 163: -#line 656 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_parameter_declaration( - static_cast<sym_node_t*>((yyvsp[-2])), - PARS_OUTPUT, - static_cast<pars_res_word_t*>((yyvsp[0]))); } -#line 2590 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 164: -#line 663 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = NULL; } -#line 2596 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 165: -#line 664 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last(NULL, (yyvsp[0])); } -#line 2602 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 166: -#line 666 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = que_node_list_add_last((yyvsp[-2]), (yyvsp[0])); } -#line 2608 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 167: -#line 671 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_variable_declaration( - static_cast<sym_node_t*>((yyvsp[-2])), - static_cast<pars_res_word_t*>((yyvsp[-1]))); } -#line 2616 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 171: -#line 685 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_cursor_declaration( - static_cast<sym_node_t*>((yyvsp[-3])), - static_cast<sel_node_t*>((yyvsp[-1]))); } -#line 2624 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 172: -#line 692 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_function_declaration( - static_cast<sym_node_t*>((yyvsp[-1]))); } -#line 2631 "pars0grm.cc" /* yacc.c:1646 */ - break; - - case 178: -#line 714 "pars0grm.y" /* yacc.c:1646 */ - { (yyval) = pars_procedure_definition( - static_cast<sym_node_t*>((yyvsp[-9])), - static_cast<sym_node_t*>((yyvsp[-7])), - (yyvsp[-1])); } -#line 2640 "pars0grm.cc" /* yacc.c:1646 */ - break; - - -#line 2644 "pars0grm.cc" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -2665,14 +2406,13 @@ yyreduce: /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } goto yynewstate; @@ -2755,12 +2495,10 @@ yyerrlab: | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ @@ -2822,6 +2560,7 @@ yyacceptlab: yyresult = 0; goto yyreturn; + /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ @@ -2829,6 +2568,7 @@ yyabortlab: yyresult = 1; goto yyreturn; + #if !defined yyoverflow || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | @@ -2839,6 +2579,10 @@ yyexhaustedlab: /* Fall through. */ #endif + +/*-----------------------------------------------------. +| yyreturn -- parsing is finished, return the result. | +`-----------------------------------------------------*/ yyreturn: if (yychar != YYEMPTY) { @@ -2868,5 +2612,5 @@ yyreturn: #endif return yyresult; } -#line 720 "pars0grm.y" /* yacc.c:1906 */ +#line 618 "pars0grm.y" diff --git a/storage/innobase/pars/pars0grm.y b/storage/innobase/pars/pars0grm.y index 27638e06a66..625ed41bbd4 100644 --- a/storage/innobase/pars/pars0grm.y +++ b/storage/innobase/pars/pars0grm.y @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2014, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -58,11 +58,7 @@ yylex(void); %token PARS_NE_TOKEN %token PARS_PROCEDURE_TOKEN %token PARS_IN_TOKEN -%token PARS_OUT_TOKEN -%token PARS_BINARY_TOKEN -%token PARS_BLOB_TOKEN %token PARS_INT_TOKEN -%token PARS_FLOAT_TOKEN %token PARS_CHAR_TOKEN %token PARS_IS_TOKEN %token PARS_BEGIN_TOKEN @@ -75,14 +71,11 @@ yylex(void); %token PARS_WHILE_TOKEN %token PARS_RETURN_TOKEN %token PARS_SELECT_TOKEN -%token PARS_SUM_TOKEN %token PARS_COUNT_TOKEN -%token PARS_DISTINCT_TOKEN %token PARS_FROM_TOKEN %token PARS_WHERE_TOKEN %token PARS_FOR_TOKEN %token PARS_DDOT_TOKEN -%token PARS_READ_TOKEN %token PARS_ORDER_TOKEN %token PARS_BY_TOKEN %token PARS_ASC_TOKEN @@ -109,25 +102,14 @@ yylex(void); %token PARS_FETCH_TOKEN %token PARS_CLOSE_TOKEN %token PARS_NOTFOUND_TOKEN -%token PARS_TO_CHAR_TOKEN -%token PARS_TO_NUMBER_TOKEN %token PARS_TO_BINARY_TOKEN -%token PARS_BINARY_TO_NUMBER_TOKEN %token PARS_SUBSTR_TOKEN -%token PARS_REPLSTR_TOKEN %token PARS_CONCAT_TOKEN %token PARS_INSTR_TOKEN %token PARS_LENGTH_TOKEN -%token PARS_SYSDATE_TOKEN -%token PARS_PRINTF_TOKEN -%token PARS_ASSERT_TOKEN -%token PARS_RND_TOKEN -%token PARS_RND_STR_TOKEN -%token PARS_ROW_PRINTF_TOKEN %token PARS_COMMIT_TOKEN %token PARS_ROLLBACK_TOKEN %token PARS_WORK_TOKEN -%token PARS_UNSIGNED_TOKEN %token PARS_EXIT_TOKEN %token PARS_FUNCTION_TOKEN %token PARS_LOCK_TOKEN @@ -139,8 +121,6 @@ yylex(void); %token PARS_LIKE_TOKEN_SUFFIX %token PARS_LIKE_TOKEN_SUBSTR %token PARS_TABLE_NAME_TOKEN -%token PARS_COMPACT_TOKEN -%token PARS_BLOCK_SIZE_TOKEN %token PARS_BIGINT_TOKEN %left PARS_AND_TOKEN PARS_OR_TOKEN @@ -161,7 +141,6 @@ top_statement: statement: stored_procedure_call - | predefined_procedure_call ';' | while_statement ';' | for_statement ';' | exit_statement ';' @@ -170,7 +149,6 @@ statement: | assignment_statement ';' | select_statement ';' | insert_statement ';' - | row_printf_statement ';' | delete_statement_searched ';' | delete_statement_positioned ';' | update_statement_searched ';' @@ -223,18 +201,11 @@ exp: ; function_name: - PARS_TO_CHAR_TOKEN { $$ = &pars_to_char_token; } - | PARS_TO_NUMBER_TOKEN { $$ = &pars_to_number_token; } - | PARS_TO_BINARY_TOKEN { $$ = &pars_to_binary_token; } - | PARS_BINARY_TO_NUMBER_TOKEN - { $$ = &pars_binary_to_number_token; } + PARS_TO_BINARY_TOKEN { $$ = &pars_to_binary_token; } | PARS_SUBSTR_TOKEN { $$ = &pars_substr_token; } | PARS_CONCAT_TOKEN { $$ = &pars_concat_token; } | PARS_INSTR_TOKEN { $$ = &pars_instr_token; } | PARS_LENGTH_TOKEN { $$ = &pars_length_token; } - | PARS_SYSDATE_TOKEN { $$ = &pars_sysdate_token; } - | PARS_RND_TOKEN { $$ = &pars_rnd_token; } - | PARS_RND_STR_TOKEN { $$ = &pars_rnd_str_token; } ; question_mark_list: @@ -249,17 +220,6 @@ stored_procedure_call: static_cast<sym_node_t*>($2)); } ; -predefined_procedure_call: - predefined_procedure_name '(' exp_list ')' - { $$ = pars_procedure_call($1, $3); } -; - -predefined_procedure_name: - PARS_REPLSTR_TOKEN { $$ = &pars_replstr_token; } - | PARS_PRINTF_TOKEN { $$ = &pars_printf_token; } - | PARS_ASSERT_TOKEN { $$ = &pars_assert_token; } -; - user_function_call: PARS_ID_TOKEN '(' ')' { $$ = $1; } ; @@ -287,19 +247,9 @@ select_item: exp { $$ = $1; } | PARS_COUNT_TOKEN '(' '*' ')' { $$ = pars_func(&pars_count_token, - que_node_list_add_last(NULL, + que_node_list_add_last(NULL, sym_tab_add_int_lit( pars_sym_tab_global, 1))); } - | PARS_COUNT_TOKEN '(' PARS_DISTINCT_TOKEN PARS_ID_TOKEN ')' - { $$ = pars_func(&pars_count_token, - que_node_list_add_last(NULL, - pars_func(&pars_distinct_token, - que_node_list_add_last( - NULL, $4)))); } - | PARS_SUM_TOKEN '(' exp ')' - { $$ = pars_func(&pars_sum_token, - que_node_list_add_last(NULL, - $3)); } ; select_item_list: @@ -446,12 +396,6 @@ delete_statement_positioned: NULL); } ; -row_printf_statement: - PARS_ROW_PRINTF_TOKEN select_statement - { $$ = pars_row_printf_statement( - static_cast<sel_node_t*>($2)); } -; - assignment_statement: PARS_ID_TOKEN PARS_ASSIGN_TOKEN exp { $$ = pars_assignment_statement( @@ -536,12 +480,12 @@ fetch_statement: ; column_def: - PARS_ID_TOKEN type_name opt_column_len opt_unsigned opt_not_null + PARS_ID_TOKEN type_name opt_column_len opt_not_null { $$ = pars_column_def( static_cast<sym_node_t*>($1), static_cast<pars_res_word_t*>($2), static_cast<sym_node_t*>($3), - $4, $5); } + $4); } ; column_def_list: @@ -556,13 +500,6 @@ opt_column_len: { $$ = $2; } ; -opt_unsigned: - /* Nothing */ { $$ = NULL; } - | PARS_UNSIGNED_TOKEN - { $$ = &pars_int_token; - /* pass any non-NULL pointer */ } -; - opt_not_null: /* Nothing */ { $$ = NULL; } | PARS_NOT_TOKEN PARS_NULL_LIT @@ -570,27 +507,12 @@ opt_not_null: /* pass any non-NULL pointer */ } ; -compact: - /* Nothing */ { $$ = NULL; } - | PARS_COMPACT_TOKEN { $$ = &pars_int_token; - /* pass any non-NULL pointer */ } -; - -block_size: - /* Nothing */ { $$ = NULL; } - | PARS_BLOCK_SIZE_TOKEN '=' PARS_INT_LIT - { $$ = $3; } -; - create_table: PARS_CREATE_TOKEN PARS_TABLE_TOKEN table_name '(' column_def_list ')' - compact block_size { $$ = pars_create_table( static_cast<sym_node_t*>($3), - static_cast<sym_node_t*>($5), - static_cast<sym_node_t*>($7), - static_cast<sym_node_t*>($8)); } + static_cast<sym_node_t*>($5)); } ; column_list: @@ -642,28 +564,6 @@ type_name: PARS_INT_TOKEN { $$ = &pars_int_token; } | PARS_BIGINT_TOKEN { $$ = &pars_bigint_token; } | PARS_CHAR_TOKEN { $$ = &pars_char_token; } - | PARS_BINARY_TOKEN { $$ = &pars_binary_token; } - | PARS_BLOB_TOKEN { $$ = &pars_blob_token; } -; - -parameter_declaration: - PARS_ID_TOKEN PARS_IN_TOKEN type_name - { $$ = pars_parameter_declaration( - static_cast<sym_node_t*>($1), - PARS_INPUT, - static_cast<pars_res_word_t*>($3)); } - | PARS_ID_TOKEN PARS_OUT_TOKEN type_name - { $$ = pars_parameter_declaration( - static_cast<sym_node_t*>($1), - PARS_OUTPUT, - static_cast<pars_res_word_t*>($3)); } -; - -parameter_declaration_list: - /* Nothing */ { $$ = NULL; } - | parameter_declaration { $$ = que_node_list_add_last(NULL, $1); } - | parameter_declaration_list ',' parameter_declaration - { $$ = que_node_list_add_last($1, $3); } ; variable_declaration: @@ -705,16 +605,14 @@ declaration_list: ; procedure_definition: - PARS_PROCEDURE_TOKEN PARS_ID_TOKEN '(' parameter_declaration_list ')' + PARS_PROCEDURE_TOKEN PARS_ID_TOKEN '(' ')' PARS_IS_TOKEN variable_declaration_list declaration_list PARS_BEGIN_TOKEN statement_list PARS_END_TOKEN { $$ = pars_procedure_definition( - static_cast<sym_node_t*>($2), - static_cast<sym_node_t*>($4), - $10); } + static_cast<sym_node_t*>($2), $9); } ; %% diff --git a/storage/innobase/pars/pars0lex.l b/storage/innobase/pars/pars0lex.l index 2d0e56f400d..8b2df6b7940 100644 --- a/storage/innobase/pars/pars0lex.l +++ b/storage/innobase/pars/pars0lex.l @@ -249,30 +249,10 @@ In the state 'id', only two actions are possible (defined below). */ return(PARS_IN_TOKEN); } -"OUT" { - return(PARS_OUT_TOKEN); -} - -"BINARY" { - return(PARS_BINARY_TOKEN); -} - -"BLOB" { - return(PARS_BLOB_TOKEN); -} - "INT" { return(PARS_INT_TOKEN); } -"INTEGER" { - return(PARS_INT_TOKEN); -} - -"FLOAT" { - return(PARS_FLOAT_TOKEN); -} - "CHAR" { return(PARS_CHAR_TOKEN); } @@ -321,18 +301,10 @@ In the state 'id', only two actions are possible (defined below). */ return(PARS_SELECT_TOKEN); } -"SUM" { - return(PARS_SUM_TOKEN); -} - "COUNT" { return(PARS_COUNT_TOKEN); } -"DISTINCT" { - return(PARS_DISTINCT_TOKEN); -} - "FROM" { return(PARS_FROM_TOKEN); } @@ -345,10 +317,6 @@ In the state 'id', only two actions are possible (defined below). */ return(PARS_FOR_TOKEN); } -"READ" { - return(PARS_READ_TOKEN); -} - "ORDER" { return(PARS_ORDER_TOKEN); } @@ -405,14 +373,6 @@ In the state 'id', only two actions are possible (defined below). */ return(PARS_TABLE_TOKEN); } -"COMPACT" { - return(PARS_COMPACT_TOKEN); -} - -"BLOCK_SIZE" { - return(PARS_BLOCK_SIZE_TOKEN); -} - "INDEX" { return(PARS_INDEX_TOKEN); } @@ -453,30 +413,14 @@ In the state 'id', only two actions are possible (defined below). */ return(PARS_NOTFOUND_TOKEN); } -"TO_CHAR" { - return(PARS_TO_CHAR_TOKEN); -} - -"TO_NUMBER" { - return(PARS_TO_NUMBER_TOKEN); -} - "TO_BINARY" { return(PARS_TO_BINARY_TOKEN); } -"BINARY_TO_NUMBER" { - return(PARS_BINARY_TO_NUMBER_TOKEN); -} - "SUBSTR" { return(PARS_SUBSTR_TOKEN); } -"REPLSTR" { - return(PARS_REPLSTR_TOKEN); -} - "CONCAT" { return(PARS_CONCAT_TOKEN); } @@ -489,30 +433,6 @@ In the state 'id', only two actions are possible (defined below). */ return(PARS_LENGTH_TOKEN); } -"SYSDATE" { - return(PARS_SYSDATE_TOKEN); -} - -"PRINTF" { - return(PARS_PRINTF_TOKEN); -} - -"ASSERT" { - return(PARS_ASSERT_TOKEN); -} - -"RND" { - return(PARS_RND_TOKEN); -} - -"RND_STR" { - return(PARS_RND_STR_TOKEN); -} - -"ROW_PRINTF" { - return(PARS_ROW_PRINTF_TOKEN); -} - "COMMIT" { return(PARS_COMMIT_TOKEN); } @@ -525,10 +445,6 @@ In the state 'id', only two actions are possible (defined below). */ return(PARS_WORK_TOKEN); } -"UNSIGNED" { - return(PARS_UNSIGNED_TOKEN); -} - "EXIT" { return(PARS_EXIT_TOKEN); } diff --git a/storage/innobase/pars/pars0pars.cc b/storage/innobase/pars/pars0pars.cc index 062cb5ae1d2..ebfe7ada3b1 100644 --- a/storage/innobase/pars/pars0pars.cc +++ b/storage/innobase/pars/pars0pars.cc @@ -50,29 +50,15 @@ sym_tab_t* pars_sym_tab_global; /* Global variables used to denote certain reserved words, used in constructing the parsing tree */ -pars_res_word_t pars_to_char_token = {PARS_TO_CHAR_TOKEN}; -pars_res_word_t pars_to_number_token = {PARS_TO_NUMBER_TOKEN}; pars_res_word_t pars_to_binary_token = {PARS_TO_BINARY_TOKEN}; -pars_res_word_t pars_binary_to_number_token = {PARS_BINARY_TO_NUMBER_TOKEN}; pars_res_word_t pars_substr_token = {PARS_SUBSTR_TOKEN}; -pars_res_word_t pars_replstr_token = {PARS_REPLSTR_TOKEN}; pars_res_word_t pars_concat_token = {PARS_CONCAT_TOKEN}; pars_res_word_t pars_instr_token = {PARS_INSTR_TOKEN}; pars_res_word_t pars_length_token = {PARS_LENGTH_TOKEN}; -pars_res_word_t pars_sysdate_token = {PARS_SYSDATE_TOKEN}; -pars_res_word_t pars_printf_token = {PARS_PRINTF_TOKEN}; -pars_res_word_t pars_assert_token = {PARS_ASSERT_TOKEN}; -pars_res_word_t pars_rnd_token = {PARS_RND_TOKEN}; -pars_res_word_t pars_rnd_str_token = {PARS_RND_STR_TOKEN}; pars_res_word_t pars_count_token = {PARS_COUNT_TOKEN}; -pars_res_word_t pars_sum_token = {PARS_SUM_TOKEN}; -pars_res_word_t pars_distinct_token = {PARS_DISTINCT_TOKEN}; -pars_res_word_t pars_binary_token = {PARS_BINARY_TOKEN}; -pars_res_word_t pars_blob_token = {PARS_BLOB_TOKEN}; pars_res_word_t pars_int_token = {PARS_INT_TOKEN}; pars_res_word_t pars_bigint_token = {PARS_BIGINT_TOKEN}; pars_res_word_t pars_char_token = {PARS_CHAR_TOKEN}; -pars_res_word_t pars_float_token = {PARS_FLOAT_TOKEN}; pars_res_word_t pars_update_token = {PARS_UPDATE_TOKEN}; pars_res_word_t pars_asc_token = {PARS_ASC_TOKEN}; pars_res_word_t pars_desc_token = {PARS_DESC_TOKEN}; @@ -195,24 +181,15 @@ pars_func_get_class( case PARS_AND_TOKEN: case PARS_OR_TOKEN: case PARS_NOT_TOKEN: return(PARS_FUNC_LOGICAL); - case PARS_COUNT_TOKEN: case PARS_SUM_TOKEN: + case PARS_COUNT_TOKEN: return(PARS_FUNC_AGGREGATE); - case PARS_TO_CHAR_TOKEN: - case PARS_TO_NUMBER_TOKEN: case PARS_TO_BINARY_TOKEN: - case PARS_BINARY_TO_NUMBER_TOKEN: case PARS_SUBSTR_TOKEN: case PARS_CONCAT_TOKEN: case PARS_LENGTH_TOKEN: case PARS_INSTR_TOKEN: - case PARS_SYSDATE_TOKEN: case PARS_NOTFOUND_TOKEN: - case PARS_PRINTF_TOKEN: - case PARS_ASSERT_TOKEN: - case PARS_RND_TOKEN: - case PARS_RND_STR_TOKEN: - case PARS_REPLSTR_TOKEN: return(PARS_FUNC_PREDEFINED); default: @@ -499,7 +476,6 @@ pars_resolve_func_data_type( arg = node->args; switch (node->func) { - case PARS_SUM_TOKEN: case '+': case '-': case '*': case '/': /* Inherit the data type from the first argument (which must not be the SQL null literal whose type is DATA_ERROR) */ @@ -516,13 +492,6 @@ pars_resolve_func_data_type( dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4); break; - case PARS_TO_CHAR_TOKEN: - case PARS_RND_STR_TOKEN: - ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT); - dtype_set(que_node_get_data_type(node), DATA_VARCHAR, - DATA_ENGLISH, 0); - break; - case PARS_TO_BINARY_TOKEN: if (dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT) { dtype_set(que_node_get_data_type(node), DATA_VARCHAR, @@ -533,19 +502,12 @@ pars_resolve_func_data_type( } break; - case PARS_TO_NUMBER_TOKEN: - case PARS_BINARY_TO_NUMBER_TOKEN: case PARS_LENGTH_TOKEN: case PARS_INSTR_TOKEN: ut_a(pars_is_string_type(que_node_get_data_type(arg)->mtype)); dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4); break; - case PARS_SYSDATE_TOKEN: - ut_a(arg == NULL); - dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4); - break; - case PARS_SUBSTR_TOKEN: case PARS_CONCAT_TOKEN: ut_a(pars_is_string_type(que_node_get_data_type(arg)->mtype)); @@ -566,11 +528,6 @@ pars_resolve_func_data_type( dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4); break; - case PARS_RND_TOKEN: - ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT); - dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4); - break; - case PARS_LIKE_TOKEN_EXACT: case PARS_LIKE_TOKEN_PREFIX: case PARS_LIKE_TOKEN_SUFFIX: @@ -1355,9 +1312,7 @@ pars_set_dfield_type( pars_res_word_t* type, /*!< in: pointer to a type token */ ulint len, /*!< in: length, or 0 */ - ibool is_unsigned, /*!< in: if TRUE, column is - UNSIGNED. */ - ibool is_not_null) /*!< in: if TRUE, column is + bool is_not_null) /*!< in: whether the column is NOT NULL. */ { ulint flags = 0; @@ -1366,10 +1321,6 @@ pars_set_dfield_type( flags |= DATA_NOT_NULL; } - if (is_unsigned) { - flags |= DATA_UNSIGNED; - } - if (type == &pars_bigint_token) { ut_a(len == 0); @@ -1384,16 +1335,6 @@ pars_set_dfield_type( dtype_set(dfield_get_type(dfield), DATA_VARCHAR, DATA_ENGLISH | flags, len); - } else if (type == &pars_binary_token) { - ut_a(len != 0); - - dtype_set(dfield_get_type(dfield), DATA_FIXBINARY, - DATA_BINARY_TYPE | flags, len); - } else if (type == &pars_blob_token) { - ut_a(len == 0); - - dtype_set(dfield_get_type(dfield), DATA_BLOB, - DATA_BINARY_TYPE | flags, 0); } else { ut_error; } @@ -1414,28 +1355,7 @@ pars_variable_declaration( node->param_type = PARS_NOT_PARAM; - pars_set_dfield_type(que_node_get_val(node), type, 0, FALSE, FALSE); - - return(node); -} - -/*********************************************************************//** -Parses a procedure parameter declaration. -@return own: symbol table node of type SYM_VAR */ -sym_node_t* -pars_parameter_declaration( -/*=======================*/ - sym_node_t* node, /*!< in: symbol table node allocated for the - id of the parameter */ - ulint param_type, - /*!< in: PARS_INPUT or PARS_OUTPUT */ - pars_res_word_t* type) /*!< in: pointer to a type token */ -{ - ut_a((param_type == PARS_INPUT) || (param_type == PARS_OUTPUT)); - - pars_variable_declaration(node, type); - - node->param_type = param_type; + pars_set_dfield_type(que_node_get_val(node), type, 0, false); return(node); } @@ -1821,8 +1741,6 @@ pars_column_def( pars_res_word_t* type, /*!< in: data type */ sym_node_t* len, /*!< in: length of column, or NULL */ - void* is_unsigned, /*!< in: if not NULL, column - is of type UNSIGNED. */ void* is_not_null) /*!< in: if not NULL, column is of type NOT NULL. */ { @@ -1835,7 +1753,7 @@ pars_column_def( } pars_set_dfield_type(que_node_get_val(sym_node), type, len2, - is_unsigned != NULL, is_not_null != NULL); + is_not_null != NULL); return(sym_node); } @@ -1848,9 +1766,7 @@ pars_create_table( /*==============*/ sym_node_t* table_sym, /*!< in: table name node in the symbol table */ - sym_node_t* column_defs, /*!< in: list of column names */ - sym_node_t* compact, /* in: non-NULL if COMPACT table. */ - sym_node_t* block_size) /* in: block size (can be NULL) */ + sym_node_t* column_defs) /*!< in: list of column names */ { dict_table_t* table; sym_node_t* column; @@ -1858,57 +1774,11 @@ pars_create_table( const dtype_t* dtype; ulint n_cols; ulint flags = 0; - ulint flags2 = 0; - - if (compact != NULL) { - - /* System tables currently only use the REDUNDANT row - format therefore the check for srv_file_per_table should be - safe for now. */ - - flags |= DICT_TF_COMPACT; - - /* FIXME: Ideally this should be part of the SQL syntax - or use some other mechanism. We want to reduce dependency - on global variables. There is an inherent race here but - that has always existed around this variable. */ - if (srv_file_per_table) { - flags2 |= DICT_TF2_USE_FILE_PER_TABLE; - } - } - - if (block_size != NULL) { - ulint size; - dfield_t* dfield; + ulint flags2 = DICT_TF2_FTS_AUX_HEX_NAME; - dfield = que_node_get_val(block_size); - - ut_a(dfield_get_len(dfield) == 4); - size = mach_read_from_4(static_cast<byte*>( - dfield_get_data(dfield))); - - - switch (size) { - case 0: - break; - - case 1: case 2: case 4: case 8: case 16: - flags |= DICT_TF_COMPACT; - /* FTS-FIXME: needs the zip changes */ - /* flags |= size << DICT_TF_COMPRESSED_SHIFT; */ - break; - - default: - ut_error; - } - } - - /* Set the flags2 when create table or alter tables */ - flags2 |= DICT_TF2_FTS_AUX_HEX_NAME; DBUG_EXECUTE_IF("innodb_test_wrong_fts_aux_table_name", flags2 &= ~DICT_TF2_FTS_AUX_HEX_NAME;); - n_cols = que_node_list_get_len(column_defs); table = dict_mem_table_create( @@ -2005,7 +1875,6 @@ pars_procedure_definition( /*======================*/ sym_node_t* sym_node, /*!< in: procedure id node in the symbol table */ - sym_node_t* param_list, /*!< in: parameter declaration list */ que_node_t* stat_list) /*!< in: statement list */ { proc_node_t* node; @@ -2030,7 +1899,6 @@ pars_procedure_definition( sym_node->resolved = TRUE; node->proc_id = sym_node; - node->param_list = param_list; node->stat_list = stat_list; pars_set_parent_in_list(stat_list, node); diff --git a/storage/innobase/rem/rem0cmp.cc b/storage/innobase/rem/rem0cmp.cc index a61d14bbc1d..b9be9c05073 100644 --- a/storage/innobase/rem/rem0cmp.cc +++ b/storage/innobase/rem/rem0cmp.cc @@ -546,7 +546,7 @@ cmp_dtuple_rec_with_gis( dtuple in some of the common fields, or which has an equal number or more fields than dtuple */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ page_cur_mode_t mode) /*!< in: compare mode */ { const dfield_t* dtuple_field; /* current field in logical record */ @@ -579,7 +579,7 @@ int cmp_dtuple_rec_with_gis_internal( const dtuple_t* dtuple, const rec_t* rec, - const ulint* offsets) + const offset_t* offsets) { const dfield_t* dtuple_field; /* current field in logical record */ ulint dtuple_f_len; /* the length of the current field @@ -650,7 +650,7 @@ int cmp_dtuple_rec_with_match_low( const dtuple_t* dtuple, const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, ulint n_cmp, ulint* matched_fields) { @@ -784,7 +784,7 @@ cmp_dtuple_rec_with_match_bytes( const dtuple_t* dtuple, const rec_t* rec, const dict_index_t* index, - const ulint* offsets, + const offset_t* offsets, ulint* matched_fields, ulint* matched_bytes) { @@ -952,7 +952,7 @@ int cmp_dtuple_rec( const dtuple_t* dtuple, const rec_t* rec, - const ulint* offsets) + const offset_t* offsets) { ulint matched_fields = 0; @@ -970,7 +970,7 @@ cmp_dtuple_is_prefix_of_rec( /*========================*/ const dtuple_t* dtuple, /*!< in: data tuple */ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ulint n_fields; ulint matched_fields = 0; @@ -998,8 +998,8 @@ cmp_rec_rec_simple_field( /*=====================*/ const rec_t* rec1, /*!< in: physical record */ const rec_t* rec2, /*!< in: physical record */ - const ulint* offsets1,/*!< in: rec_get_offsets(rec1, ...) */ - const ulint* offsets2,/*!< in: rec_get_offsets(rec2, ...) */ + const offset_t* offsets1,/*!< in: rec_get_offsets(rec1, ...) */ + const offset_t* offsets2,/*!< in: rec_get_offsets(rec2, ...) */ const dict_index_t* index, /*!< in: data dictionary index */ ulint n) /*!< in: field to compare */ { @@ -1029,8 +1029,8 @@ cmp_rec_rec_simple( /*===============*/ const rec_t* rec1, /*!< in: physical record */ const rec_t* rec2, /*!< in: physical record */ - const ulint* offsets1,/*!< in: rec_get_offsets(rec1, ...) */ - const ulint* offsets2,/*!< in: rec_get_offsets(rec2, ...) */ + const offset_t* offsets1,/*!< in: rec_get_offsets(rec1, ...) */ + const offset_t* offsets2,/*!< in: rec_get_offsets(rec2, ...) */ const dict_index_t* index, /*!< in: data dictionary index */ struct TABLE* table) /*!< in: MySQL table, for reporting duplicate key value if applicable, @@ -1115,8 +1115,8 @@ int cmp_rec_rec_with_match( const rec_t* rec1, const rec_t* rec2, - const ulint* offsets1, - const ulint* offsets2, + const offset_t* offsets1, + const offset_t* offsets2, const dict_index_t* index, bool nulls_unequal, ulint* matched_fields) diff --git a/storage/innobase/rem/rem0rec.cc b/storage/innobase/rem/rem0rec.cc index 91fdddeaf07..c1324c64a9f 100644 --- a/storage/innobase/rem/rem0rec.cc +++ b/storage/innobase/rem/rem0rec.cc @@ -260,13 +260,13 @@ void rec_init_offsets_comp_ordinary( const rec_t* rec, const dict_index_t* index, - ulint* offsets, + offset_t* offsets, ulint n_core, const dict_col_t::def_t*def_val, rec_leaf_format format) { - ulint offs = 0; - ulint any = 0; + offset_t offs = 0; + offset_t any = 0; const byte* nulls = rec; const byte* lens = NULL; ulint n_fields = n_core; @@ -335,14 +335,16 @@ ordinary: } start: +#ifdef UNIV_DEBUG /* We cannot invoke rec_offs_make_valid() if format==REC_LEAF_TEMP. Similarly, rec_offs_validate() will fail in that case, because it invokes rec_get_status(). */ - ut_d(offsets[2] = ulint(rec)); - ut_d(offsets[3] = ulint(index)); + memcpy(&offsets[RECORD_OFFSET], &rec, sizeof(rec)); + memcpy(&offsets[INDEX_OFFSET], &index, sizeof(index)); +#endif /* UNIV_DEBUG */ /* read the lengths of fields 0..n_fields */ - ulint len; + offset_t len; ulint i = 0; const dict_field_t* field = index->fields; @@ -350,12 +352,12 @@ start: if (mblob) { if (i == index->first_user_field()) { offs += FIELD_REF_SIZE; - len = offs | REC_OFFS_EXTERNAL; + len = combine(offs, STORED_OFFPAGE); any |= REC_OFFS_EXTERNAL; field--; continue; } else if (i >= n_fields) { - len = offs | REC_OFFS_DEFAULT; + len = combine(offs, DEFAULT); any |= REC_OFFS_DEFAULT; continue; } @@ -364,20 +366,21 @@ start: } else if (!mblob && def_val) { const dict_col_t::def_t& d = def_val[i - n_core]; if (!d.data) { - len = offs | REC_OFFS_SQL_NULL; + len = combine(offs, SQL_NULL); ut_ad(d.len == UNIV_SQL_NULL); } else { - len = offs | REC_OFFS_DEFAULT; + len = combine(offs, DEFAULT); any |= REC_OFFS_DEFAULT; } continue; } else { - if (!index->instant_field_value(i, &len)) { - ut_ad(len == UNIV_SQL_NULL); - len = offs | REC_OFFS_SQL_NULL; + ulint dlen; + if (!index->instant_field_value(i, &dlen)) { + len = combine(offs, SQL_NULL); + ut_ad(dlen == UNIV_SQL_NULL); } else { - len = offs | REC_OFFS_DEFAULT; + len = combine(offs, DEFAULT); any |= REC_OFFS_DEFAULT; } @@ -401,7 +404,7 @@ start: We do not advance offs, and we set the length to zero and enable the SQL NULL flag in offsets[]. */ - len = offs | REC_OFFS_SQL_NULL; + len = combine(offs, SQL_NULL); continue; } null_mask <<= 1; @@ -424,11 +427,11 @@ start: len <<= 8; len |= *lens--; - offs += len & 0x3fff; + offs += get_value(len); if (UNIV_UNLIKELY(len & 0x4000)) { ut_ad(dict_index_is_clust(index)); any |= REC_OFFS_EXTERNAL; - len = offs | REC_OFFS_EXTERNAL; + len = combine(offs, STORED_OFFPAGE); } else { len = offs; } @@ -444,7 +447,7 @@ start: i < rec_offs_n_fields(offsets)); *rec_offs_base(offsets) - = ulint(rec - (lens + 1)) | REC_OFFS_COMPACT | any; + = static_cast<offset_t>(rec - (lens + 1)) | REC_OFFS_COMPACT | any; } #ifdef UNIV_DEBUG @@ -458,7 +461,7 @@ rec_offs_make_valid( const rec_t* rec, const dict_index_t* index, bool leaf, - ulint* offsets) + offset_t* offsets) { const bool is_alter_metadata = leaf && rec_is_alter_metadata(rec, *index); @@ -482,10 +485,10 @@ rec_offs_make_valid( for (; n < rec_offs_n_fields(offsets); n++) { ut_ad(leaf); ut_ad(is_alter_metadata - || rec_offs_base(offsets)[1 + n] & REC_OFFS_DEFAULT); + || get_type(rec_offs_base(offsets)[1 + n]) == DEFAULT); } - offsets[2] = ulint(rec); - offsets[3] = ulint(index); + memcpy(&offsets[RECORD_OFFSET], &rec, sizeof(rec)); + memcpy(&offsets[INDEX_OFFSET], &index, sizeof(index)); } /** Validate offsets returned by rec_get_offsets(). @@ -497,14 +500,14 @@ bool rec_offs_validate( const rec_t* rec, const dict_index_t* index, - const ulint* offsets) + const offset_t* offsets) { ulint i = rec_offs_n_fields(offsets); ulint last = ULINT_MAX; ulint comp = *rec_offs_base(offsets) & REC_OFFS_COMPACT; if (rec) { - ut_ad(ulint(rec) == offsets[2]); + ut_ad(!memcmp(&rec, &offsets[RECORD_OFFSET], sizeof(rec))); if (!comp) { const bool is_user_rec = rec_get_heap_no_old(rec) >= PAGE_HEAP_NO_USER_LOW; @@ -516,14 +519,14 @@ rec_offs_validate( || (n + (index->id == DICT_INDEXES_ID)) >= index->n_core_fields); for (; n < i; n++) { - ut_ad(rec_offs_base(offsets)[1 + n] - & REC_OFFS_DEFAULT); + ut_ad(get_type(rec_offs_base(offsets)[1 + n]) + == DEFAULT); } } } if (index) { - ut_ad(ulint(index) == offsets[3]); - ulint max_n_fields = ut_max( + ut_ad(!memcmp(&index, &offsets[INDEX_OFFSET], sizeof(index))); + ulint max_n_fields = std::max( dict_index_get_n_fields(index), dict_index_get_n_unique_in_tree(index) + 1); if (comp && rec) { @@ -558,7 +561,7 @@ rec_offs_validate( ut_ad(!index->n_def || i <= max_n_fields); } while (i--) { - ulint curr = rec_offs_base(offsets)[1 + i] & REC_OFFS_MASK; + ulint curr = get_value(rec_offs_base(offsets)[1 + i]); ut_ad(curr <= last); last = curr; } @@ -575,10 +578,9 @@ to the extra size (if REC_OFFS_COMPACT is set, the record is in the new format; if REC_OFFS_EXTERNAL is set, the record contains externally stored columns), and rec_offs_base(offsets)[1..n_fields] will be set to offsets past the end of fields 0..n_fields, or to the beginning of -fields 1..n_fields+1. When the high-order bit of the offset at [i+1] -is set (REC_OFFS_SQL_NULL), the field i is NULL. When the second -high-order bit of the offset at [i+1] is set (REC_OFFS_EXTERNAL), the -field i is being stored externally. +fields 1..n_fields+1. When the type of the offset at [i+1] +is (SQL_NULL), the field i is NULL. When the type of the offset at [i+1] +is (STORED_OFFPAGE), the field i is stored externally. @param[in] rec record @param[in] index the index that the record belongs in @param[in] leaf whether the record resides in a leaf page @@ -589,10 +591,10 @@ rec_init_offsets( const rec_t* rec, const dict_index_t* index, bool leaf, - ulint* offsets) + offset_t* offsets) { ulint i = 0; - ulint offs; + offset_t offs; /* This assertion was relaxed for the btr_cur_open_at_index_side() call in btr_cur_instant_init_low(). We cannot invoke @@ -601,8 +603,8 @@ rec_init_offsets( dict_table_t::deserialise_columns(). */ ut_ad(index->n_core_null_bytes <= UT_BITS_IN_BYTES(index->n_nullable) || index->in_instant_init); - ut_d(offsets[2] = ulint(rec)); - ut_d(offsets[3] = ulint(index)); + ut_d(memcpy(&offsets[RECORD_OFFSET], &rec, sizeof(rec))); + ut_d(memcpy(&offsets[INDEX_OFFSET], &index, sizeof(index))); if (dict_table_is_comp(index->table)) { const byte* nulls; @@ -660,7 +662,7 @@ rec_init_offsets( /* read the lengths of fields 0..n */ do { - ulint len; + offset_t len; if (UNIV_UNLIKELY(i == n_node_ptr_field)) { len = offs += REC_NODE_PTR_SIZE; goto resolved; @@ -682,7 +684,7 @@ rec_init_offsets( We do not advance offs, and we set the length to zero and enable the SQL NULL flag in offsets[]. */ - len = offs | REC_OFFS_SQL_NULL; + len = combine(offs, SQL_NULL); goto resolved; } null_mask <<= 1; @@ -714,7 +716,7 @@ rec_init_offsets( stored columns. Thus the "e" flag must be 0. */ ut_a(!(len & 0x4000)); - offs += len & 0x3fff; + offs += get_value(len); len = offs; goto resolved; @@ -730,39 +732,40 @@ resolved: } while (++i < rec_offs_n_fields(offsets)); *rec_offs_base(offsets) - = ulint(rec - (lens + 1)) | REC_OFFS_COMPACT; + = static_cast<offset_t>(rec - (lens + 1)) + | REC_OFFS_COMPACT; } else { /* Old-style record: determine extra size and end offsets */ offs = REC_N_OLD_EXTRA_BYTES; const ulint n_fields = rec_get_n_fields_old(rec); const ulint n = std::min(n_fields, rec_offs_n_fields(offsets)); - ulint any; + offset_t any; if (rec_get_1byte_offs_flag(rec)) { - offs += n_fields; + offs += static_cast<offset_t>(n_fields); any = offs; /* Determine offsets to fields */ do { offs = rec_1_get_field_end_info(rec, i); if (offs & REC_1BYTE_SQL_NULL_MASK) { offs &= ~REC_1BYTE_SQL_NULL_MASK; - offs |= REC_OFFS_SQL_NULL; + set_type(offs, SQL_NULL); } rec_offs_base(offsets)[1 + i] = offs; } while (++i < n); } else { - offs += 2 * n_fields; + offs += 2 * static_cast<offset_t>(n_fields); any = offs; /* Determine offsets to fields */ do { offs = rec_2_get_field_end_info(rec, i); if (offs & REC_2BYTE_SQL_NULL_MASK) { offs &= ~REC_2BYTE_SQL_NULL_MASK; - offs |= REC_OFFS_SQL_NULL; + set_type(offs, SQL_NULL); } if (offs & REC_2BYTE_EXTERN_MASK) { offs &= ~REC_2BYTE_EXTERN_MASK; - offs |= REC_OFFS_EXTERNAL; + set_type(offs, STORED_OFFPAGE); any |= REC_OFFS_EXTERNAL; } rec_offs_base(offsets)[1 + i] = offs; @@ -774,8 +777,8 @@ resolved: || i + (index->id == DICT_INDEXES_ID) == rec_offs_n_fields(offsets)); - offs = (rec_offs_base(offsets)[i] & REC_OFFS_MASK) - | REC_OFFS_DEFAULT; + ut_ad(i != 0); + offs = combine(rec_offs_base(offsets)[i], DEFAULT); do { rec_offs_base(offsets)[1 + i] = offs; @@ -798,11 +801,11 @@ resolved: (ULINT_UNDEFINED to compute all offsets) @param[in,out] heap memory heap @return the new offsets */ -ulint* +offset_t* rec_get_offsets_func( const rec_t* rec, const dict_index_t* index, - ulint* offsets, + offset_t* offsets, bool leaf, ulint n_fields, #ifdef UNIV_DEBUG @@ -888,21 +891,22 @@ rec_get_offsets_func( if (UNIV_UNLIKELY(!offsets) || UNIV_UNLIKELY(rec_offs_get_n_alloc(offsets) < size)) { if (UNIV_UNLIKELY(!*heap)) { - *heap = mem_heap_create_at(size * sizeof(ulint), + *heap = mem_heap_create_at(size * sizeof(*offsets), file, line); } - offsets = static_cast<ulint*>( - mem_heap_alloc(*heap, size * sizeof(ulint))); + offsets = static_cast<offset_t*>( + mem_heap_alloc(*heap, size * sizeof(*offsets))); rec_offs_set_n_alloc(offsets, size); } rec_offs_set_n_fields(offsets, n); - if (UNIV_UNLIKELY(alter_metadata) - && dict_table_is_comp(index->table)) { - ut_d(offsets[2] = ulint(rec)); - ut_d(offsets[3] = ulint(index)); + if (UNIV_UNLIKELY(alter_metadata) && index->table->not_redundant()) { +#ifdef UNIV_DEBUG + memcpy(&offsets[RECORD_OFFSET], &rec, sizeof rec); + memcpy(&offsets[INDEX_OFFSET], &index, sizeof index); +#endif /* UNIV_DEBUG */ ut_ad(leaf); ut_ad(index->is_dummy || index->table->instant); ut_ad(index->is_dummy || index->is_instant()); @@ -931,13 +935,13 @@ rec_get_offsets_reverse( const dict_index_t* index, /*!< in: record descriptor */ ulint node_ptr,/*!< in: nonzero=node pointer, 0=leaf node */ - ulint* offsets)/*!< in/out: array consisting of + offset_t* offsets)/*!< in/out: array consisting of offsets[0] allocated elements */ { ulint n; ulint i; - ulint offs; - ulint any_ext; + offset_t offs; + offset_t any_ext = 0; const byte* nulls; const byte* lens; dict_field_t* field; @@ -963,11 +967,10 @@ rec_get_offsets_reverse( lens = nulls + UT_BITS_IN_BYTES(index->n_nullable); i = offs = 0; null_mask = 1; - any_ext = 0; /* read the lengths of fields 0..n */ do { - ulint len; + offset_t len; if (UNIV_UNLIKELY(i == n_node_ptr_field)) { len = offs += REC_NODE_PTR_SIZE; goto resolved; @@ -988,7 +991,7 @@ rec_get_offsets_reverse( We do not advance offs, and we set the length to zero and enable the SQL NULL flag in offsets[]. */ - len = offs | REC_OFFS_SQL_NULL; + len = combine(offs, SQL_NULL); goto resolved; } null_mask <<= 1; @@ -1012,10 +1015,11 @@ rec_get_offsets_reverse( len <<= 8; len |= *lens++; - offs += len & 0x3fff; + offs += get_value(len); if (UNIV_UNLIKELY(len & 0x4000)) { any_ext = REC_OFFS_EXTERNAL; - len = offs | REC_OFFS_EXTERNAL; + len = combine(offs, + STORED_OFFPAGE); } else { len = offs; } @@ -1026,15 +1030,16 @@ rec_get_offsets_reverse( len = offs += len; } else { - len = offs += field->fixed_len; + len = offs += static_cast<offset_t>(field->fixed_len); } resolved: rec_offs_base(offsets)[i + 1] = len; } while (++i < rec_offs_n_fields(offsets)); ut_ad(lens >= extra); - *rec_offs_base(offsets) = (ulint(lens - extra) + REC_N_NEW_EXTRA_BYTES) - | REC_OFFS_COMPACT | any_ext; + *rec_offs_base(offsets) + = static_cast<offset_t>(lens - extra + REC_N_NEW_EXTRA_BYTES) + | REC_OFFS_COMPACT | any_ext; } /************************************************************//** @@ -1785,7 +1790,7 @@ void rec_init_offsets_temp( const rec_t* rec, const dict_index_t* index, - ulint* offsets, + offset_t* offsets, ulint n_core, const dict_col_t::def_t*def_val, rec_comp_status_t status) @@ -1811,7 +1816,7 @@ void rec_init_offsets_temp( const rec_t* rec, const dict_index_t* index, - ulint* offsets) + offset_t* offsets) { ut_ad(!index->is_instant()); rec_init_offsets_comp_ordinary(rec, index, offsets, @@ -1854,8 +1859,8 @@ rec_copy_prefix_to_dtuple( ulint n_fields, mem_heap_t* heap) { - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(is_leaf || n_fields @@ -2153,7 +2158,7 @@ ibool rec_validate( /*=========*/ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ulint len; ulint n_fields; @@ -2262,7 +2267,7 @@ rec_print_comp( /*===========*/ FILE* file, /*!< in: file where to print */ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ulint i; @@ -2388,7 +2393,7 @@ rec_print_mbr_rec( /*==============*/ FILE* file, /*!< in: file where to print */ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ut_ad(rec_offs_validate(rec, NULL, offsets)); ut_ad(!rec_offs_any_default(offsets)); @@ -2456,7 +2461,7 @@ rec_print_new( /*==========*/ FILE* file, /*!< in: file where to print */ const rec_t* rec, /*!< in: physical record */ - const ulint* offsets)/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */ { ut_ad(rec_offs_validate(rec, NULL, offsets)); @@ -2496,7 +2501,7 @@ rec_print( return; } else { mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; rec_offs_init(offsets_); rec_print_new(file, rec, @@ -2519,7 +2524,7 @@ rec_print( std::ostream& o, const rec_t* rec, ulint info, - const ulint* offsets) + const offset_t* offsets) { const ulint comp = rec_offs_comp(offsets); const ulint n = rec_offs_n_fields(offsets); @@ -2576,7 +2581,7 @@ std::ostream& operator<<(std::ostream& o, const rec_index_print& r) { mem_heap_t* heap = NULL; - ulint* offsets = rec_get_offsets( + offset_t* offsets = rec_get_offsets( r.m_rec, r.m_index, NULL, page_rec_is_leaf(r.m_rec), ULINT_UNDEFINED, &heap); rec_print(o, r.m_rec, @@ -2612,9 +2617,9 @@ rec_get_trx_id( const byte* trx_id; ulint len; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; + offset_t offsets_[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; rec_offs_init(offsets_); - ulint* offsets = offsets_; + offset_t* offsets = offsets_; offsets = rec_get_offsets(rec, index, offsets, true, index->db_trx_id() + 1, &heap); @@ -2636,11 +2641,11 @@ rec_get_trx_id( @param[in] n nth field */ void rec_offs_make_nth_extern( - ulint* offsets, + offset_t* offsets, const ulint n) { ut_ad(!rec_offs_nth_sql_null(offsets, n)); - rec_offs_base(offsets)[1 + n] |= REC_OFFS_EXTERNAL; + set_type(rec_offs_base(offsets)[1 + n], STORED_OFFPAGE); } #ifdef WITH_WSREP # include "ha_prototypes.h" @@ -2660,8 +2665,8 @@ wsrep_rec_get_foreign_key( ulint i; uint key_parts; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - const ulint* offsets; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + const offset_t* offsets; ut_ad(index_for); ut_ad(index_ref); diff --git a/storage/innobase/row/row0ftsort.cc b/storage/innobase/row/row0ftsort.cc index e9076bfae50..38ba39bea98 100644 --- a/storage/innobase/row/row0ftsort.cc +++ b/storage/innobase/row/row0ftsort.cc @@ -1372,7 +1372,7 @@ row_fts_sel_tree_propagate( ulint propogated, /*<! in: tree node propagated */ int* sel_tree, /*<! in: selection tree */ const mrec_t** mrec, /*<! in: sort record */ - ulint** offsets, /*<! in: record offsets */ + offset_t** offsets, /*<! in: record offsets */ dict_index_t* index) /*<! in/out: FTS index */ { ulint parent; @@ -1422,7 +1422,7 @@ row_fts_sel_tree_update( ulint propagated, /*<! in: node to propagate up */ ulint height, /*<! in: tree height */ const mrec_t** mrec, /*<! in: sort record */ - ulint** offsets, /*<! in: record offsets */ + offset_t** offsets, /*<! in: record offsets */ dict_index_t* index) /*<! in: index dictionary */ { ulint i; @@ -1444,7 +1444,7 @@ row_fts_build_sel_tree_level( int* sel_tree, /*<! in/out: selection tree */ ulint level, /*<! in: selection tree level */ const mrec_t** mrec, /*<! in: sort record */ - ulint** offsets, /*<! in: record offsets */ + offset_t** offsets, /*<! in: record offsets */ dict_index_t* index) /*<! in: index dictionary */ { ulint start; @@ -1504,7 +1504,7 @@ row_fts_build_sel_tree( /*===================*/ int* sel_tree, /*<! in/out: selection tree */ const mrec_t** mrec, /*<! in: sort record */ - ulint** offsets, /*<! in: record offsets */ + offset_t** offsets, /*<! in: record offsets */ dict_index_t* index) /*<! in: index dictionary */ { ulint treelevel = 1; @@ -1554,7 +1554,7 @@ row_fts_merge_insert( mem_heap_t* heap; dberr_t error = DB_SUCCESS; ulint* foffs; - ulint** offsets; + offset_t** offsets; fts_tokenizer_word_t new_word; ib_vector_t* positions; doc_id_t last_doc_id; @@ -1593,7 +1593,7 @@ row_fts_merge_insert( heap, sizeof (*b) * fts_sort_pll_degree); foffs = (ulint*) mem_heap_alloc( heap, sizeof(*foffs) * fts_sort_pll_degree); - offsets = (ulint**) mem_heap_alloc( + offsets = (offset_t**) mem_heap_alloc( heap, sizeof(*offsets) * fts_sort_pll_degree); buf = (mrec_buf_t**) mem_heap_alloc( heap, sizeof(*buf) * fts_sort_pll_degree); @@ -1617,10 +1617,10 @@ row_fts_merge_insert( num = 1 + REC_OFFS_HEADER_SIZE + dict_index_get_n_fields(index); - offsets[i] = static_cast<ulint*>(mem_heap_zalloc( + offsets[i] = static_cast<offset_t*>(mem_heap_zalloc( heap, num * sizeof *offsets[i])); - offsets[i][0] = num; - offsets[i][1] = dict_index_get_n_fields(index); + rec_offs_set_n_alloc(offsets[i], num); + rec_offs_set_n_fields(offsets[i], dict_index_get_n_fields(index)); block[i] = psort_info[i].merge_block[id]; crypt_block[i] = psort_info[i].crypt_block[id]; b[i] = psort_info[i].merge_block[id]; diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index 104f142b807..9adc5da2b8b 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -265,7 +265,7 @@ public: bool remove( const dict_index_t* index, page_zip_des_t* page_zip, - ulint* offsets) UNIV_NOTHROW + offset_t* offsets) UNIV_NOTHROW { /* We can't end up with an empty page unless it is root. */ if (page_get_n_recs(m_cur.block->frame) <= 1) { @@ -851,7 +851,7 @@ private: @return DB_SUCCESS or error code */ dberr_t adjust_cluster_index_blob_column( rec_t* rec, - const ulint* offsets, + const offset_t* offsets, ulint i) UNIV_NOTHROW; /** Adjusts the BLOB reference in the clustered index row for all @@ -861,7 +861,7 @@ private: @return DB_SUCCESS or error code */ dberr_t adjust_cluster_index_blob_columns( rec_t* rec, - const ulint* offsets) UNIV_NOTHROW; + const offset_t* offsets) UNIV_NOTHROW; /** In the clustered index, adjist the BLOB pointers as needed. Also update the BLOB reference, write the new space id. @@ -870,7 +870,7 @@ private: @return DB_SUCCESS or error code */ dberr_t adjust_cluster_index_blob_ref( rec_t* rec, - const ulint* offsets) UNIV_NOTHROW; + const offset_t* offsets) UNIV_NOTHROW; /** Purge delete-marked records, only if it is possible to do so without re-organising the B+tree. @@ -883,7 +883,7 @@ private: @return DB_SUCCESS or error code. */ dberr_t adjust_cluster_record( rec_t* rec, - const ulint* offsets) UNIV_NOTHROW; + const offset_t* offsets) UNIV_NOTHROW; /** Find an index with the matching id. @return row_index_t* instance or 0 */ @@ -917,10 +917,10 @@ private: RecIterator m_rec_iter; /** Record offset */ - ulint m_offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t m_offsets_[REC_OFFS_NORMAL_SIZE]; /** Pointer to m_offsets_ */ - ulint* m_offsets; + offset_t* m_offsets; /** Memory heap for the record offsets */ mem_heap_t* m_heap; @@ -1568,7 +1568,7 @@ inline dberr_t PageConverter::adjust_cluster_index_blob_column( rec_t* rec, - const ulint* offsets, + const offset_t* offsets, ulint i) UNIV_NOTHROW { ulint len; @@ -1612,7 +1612,7 @@ inline dberr_t PageConverter::adjust_cluster_index_blob_columns( rec_t* rec, - const ulint* offsets) UNIV_NOTHROW + const offset_t* offsets) UNIV_NOTHROW { ut_ad(rec_offs_any_extern(offsets)); @@ -1645,7 +1645,7 @@ inline dberr_t PageConverter::adjust_cluster_index_blob_ref( rec_t* rec, - const ulint* offsets) UNIV_NOTHROW + const offset_t* offsets) UNIV_NOTHROW { if (rec_offs_any_extern(offsets)) { dberr_t err; @@ -1688,7 +1688,7 @@ inline dberr_t PageConverter::adjust_cluster_record( rec_t* rec, - const ulint* offsets) UNIV_NOTHROW + const offset_t* offsets) UNIV_NOTHROW { dberr_t err; diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index 42bc482ff56..735bd4517a1 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -220,7 +220,7 @@ row_ins_sec_index_entry_by_modify( depending on whether mtr holds just a leaf latch or also a tree latch */ btr_cur_t* cursor, /*!< in: B-tree cursor */ - ulint** offsets,/*!< in/out: offsets on cursor->page_cur.rec */ + offset_t** offsets,/*!< in/out: offsets on cursor->page_cur.rec */ mem_heap_t* offsets_heap, /*!< in/out: memory heap that can be emptied */ mem_heap_t* heap, /*!< in/out: memory heap */ @@ -315,7 +315,7 @@ row_ins_clust_index_entry_by_modify( ulint mode, /*!< in: BTR_MODIFY_LEAF or BTR_MODIFY_TREE, depending on whether mtr holds just a leaf latch or also a tree latch */ - ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ + offset_t** offsets,/*!< out: offsets on cursor->page_cur.rec */ mem_heap_t** offsets_heap, /*!< in/out: pointer to memory heap that can be emptied, or NULL */ @@ -937,9 +937,9 @@ row_ins_foreign_fill_virtual( { THD* thd = current_thd; row_ext_t* ext; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; rec_offs_init(offsets_); - const ulint* offsets = + const offset_t* offsets = rec_get_offsets(rec, index, offsets_, true, ULINT_UNDEFINED, &cascade->heap); mem_heap_t* v_heap = NULL; @@ -1492,7 +1492,7 @@ row_ins_set_shared_rec_lock( const buf_block_t* block, /*!< in: buffer block of rec */ const rec_t* rec, /*!< in: record */ dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ que_thr_t* thr) /*!< in: query thread */ { dberr_t err; @@ -1523,7 +1523,7 @@ row_ins_set_exclusive_rec_lock( const buf_block_t* block, /*!< in: buffer block of rec */ const rec_t* rec, /*!< in: record */ dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ que_thr_t* thr) /*!< in: query thread */ { dberr_t err; @@ -1570,8 +1570,8 @@ row_ins_check_foreign_constraint( mtr_t mtr; trx_t* trx = thr_get_trx(thr); mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; bool skip_gap_lock; @@ -2058,7 +2058,7 @@ row_ins_dupl_error_with_rec( the record! */ const dtuple_t* entry, /*!< in: entry to insert */ dict_index_t* index, /*!< in: index */ - const ulint* offsets)/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */ { ulint matched_fields; ulint n_unique; @@ -2117,9 +2117,11 @@ row_ins_scan_sec_index_for_duplicate( btr_pcur_t pcur; dberr_t err = DB_SUCCESS; ulint allow_duplicates; - ulint* offsets = NULL; + offset_t offsets_[REC_OFFS_SEC_INDEX_SIZE]; + offset_t* offsets = offsets_; DBUG_ENTER("row_ins_scan_sec_index_for_duplicate"); + rec_offs_init(offsets_); ut_ad(s_latch == rw_lock_own_flagged( &index->lock, RW_LOCK_FLAG_S | RW_LOCK_FLAG_SX)); @@ -2249,7 +2251,7 @@ row_ins_duplicate_online( ulint n_uniq, /*!< in: offset of DB_TRX_ID */ const dtuple_t* entry, /*!< in: entry that is being inserted */ const rec_t* rec, /*!< in: clustered index record */ - ulint* offsets)/*!< in/out: rec_get_offsets(rec) */ + offset_t* offsets)/*!< in/out: rec_get_offsets(rec) */ { ulint fields = 0; @@ -2288,7 +2290,7 @@ row_ins_duplicate_error_in_clust_online( ulint n_uniq, /*!< in: offset of DB_TRX_ID */ const dtuple_t* entry, /*!< in: entry that is being inserted */ const btr_cur_t*cursor, /*!< in: cursor on insert position */ - ulint** offsets,/*!< in/out: rec_get_offsets(rec) */ + offset_t** offsets,/*!< in/out: rec_get_offsets(rec) */ mem_heap_t** heap) /*!< in/out: heap for offsets */ { dberr_t err = DB_SUCCESS; @@ -2337,8 +2339,8 @@ row_ins_duplicate_error_in_clust( ulint n_unique; trx_t* trx = thr_get_trx(thr); mem_heap_t*heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(dict_index_is_clust(cursor->index)); @@ -2511,7 +2513,7 @@ dberr_t row_ins_index_entry_big_rec( const dtuple_t* entry, const big_rec_t* big_rec, - ulint* offsets, + offset_t* offsets, mem_heap_t** heap, dict_index_t* index, const void* thd __attribute__((unused))) @@ -2586,8 +2588,8 @@ row_ins_clust_index_entry_low( mtr_t mtr; ib_uint64_t auto_inc = 0; mem_heap_t* offsets_heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); DBUG_ENTER("row_ins_clust_index_entry_low"); @@ -2898,8 +2900,8 @@ row_ins_sec_index_entry_low( dberr_t err = DB_SUCCESS; ulint n_unique; mtr_t mtr; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); rtr_info_t rtr_info; diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc index 5b55409a13a..56328349e1e 100644 --- a/storage/innobase/row/row0log.cc +++ b/storage/innobase/row/row0log.cc @@ -645,7 +645,7 @@ row_log_table_delete( page X-latched */ dict_index_t* index, /*!< in/out: clustered index, S-latched or X-latched */ - const ulint* offsets,/*!< in: rec_get_offsets(rec,index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec,index) */ const byte* sys) /*!< in: DB_TRX_ID,DB_ROLL_PTR that should be logged, or NULL to use those in rec */ { @@ -936,7 +936,7 @@ row_log_table_low( page X-latched */ dict_index_t* index, /*!< in/out: clustered index, S-latched or X-latched */ - const ulint* offsets,/*!< in: rec_get_offsets(rec,index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec,index) */ bool insert, /*!< in: true if insert, false if update */ const dtuple_t* old_pk) /*!< in: old PRIMARY KEY value (if !insert and a PRIMARY KEY is being created) */ @@ -1105,7 +1105,7 @@ row_log_table_update( page X-latched */ dict_index_t* index, /*!< in/out: clustered index, S-latched or X-latched */ - const ulint* offsets,/*!< in: rec_get_offsets(rec,index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec,index) */ const dtuple_t* old_pk) /*!< in: row_log_table_get_pk() before the update */ { @@ -1155,7 +1155,7 @@ row_log_table_get_pk_col( dfield_t* dfield, mem_heap_t* heap, const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, ulint i, ulint zip_size, ulint max_len, @@ -1225,7 +1225,7 @@ row_log_table_get_pk( page X-latched */ dict_index_t* index, /*!< in/out: clustered index, S-latched or X-latched */ - const ulint* offsets,/*!< in: rec_get_offsets(rec,index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec,index) */ byte* sys, /*!< out: DB_TRX_ID,DB_ROLL_PTR for row_log_table_delete(), or NULL */ mem_heap_t** heap) /*!< in/out: memory heap where allocated */ @@ -1429,7 +1429,7 @@ row_log_table_insert( page X-latched */ dict_index_t* index, /*!< in/out: clustered index, S-latched or X-latched */ - const ulint* offsets)/*!< in: rec_get_offsets(rec,index) */ + const offset_t* offsets)/*!< in: rec_get_offsets(rec,index) */ { row_log_table_low(rec, index, offsets, true, NULL); } @@ -1520,7 +1520,7 @@ row_log_table_apply_convert_mrec( /*=============================*/ const mrec_t* mrec, /*!< in: merge record */ dict_index_t* index, /*!< in: index of mrec */ - const ulint* offsets, /*!< in: offsets of mrec */ + const offset_t* offsets, /*!< in: offsets of mrec */ row_log_t* log, /*!< in: rebuild context */ mem_heap_t* heap, /*!< in/out: memory heap */ dberr_t* error) /*!< out: DB_SUCCESS or @@ -1772,7 +1772,7 @@ row_log_table_apply_insert( /*=======================*/ que_thr_t* thr, /*!< in: query graph */ const mrec_t* mrec, /*!< in: record to insert */ - const ulint* offsets, /*!< in: offsets of mrec */ + const offset_t* offsets, /*!< in: offsets of mrec */ mem_heap_t* offsets_heap, /*!< in/out: memory heap that can be emptied */ mem_heap_t* heap, /*!< in/out: memory heap */ @@ -1824,7 +1824,7 @@ row_log_table_apply_delete_low( /*===========================*/ btr_pcur_t* pcur, /*!< in/out: B-tree cursor, will be trashed */ - const ulint* offsets, /*!< in: offsets on pcur */ + const offset_t* offsets, /*!< in: offsets on pcur */ mem_heap_t* heap, /*!< in/out: memory heap */ mtr_t* mtr) /*!< in/out: mini-transaction, will be committed */ @@ -1917,7 +1917,7 @@ row_log_table_apply_delete( DB_TRX_ID in the new clustered index */ const mrec_t* mrec, /*!< in: merge record */ - const ulint* moffsets, /*!< in: offsets of mrec */ + const offset_t* moffsets, /*!< in: offsets of mrec */ mem_heap_t* offsets_heap, /*!< in/out: memory heap that can be emptied */ mem_heap_t* heap, /*!< in/out: memory heap */ @@ -1928,7 +1928,7 @@ row_log_table_apply_delete( dtuple_t* old_pk; mtr_t mtr; btr_pcur_t pcur; - ulint* offsets; + offset_t* offsets; ut_ad(rec_offs_n_fields(moffsets) == index->first_user_field()); ut_ad(!rec_offs_any_extern(moffsets)); @@ -2039,7 +2039,7 @@ row_log_table_apply_update( DB_TRX_ID in the new clustered index */ const mrec_t* mrec, /*!< in: new value */ - const ulint* offsets, /*!< in: offsets of mrec */ + const offset_t* offsets, /*!< in: offsets of mrec */ mem_heap_t* offsets_heap, /*!< in/out: memory heap that can be emptied */ mem_heap_t* heap, /*!< in/out: memory heap */ @@ -2177,7 +2177,7 @@ func_exit_committed: } /* Prepare to update (or delete) the record. */ - ulint* cur_offsets = rec_get_offsets( + offset_t* cur_offsets = rec_get_offsets( btr_pcur_get_rec(&pcur), index, NULL, true, ULINT_UNDEFINED, &offsets_heap); @@ -2415,7 +2415,7 @@ row_log_table_apply_op( mem_heap_t* heap, /*!< in/out: memory heap */ const mrec_t* mrec, /*!< in: merge record */ const mrec_t* mrec_end, /*!< in: end of buffer */ - ulint* offsets) /*!< in/out: work area + offset_t* offsets) /*!< in/out: work area for parsing mrec */ { row_log_t* log = dup->index->online_log; @@ -2747,7 +2747,7 @@ row_log_table_apply_ops( const mrec_t* next_mrec_end; mem_heap_t* heap; mem_heap_t* offsets_heap; - ulint* offsets; + offset_t* offsets; bool has_index_lock; dict_index_t* index = const_cast<dict_index_t*>( dup->index); @@ -2774,9 +2774,9 @@ row_log_table_apply_ops( UNIV_MEM_INVALID(&mrec_end, sizeof mrec_end); - offsets = static_cast<ulint*>(ut_malloc_nokey(i * sizeof *offsets)); - offsets[0] = i; - offsets[1] = dict_index_get_n_fields(index); + offsets = static_cast<offset_t*>(ut_malloc_nokey(i * sizeof *offsets)); + rec_offs_set_n_alloc(offsets, i); + rec_offs_set_n_fields(offsets, dict_index_get_n_fields(index)); heap = mem_heap_create(srv_page_size); offsets_heap = mem_heap_create(srv_page_size); @@ -3321,7 +3321,7 @@ row_log_apply_op_low( { mtr_t mtr; btr_cur_t cursor; - ulint* offsets = NULL; + offset_t* offsets = NULL; ut_ad(!dict_index_is_clust(index)); @@ -3555,7 +3555,7 @@ row_log_apply_op( in exclusive mode */ const mrec_t* mrec, /*!< in: merge record */ const mrec_t* mrec_end, /*!< in: end of buffer */ - ulint* offsets) /*!< in/out: work area for + offset_t* offsets) /*!< in/out: work area for rec_init_offsets_temp() */ { @@ -3674,7 +3674,7 @@ row_log_apply_ops( const mrec_t* next_mrec_end; mem_heap_t* offsets_heap; mem_heap_t* heap; - ulint* offsets; + offset_t* offsets; bool has_index_lock; const ulint i = 1 + REC_OFFS_HEADER_SIZE + dict_index_get_n_fields(index); @@ -3685,9 +3685,9 @@ row_log_apply_ops( ut_ad(index->online_log); UNIV_MEM_INVALID(&mrec_end, sizeof mrec_end); - offsets = static_cast<ulint*>(ut_malloc_nokey(i * sizeof *offsets)); - offsets[0] = i; - offsets[1] = dict_index_get_n_fields(index); + offsets = static_cast<offset_t*>(ut_malloc_nokey(i * sizeof *offsets)); + rec_offs_set_n_alloc(offsets, i); + rec_offs_set_n_fields(offsets, dict_index_get_n_fields(index)); offsets_heap = mem_heap_create(srv_page_size); heap = mem_heap_create(srv_page_size); diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index 0e73faea5a1..8b3831f08af 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -120,7 +120,7 @@ public: btr_cur_t ins_cur; mtr_t mtr; rtr_info_t rtr_info; - ulint* ins_offsets = NULL; + offset_t* ins_offsets = NULL; dberr_t error = DB_SUCCESS; dtuple_t* dtuple; ulint count = 0; @@ -1046,8 +1046,8 @@ row_merge_heap_create( /*==================*/ const dict_index_t* index, /*!< in: record descriptor */ mrec_buf_t** buf, /*!< out: 3 buffers */ - ulint** offsets1, /*!< out: offsets */ - ulint** offsets2) /*!< out: offsets */ + offset_t** offsets1, /*!< out: offsets */ + offset_t** offsets2) /*!< out: offsets */ { ulint i = 1 + REC_OFFS_HEADER_SIZE + dict_index_get_n_fields(index); @@ -1056,13 +1056,15 @@ row_merge_heap_create( *buf = static_cast<mrec_buf_t*>( mem_heap_alloc(heap, 3 * sizeof **buf)); - *offsets1 = static_cast<ulint*>( + *offsets1 = static_cast<offset_t*>( mem_heap_alloc(heap, i * sizeof **offsets1)); - *offsets2 = static_cast<ulint*>( + *offsets2 = static_cast<offset_t*>( mem_heap_alloc(heap, i * sizeof **offsets2)); - (*offsets1)[0] = (*offsets2)[0] = i; - (*offsets1)[1] = (*offsets2)[1] = dict_index_get_n_fields(index); + rec_offs_set_n_alloc(*offsets1, i); + rec_offs_set_n_alloc(*offsets2, i); + rec_offs_set_n_fields(*offsets1, dict_index_get_n_fields(index)); + rec_offs_set_n_fields(*offsets2, dict_index_get_n_fields(index)); return(heap); } @@ -1178,7 +1180,7 @@ row_merge_read_rec( const mrec_t** mrec, /*!< out: pointer to merge record, or NULL on end of list (non-NULL on I/O error) */ - ulint* offsets,/*!< out: offsets of mrec */ + offset_t* offsets,/*!< out: offsets of mrec */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ { @@ -1189,7 +1191,7 @@ row_merge_read_rec( ut_ad(b >= &block[0]); ut_ad(b < &block[srv_sort_buf_size]); - ut_ad(*offsets == 1 + REC_OFFS_HEADER_SIZE + ut_ad(rec_offs_get_n_alloc(offsets) == 1 + REC_OFFS_HEADER_SIZE + dict_index_get_n_fields(index)); DBUG_ENTER("row_merge_read_rec"); @@ -1296,12 +1298,7 @@ err_exit: memcpy(*buf, b, avail_size); *mrec = *buf + extra_size; - /* We cannot invoke rec_offs_make_valid() here, because there - are no REC_N_NEW_EXTRA_BYTES between extra_size and data_size. - Similarly, rec_offs_validate() would fail, because it invokes - rec_get_status(). */ - ut_d(offsets[2] = (ulint) *mrec); - ut_d(offsets[3] = (ulint) index); + rec_init_offsets_temp(*mrec, index, offsets); if (!row_merge_read(fd, ++(*foffs), block, crypt_block, @@ -1340,7 +1337,7 @@ row_merge_write_rec_low( ulint foffs, /*!< in: file offset */ #endif /* !DBUG_OFF */ const mrec_t* mrec, /*!< in: record to write */ - const ulint* offsets)/*!< in: offsets of mrec */ + const offset_t* offsets)/*!< in: offsets of mrec */ #ifdef DBUG_OFF # define row_merge_write_rec_low(b, e, size, fd, foffs, mrec, offsets) \ row_merge_write_rec_low(b, e, mrec, offsets) @@ -1382,7 +1379,7 @@ row_merge_write_rec( const pfs_os_file_t& fd, /*!< in: file descriptor */ ulint* foffs, /*!< in/out: file offset */ const mrec_t* mrec, /*!< in: record to write */ - const ulint* offsets,/*!< in: offsets of mrec */ + const offset_t* offsets,/*!< in: offsets of mrec */ row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */ ulint space) /*!< in: space id */ { @@ -1929,7 +1926,7 @@ row_merge_read_clustered_index( const rec_t* rec; trx_id_t rec_trx_id; - ulint* offsets; + offset_t* offsets; dtuple_t* row; row_ext_t* ext; page_cur_t* cur = btr_pcur_get_page_cur(&pcur); @@ -2963,8 +2960,8 @@ row_merge_blocks( const mrec_t* mrec0; /*!< merge rec, points to block[0] or buf[0] */ const mrec_t* mrec1; /*!< merge rec, points to block[srv_sort_buf_size] or buf[1] */ - ulint* offsets0;/* offsets of mrec0 */ - ulint* offsets1;/* offsets of mrec1 */ + offset_t* offsets0;/* offsets of mrec0 */ + offset_t* offsets1;/* offsets of mrec1 */ DBUG_ENTER("row_merge_blocks"); DBUG_LOG("ib_merge_sort", @@ -3081,8 +3078,8 @@ row_merge_blocks_copy( const byte* b0; /*!< pointer to block[0] */ byte* b2; /*!< pointer to block[2 * srv_sort_buf_size] */ const mrec_t* mrec0; /*!< merge rec, points to block[0] */ - ulint* offsets0;/* offsets of mrec0 */ - ulint* offsets1;/* dummy offsets */ + offset_t* offsets0;/* offsets of mrec0 */ + offset_t* offsets1;/* dummy offsets */ DBUG_ENTER("row_merge_blocks_copy"); DBUG_LOG("ib_merge_sort", @@ -3421,7 +3418,7 @@ static void row_merge_copy_blobs( const mrec_t* mrec, - const ulint* offsets, + const offset_t* offsets, ulint zip_size, dtuple_t* tuple, mem_heap_t* heap) @@ -3530,7 +3527,7 @@ row_merge_insert_index_tuples( mem_heap_t* tuple_heap; dberr_t error = DB_SUCCESS; ulint foffs = 0; - ulint* offsets; + offset_t* offsets; mrec_buf_t* buf; ulint n_rows = 0; dtuple_t* dtuple; @@ -3558,10 +3555,10 @@ row_merge_insert_index_tuples( ulint i = 1 + REC_OFFS_HEADER_SIZE + dict_index_get_n_fields(index); heap = mem_heap_create(sizeof *buf + i * sizeof *offsets); - offsets = static_cast<ulint*>( + offsets = static_cast<offset_t*>( mem_heap_alloc(heap, i * sizeof *offsets)); - offsets[0] = i; - offsets[1] = dict_index_get_n_fields(index); + rec_offs_set_n_alloc(offsets, i); + rec_offs_set_n_fields(offsets, dict_index_get_n_fields(index)); } if (row_buf != NULL) { diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index 9e1a8bb40ba..86ef45167a4 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -2064,8 +2064,8 @@ row_unlock_for_mysql( + index->trx_id_offset); } else { mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); offsets = rec_get_offsets(rec, index, offsets, true, @@ -4676,8 +4676,8 @@ row_scan_index_for_mysql( ulint cnt; mem_heap_t* heap = NULL; ulint n_ext; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets; rec_offs_init(offsets_); *n_rows = 0; @@ -4810,7 +4810,7 @@ not_ok: tmp_heap = mem_heap_create(size); - offsets = static_cast<ulint*>( + offsets = static_cast<offset_t*>( mem_heap_dup(tmp_heap, offsets, size)); } diff --git a/storage/innobase/row/row0purge.cc b/storage/innobase/row/row0purge.cc index 4dee8de5aad..61920532c29 100644 --- a/storage/innobase/row/row0purge.cc +++ b/storage/innobase/row/row0purge.cc @@ -123,10 +123,10 @@ row_purge_remove_clust_if_poss_low( index->set_modified(mtr); rec_t* rec = btr_pcur_get_rec(&node->pcur); - ulint offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; rec_offs_init(offsets_); mem_heap_t* heap = NULL; - ulint* offsets = rec_get_offsets( + offset_t* offsets = rec_get_offsets( rec, index, offsets_, true, ULINT_UNDEFINED, &heap); bool success = true; @@ -804,9 +804,9 @@ static void row_purge_reset_trx_id(purge_node_t* node, mtr_t* mtr) mem_heap_t* heap = NULL; /* Reserve enough offsets for the PRIMARY KEY and 2 columns so that we can access DB_TRX_ID, DB_ROLL_PTR. */ - ulint offsets_[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; + offset_t offsets_[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; rec_offs_init(offsets_); - ulint* offsets = rec_get_offsets( + offset_t* offsets = rec_get_offsets( rec, index, offsets_, true, trx_id_pos + 2, &heap); ut_ad(heap == NULL); @@ -1385,7 +1385,7 @@ purge_node_t::validate_pcur() dict_index_t* clust_index = pcur.btr_cur.index; - ulint* offsets = rec_get_offsets( + offset_t* offsets = rec_get_offsets( pcur.old_rec, clust_index, NULL, true, pcur.old_n_fields, &heap); diff --git a/storage/innobase/row/row0row.cc b/storage/innobase/row/row0row.cc index 57e2c8e4fdb..4e901346580 100644 --- a/storage/innobase/row/row0row.cc +++ b/storage/innobase/row/row0row.cc @@ -412,7 +412,7 @@ row_build_low( ulint type, const dict_index_t* index, const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, const dict_table_t* col_table, const dtuple_t* defaults, const dict_add_v_col_t* add_v, @@ -428,7 +428,7 @@ row_build_low( byte* buf; ulint j; mem_heap_t* tmp_heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; rec_offs_init(offsets_); ut_ad(index != NULL); @@ -476,7 +476,7 @@ row_build_low( } /* Avoid a debug assertion in rec_offs_validate(). */ - rec_offs_make_valid(copy, index, true, const_cast<ulint*>(offsets)); + rec_offs_make_valid(copy, index, true, const_cast<offset_t*>(offsets)); if (!col_table) { ut_ad(!col_map); @@ -584,7 +584,7 @@ row_build_low( } } - rec_offs_make_valid(rec, index, true, const_cast<ulint*>(offsets)); + rec_offs_make_valid(rec, index, true, const_cast<offset_t*>(offsets)); ut_ad(dtuple_check_typed(row)); @@ -637,7 +637,7 @@ row_build( this record must be at least s-latched and the latch held as long as the row dtuple is used! */ - const ulint* offsets,/*!< in: rec_get_offsets(rec,index) + const offset_t* offsets,/*!< in: rec_get_offsets(rec,index) or NULL, in which case this function will invoke rec_get_offsets() */ const dict_table_t* col_table, @@ -690,7 +690,7 @@ row_build_w_add_vcol( ulint type, const dict_index_t* index, const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, const dict_table_t* col_table, const dtuple_t* defaults, const dict_add_v_col_t* add_v, @@ -721,7 +721,7 @@ dtuple_t* row_rec_to_index_entry_impl( const rec_t* rec, const dict_index_t* index, - const ulint* offsets, + const offset_t* offsets, ulint* n_ext, mem_heap_t* heap, ulint info_bits = 0, @@ -876,7 +876,7 @@ dtuple_t* row_rec_to_index_entry_low( const rec_t* rec, const dict_index_t* index, - const ulint* offsets, + const offset_t* offsets, ulint* n_ext, mem_heap_t* heap) { @@ -893,7 +893,7 @@ row_rec_to_index_entry( /*===================*/ const rec_t* rec, /*!< in: record in the index */ const dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec) */ ulint* n_ext, /*!< out: number of externally stored columns */ mem_heap_t* heap) /*!< in: memory heap from which @@ -911,7 +911,7 @@ row_rec_to_index_entry( rec, offsets); rec_offs_make_valid(copy_rec, index, true, - const_cast<ulint*>(offsets)); + const_cast<offset_t*>(offsets)); dtuple_t* entry = rec_is_alter_metadata(copy_rec, *index) ? row_rec_to_index_entry_impl<true,1>( @@ -920,7 +920,7 @@ row_rec_to_index_entry( copy_rec, index, offsets, n_ext, heap); rec_offs_make_valid(rec, index, true, - const_cast<ulint*>(offsets)); + const_cast<offset_t*>(offsets)); dtuple_set_info_bits(entry, rec_get_info_bits(rec, rec_offs_comp(offsets))); @@ -940,7 +940,7 @@ dtuple_t* row_metadata_to_tuple( const rec_t* rec, const dict_index_t* index, - const ulint* offsets, + const offset_t* offsets, ulint* n_ext, mem_heap_t* heap, ulint info_bits, @@ -957,7 +957,7 @@ row_metadata_to_tuple( rec, offsets); rec_offs_make_valid(copy_rec, index, true, - const_cast<ulint*>(offsets)); + const_cast<offset_t*>(offsets)); dtuple_t* entry = info_bits == REC_INFO_METADATA_ALTER || rec_is_alter_metadata(copy_rec, *index) @@ -967,7 +967,7 @@ row_metadata_to_tuple( copy_rec, index, offsets, n_ext, heap); rec_offs_make_valid(rec, index, true, - const_cast<ulint*>(offsets)); + const_cast<offset_t*>(offsets)); dtuple_set_info_bits(entry, info_bits); return entry; @@ -1007,8 +1007,8 @@ row_build_row_ref( ulint clust_col_prefix_len; ulint i; mem_heap_t* tmp_heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(index != NULL); @@ -1103,7 +1103,7 @@ row_build_row_ref_in_tuple( held as long as the row reference is used! */ const dict_index_t* index, /*!< in: secondary index */ - ulint* offsets)/*!< in: rec_get_offsets(rec, index) + offset_t* offsets)/*!< in: rec_get_offsets(rec, index) or NULL */ { const dict_index_t* clust_index; @@ -1115,7 +1115,7 @@ row_build_row_ref_in_tuple( ulint clust_col_prefix_len; ulint i; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; rec_offs_init(offsets_); ut_ad(!dict_index_is_clust(index)); diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc index f8b3a5ff8ed..7b6df752043 100644 --- a/storage/innobase/row/row0sel.cc +++ b/storage/innobase/row/row0sel.cc @@ -174,10 +174,10 @@ row_sel_sec_rec_is_for_clust_rec( ulint n; ulint i; mem_heap_t* heap = NULL; - ulint clust_offsets_[REC_OFFS_NORMAL_SIZE]; - ulint sec_offsets_[REC_OFFS_SMALL_SIZE]; - ulint* clust_offs = clust_offsets_; - ulint* sec_offs = sec_offsets_; + offset_t clust_offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t sec_offsets_[REC_OFFS_SMALL_SIZE]; + offset_t* clust_offs = clust_offsets_; + offset_t* sec_offs = sec_offsets_; ibool is_equal = TRUE; VCOL_STORAGE* vcol_storage= 0; byte* record; @@ -495,7 +495,7 @@ row_sel_fetch_columns( dict_index_t* index, /*!< in: record index */ const rec_t* rec, /*!< in: record in a clustered or non-clustered index; must be protected by a page latch */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ sym_node_t* column) /*!< in: first column in a column list, or NULL */ { @@ -761,7 +761,7 @@ row_sel_build_prev_vers( ReadView* read_view, /*!< in: read view */ dict_index_t* index, /*!< in: plan node for table */ rec_t* rec, /*!< in: record in a clustered index */ - ulint** offsets, /*!< in/out: offsets returned by + offset_t** offsets, /*!< in/out: offsets returned by rec_get_offsets(rec, plan->index) */ mem_heap_t** offset_heap, /*!< in/out: memory heap from which the offsets are allocated */ @@ -796,7 +796,7 @@ row_sel_build_committed_vers_for_mysql( dict_index_t* clust_index, /*!< in: clustered index */ row_prebuilt_t* prebuilt, /*!< in: prebuilt struct */ const rec_t* rec, /*!< in: record in a clustered index */ - ulint** offsets, /*!< in/out: offsets returned by + offset_t** offsets, /*!< in/out: offsets returned by rec_get_offsets(rec, clust_index) */ mem_heap_t** offset_heap, /*!< in/out: memory heap from which the offsets are allocated */ @@ -910,8 +910,8 @@ row_sel_get_clust_rec( rec_t* old_vers; dberr_t err; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); *out_rec = NULL; @@ -1070,7 +1070,7 @@ sel_set_rtr_rec_lock( btr_pcur_t* pcur, /*!< in: cursor */ const rec_t* first_rec,/*!< in: record */ dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ ulint mode, /*!< in: lock mode */ ulint type, /*!< in: LOCK_ORDINARY, LOCK_GAP, or LOC_REC_NOT_GAP */ @@ -1082,8 +1082,8 @@ sel_set_rtr_rec_lock( dberr_t err = DB_SUCCESS; trx_t* trx = thr_get_trx(thr); buf_block_t* cur_block = btr_pcur_get_block(pcur); - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* my_offsets = const_cast<ulint*>(offsets); + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* my_offsets = const_cast<offset_t*>(offsets); rec_t* rec = const_cast<rec_t*>(first_rec); rtr_rec_vector* match_rec; rtr_rec_vector::iterator end; @@ -1236,7 +1236,7 @@ sel_set_rec_lock( btr_pcur_t* pcur, /*!< in: cursor */ const rec_t* rec, /*!< in: record */ dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ ulint mode, /*!< in: lock mode */ ulint type, /*!< in: LOCK_ORDINARY, LOCK_GAP, or LOC_REC_NOT_GAP */ @@ -1511,8 +1511,8 @@ exhausted: a previous version of the record */ mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); offsets = rec_get_offsets(rec, index, offsets, true, ULINT_UNDEFINED, &heap); @@ -1595,8 +1595,8 @@ row_sel( to the next non-clustered record */ dberr_t err; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(thr->run_node == node); @@ -2887,7 +2887,7 @@ row_sel_store_mysql_field( row_prebuilt_t* prebuilt, const rec_t* rec, const dict_index_t* index, - const ulint* offsets, + const offset_t* offsets, ulint field_no, const mysql_row_templ_t*templ) { @@ -3042,7 +3042,7 @@ static bool row_sel_store_mysql_rec( const dtuple_t* vrow, bool rec_clust, const dict_index_t* index, - const ulint* offsets) + const offset_t* offsets) { DBUG_ENTER("row_sel_store_mysql_rec"); @@ -3173,7 +3173,7 @@ row_sel_build_prev_vers_for_mysql( dict_index_t* clust_index, /*!< in: clustered index */ row_prebuilt_t* prebuilt, /*!< in: prebuilt struct */ const rec_t* rec, /*!< in: record in a clustered index */ - ulint** offsets, /*!< in/out: offsets returned by + offset_t** offsets, /*!< in/out: offsets returned by rec_get_offsets(rec, clust_index) */ mem_heap_t** offset_heap, /*!< in/out: memory heap from which the offsets are allocated */ @@ -3211,7 +3211,7 @@ public: dberr_t operator()(row_prebuilt_t *prebuilt, dict_index_t *sec_index, const rec_t *rec, que_thr_t *thr, const rec_t **out_rec, - ulint **offsets, mem_heap_t **offset_heap, + offset_t **offsets, mem_heap_t **offset_heap, dtuple_t **vrow, mtr_t *mtr); }; @@ -3234,7 +3234,7 @@ Row_sel_get_clust_rec_for_mysql::operator()( it, NULL if the old version did not exist in the read view, i.e., it was a fresh inserted version */ - ulint** offsets,/*!< in: offsets returned by + offset_t** offsets,/*!< in: offsets returned by rec_get_offsets(rec, sec_index); out: offsets returned by rec_get_offsets(out_rec, clust_index) */ @@ -3815,7 +3815,7 @@ row_sel_try_search_shortcut_for_mysql( /*==================================*/ const rec_t** out_rec,/*!< out: record if found */ row_prebuilt_t* prebuilt,/*!< in: prebuilt struct */ - ulint** offsets,/*!< in/out: for rec_get_offsets(*out_rec) */ + offset_t** offsets,/*!< in/out: for rec_get_offsets(*out_rec) */ mem_heap_t** heap, /*!< in/out: heap for rec_get_offsets() */ mtr_t* mtr) /*!< in: started mtr */ { @@ -3889,7 +3889,7 @@ row_search_idx_cond_check( row_prebuilt_t* prebuilt, /*!< in/out: prebuilt struct for the table handle */ const rec_t* rec, /*!< in: InnoDB record */ - const ulint* offsets) /*!< in: rec_get_offsets() */ + const offset_t* offsets) /*!< in: rec_get_offsets() */ { ulint i; @@ -4000,8 +4000,8 @@ row_sel_fill_vrow( dtuple_t** vrow, mem_heap_t* heap) { - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(!(*vrow)); @@ -4055,7 +4055,7 @@ rec_field_len_in_chars( const dict_col_t* col, const ulint field_no, const rec_t* rec, - const ulint* offsets) + const offset_t* offsets) { const ulint cset = dtype_get_charset_coll(col->prtype); const CHARSET_INFO* cs = all_charsets[cset]; @@ -4082,7 +4082,7 @@ static bool row_search_with_covering_prefix( row_prebuilt_t* prebuilt, const rec_t* rec, - const ulint* offsets) + const offset_t* offsets) { const dict_index_t* index = prebuilt->index; ut_ad(!dict_index_is_clust(index)); @@ -4212,8 +4212,8 @@ row_search_mvcc( ibool same_user_rec; mtr_t mtr; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; ibool table_lock_waited = FALSE; byte* next_buf = 0; bool spatial_search = false; @@ -5926,8 +5926,8 @@ row_search_autoinc_read_column( const byte* data; ib_uint64_t value; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(page_rec_is_leaf(rec)); diff --git a/storage/innobase/row/row0uins.cc b/storage/innobase/row/row0uins.cc index 341146c0a36..5ba9de18ae9 100644 --- a/storage/innobase/row/row0uins.cc +++ b/storage/innobase/row/row0uins.cc @@ -118,7 +118,7 @@ row_undo_ins_remove_clust_rec( if (online && dict_index_is_online_ddl(index)) { mem_heap_t* heap = NULL; - const ulint* offsets = rec_get_offsets( + const offset_t* offsets = rec_get_offsets( rec, index, NULL, true, ULINT_UNDEFINED, &heap); row_log_table_delete(rec, index, offsets, NULL); mem_heap_free(heap); diff --git a/storage/innobase/row/row0umod.cc b/storage/innobase/row/row0umod.cc index 4775dc12348..5c318f34245 100644 --- a/storage/innobase/row/row0umod.cc +++ b/storage/innobase/row/row0umod.cc @@ -76,7 +76,7 @@ dberr_t row_undo_mod_clust_low( /*===================*/ undo_node_t* node, /*!< in: row undo node */ - ulint** offsets,/*!< out: rec_get_offsets() on the record */ + offset_t** offsets,/*!< out: rec_get_offsets() on the record */ mem_heap_t** offsets_heap, /*!< in/out: memory heap that can be emptied */ mem_heap_t* heap, /*!< in/out: memory heap */ @@ -209,11 +209,11 @@ static ulint row_trx_id_offset(const rec_t* rec, const dict_index_t* index) if (!trx_id_offset) { /* Reserve enough offsets for the PRIMARY KEY and 2 columns so that we can access DB_TRX_ID, DB_ROLL_PTR. */ - ulint offsets_[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; + offset_t offsets_[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; rec_offs_init(offsets_); mem_heap_t* heap = NULL; const ulint trx_id_pos = index->n_uniq ? index->n_uniq : 1; - ulint* offsets = rec_get_offsets(rec, index, offsets_, true, + offset_t* offsets = rec_get_offsets(rec, index, offsets_, true, trx_id_pos + 1, &heap); ut_ad(!heap); ulint len; @@ -293,7 +293,7 @@ row_undo_mod_clust( mem_heap_t* heap = mem_heap_create(1024); mem_heap_t* offsets_heap = NULL; - ulint* offsets = NULL; + offset_t* offsets = NULL; const dtuple_t* rebuilt_old_pk; byte sys[DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN]; @@ -453,7 +453,7 @@ row_undo_mod_clust( ulint trx_id_pos = index->n_uniq ? index->n_uniq : 1; /* Reserve enough offsets for the PRIMARY KEY and 2 columns so that we can access DB_TRX_ID, DB_ROLL_PTR. */ - ulint offsets_[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; + offset_t offsets_[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2]; if (trx_id_offset) { } else if (rec_is_metadata(rec, *index)) { ut_ad(!buf_block_get_page_zip(btr_pcur_get_block( @@ -756,7 +756,7 @@ try_again: switch (search_result) { mem_heap_t* heap; mem_heap_t* offsets_heap; - ulint* offsets; + offset_t* offsets; case ROW_BUFFERED: case ROW_NOT_DELETED_REF: /* These are invalid outcomes, because the mode passed diff --git a/storage/innobase/row/row0undo.cc b/storage/innobase/row/row0undo.cc index 18364f16ec5..1cabeb3542b 100644 --- a/storage/innobase/row/row0undo.cc +++ b/storage/innobase/row/row0undo.cc @@ -168,8 +168,8 @@ row_undo_search_clust_to_pcur( row_ext_t** ext; const rec_t* rec; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; rec_offs_init(offsets_); ut_ad(!node->table->skip_alter_undo); diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index 5c71bfe4029..88a9f60206f 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -214,7 +214,7 @@ row_upd_check_references_constraints( cursor position is lost in this function! */ dict_table_t* table, /*!< in: table in question */ dict_index_t* index, /*!< in: index of the cursor */ - ulint* offsets,/*!< in/out: rec_get_offsets(pcur.rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(pcur.rec, index) */ que_thr_t* thr, /*!< in: query thread */ mtr_t* mtr) /*!< in: mtr */ { @@ -332,7 +332,7 @@ wsrep_row_upd_check_foreign_constraints( cursor position is lost in this function! */ dict_table_t* table, /*!< in: table in question */ dict_index_t* index, /*!< in: index of the cursor */ - ulint* offsets,/*!< in/out: rec_get_offsets(pcur.rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(pcur.rec, index) */ que_thr_t* thr, /*!< in: query thread */ mtr_t* mtr) /*!< in: mtr */ { @@ -473,7 +473,7 @@ row_upd_rec_sys_fields_in_recovery( /*===============================*/ rec_t* rec, /*!< in/out: record */ page_zip_des_t* page_zip,/*!< in/out: compressed page, or NULL */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ ulint pos, /*!< in: TRX_ID position in rec */ trx_id_t trx_id, /*!< in: transaction id */ roll_ptr_t roll_ptr)/*!< in: roll ptr of the undo log record */ @@ -504,7 +504,7 @@ ibool row_upd_changes_field_size_or_external( /*===================================*/ dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ const upd_t* update) /*!< in: update vector */ { const upd_field_t* upd_field; @@ -629,7 +629,7 @@ row_upd_rec_in_place( /*=================*/ rec_t* rec, /*!< in/out: record where replaced */ dict_index_t* index, /*!< in: the index the record belongs to */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ const upd_t* update, /*!< in: update vector */ page_zip_des_t* page_zip)/*!< in: compressed page with enough space available, or NULL */ @@ -899,7 +899,7 @@ row_upd_build_sec_rec_difference_binary( /*====================================*/ const rec_t* rec, /*!< in: secondary index record */ dict_index_t* index, /*!< in: index */ - const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */ const dtuple_t* entry, /*!< in: entry to insert */ mem_heap_t* heap) /*!< in: memory heap from which allocated */ { @@ -980,7 +980,7 @@ row_upd_build_difference_binary( dict_index_t* index, const dtuple_t* entry, const rec_t* rec, - const ulint* offsets, + const offset_t* offsets, bool no_sys, trx_t* trx, mem_heap_t* heap, @@ -990,7 +990,7 @@ row_upd_build_difference_binary( ulint len; upd_t* update; ulint n_diff; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; const ulint n_v_fld = dtuple_get_n_v_fields(entry); rec_offs_init(offsets_); @@ -2052,7 +2052,7 @@ void row_upd_copy_columns( /*=================*/ rec_t* rec, /*!< in: record in a clustered index */ - const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ + const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */ const dict_index_t* index, /*!< in: index of rec */ sym_node_t* column) /*!< in: first column in a column list, or NULL */ @@ -2204,8 +2204,8 @@ row_upd_store_row( rec_t* rec; mem_heap_t* heap = NULL; row_ext_t** ext; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - const ulint* offsets; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + const offset_t* offsets; rec_offs_init(offsets_); ut_ad(node->pcur->latch_mode != BTR_NO_LATCHES); @@ -2444,7 +2444,7 @@ row_upd_sec_index_entry( && wsrep_must_process_fk(node, trx) && !wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { - ulint* offsets = rec_get_offsets( + offset_t* offsets = rec_get_offsets( rec, index, NULL, true, ULINT_UNDEFINED, &heap); @@ -2489,7 +2489,7 @@ row_upd_sec_index_entry( if (referenced) { - ulint* offsets; + offset_t* offsets; offsets = rec_get_offsets( rec, index, NULL, true, ULINT_UNDEFINED, @@ -2572,7 +2572,7 @@ row_upd_clust_rec_by_insert_inherit_func( const rec_t* rec, /*!< in: old record, or NULL */ #ifdef UNIV_DEBUG dict_index_t* index, /*!< in: index, or NULL */ - const ulint* offsets,/*!< in: rec_get_offsets(rec), or NULL */ + const offset_t* offsets,/*!< in: rec_get_offsets(rec), or NULL */ #endif /* UNIV_DEBUG */ dtuple_t* entry, /*!< in/out: updated entry to be inserted into the clustered index */ @@ -2678,10 +2678,13 @@ row_upd_clust_rec_by_insert( dtuple_t* entry; dberr_t err; rec_t* rec; - ulint* offsets = NULL; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets = offsets_; ut_ad(dict_index_is_clust(index)); + rec_offs_init(offsets_); + trx = thr_get_trx(thr); table = node->table; pcur = node->pcur; @@ -2714,7 +2717,7 @@ row_upd_clust_rec_by_insert( we update the primary key. Delete-mark the old record in the clustered index and prepare to insert a new entry. */ rec = btr_cur_get_rec(btr_cur); - offsets = rec_get_offsets(rec, index, NULL, true, + offsets = rec_get_offsets(rec, index, offsets, true, ULINT_UNDEFINED, &heap); ut_ad(page_rec_is_user_rec(rec)); @@ -2822,7 +2825,7 @@ row_upd_clust_rec( ulint flags, /*!< in: undo logging and locking flags */ upd_node_t* node, /*!< in: row update node */ dict_index_t* index, /*!< in: clustered index */ - ulint* offsets,/*!< in: rec_get_offsets() on node->pcur */ + offset_t* offsets,/*!< in: rec_get_offsets() on node->pcur */ mem_heap_t** offsets_heap, /*!< in/out: memory heap, can be emptied */ que_thr_t* thr, /*!< in: query thread */ @@ -2953,7 +2956,7 @@ row_upd_del_mark_clust_rec( /*=======================*/ upd_node_t* node, /*!< in: row update node */ dict_index_t* index, /*!< in: clustered index */ - ulint* offsets,/*!< in/out: rec_get_offsets() for the + offset_t* offsets,/*!< in/out: rec_get_offsets() for the record under the cursor */ que_thr_t* thr, /*!< in: query thread */ ibool referenced, @@ -3048,8 +3051,8 @@ row_upd_clust_step( mtr_t mtr; rec_t* rec; mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets; + offset_t offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets; ibool referenced; ulint flags; trx_t* trx = thr_get_trx(thr); diff --git a/storage/innobase/row/row0vers.cc b/storage/innobase/row/row0vers.cc index b662ce92f28..9fe183ecb29 100644 --- a/storage/innobase/row/row0vers.cc +++ b/storage/innobase/row/row0vers.cc @@ -87,17 +87,20 @@ row_vers_impl_x_locked_low( dict_index_t* clust_index, const rec_t* rec, dict_index_t* index, - const ulint* offsets, + const offset_t* offsets, mtr_t* mtr) { trx_id_t trx_id; rec_t* prev_version = NULL; - ulint* clust_offsets; + offset_t clust_offsets_[REC_OFFS_NORMAL_SIZE]; + offset_t* clust_offsets = clust_offsets_; mem_heap_t* heap; dtuple_t* ientry = NULL; mem_heap_t* v_heap = NULL; dtuple_t* cur_vrow = NULL; + rec_offs_init(clust_offsets_); + DBUG_ENTER("row_vers_impl_x_locked_low"); ut_ad(rec_offs_validate(rec, index, offsets)); @@ -112,8 +115,8 @@ row_vers_impl_x_locked_low( heap = mem_heap_create(1024); - clust_offsets = rec_get_offsets( - clust_rec, clust_index, NULL, true, ULINT_UNDEFINED, &heap); + clust_offsets = rec_get_offsets(clust_rec, clust_index, clust_offsets, + true, ULINT_UNDEFINED, &heap); trx_id = row_get_rec_trx_id(clust_rec, clust_index, clust_offsets); if (trx_id == 0) { @@ -203,7 +206,7 @@ row_vers_impl_x_locked_low( ut_ad(committed || prev_version || !rec_get_deleted_flag(version, comp)); - /* Free version and clust_offsets. */ + /* Free version. */ mem_heap_free(old_heap); if (committed) { @@ -238,7 +241,7 @@ not_locked: } clust_offsets = rec_get_offsets( - prev_version, clust_index, NULL, true, + prev_version, clust_index, clust_offsets, true, ULINT_UNDEFINED, &heap); vers_del = rec_get_deleted_flag(prev_version, comp); @@ -387,7 +390,7 @@ row_vers_impl_x_locked( trx_t* caller_trx, const rec_t* rec, dict_index_t* index, - const ulint* offsets) + const offset_t* offsets) { mtr_t mtr; trx_t* trx; @@ -519,7 +522,7 @@ row_vers_build_cur_vrow_low( bool in_purge, const rec_t* rec, dict_index_t* clust_index, - ulint* clust_offsets, + offset_t* clust_offsets, dict_index_t* index, roll_ptr_t roll_ptr, trx_id_t trx_id, @@ -635,7 +638,7 @@ row_vers_vc_matches_cluster( const rec_t* rec, const dtuple_t* icentry, dict_index_t* clust_index, - ulint* clust_offsets, + offset_t* clust_offsets, dict_index_t* index, const dtuple_t* ientry, roll_ptr_t roll_ptr, @@ -810,7 +813,7 @@ row_vers_build_cur_vrow( bool in_purge, const rec_t* rec, dict_index_t* clust_index, - ulint** clust_offsets, + offset_t** clust_offsets, dict_index_t* index, roll_ptr_t roll_ptr, trx_id_t trx_id, @@ -894,7 +897,7 @@ row_vers_old_has_index_entry( const rec_t* version; rec_t* prev_version; dict_index_t* clust_index; - ulint* clust_offsets; + offset_t* clust_offsets; mem_heap_t* heap; mem_heap_t* heap2; dtuple_t* row; @@ -1151,7 +1154,7 @@ row_vers_build_for_consistent_read( of this records */ mtr_t* mtr, /*!< in: mtr holding the latch on rec */ dict_index_t* index, /*!< in: the clustered index */ - ulint** offsets,/*!< in/out: offsets returned by + offset_t** offsets,/*!< in/out: offsets returned by rec_get_offsets(rec, index) */ ReadView* view, /*!< in: the consistent read view */ mem_heap_t** offset_heap,/*!< in/out: memory heap from which @@ -1267,7 +1270,7 @@ row_vers_build_for_semi_consistent_read( of this records */ mtr_t* mtr, /*!< in: mtr holding the latch on rec */ dict_index_t* index, /*!< in: the clustered index */ - ulint** offsets,/*!< in/out: offsets returned by + offset_t** offsets,/*!< in/out: offsets returned by rec_get_offsets(rec, index) */ mem_heap_t** offset_heap,/*!< in/out: memory heap from which the offsets are allocated */ diff --git a/storage/innobase/sync/sync0debug.cc b/storage/innobase/sync/sync0debug.cc index 15c0a952cb0..b4bfde46b8f 100644 --- a/storage/innobase/sync/sync0debug.cc +++ b/storage/innobase/sync/sync0debug.cc @@ -1562,7 +1562,7 @@ struct CreateTracker { ~CreateTracker() UNIV_NOTHROW { - ut_d(m_files.empty()); + ut_ad(m_files.empty()); m_mutex.destroy(); } diff --git a/storage/innobase/trx/trx0i_s.cc b/storage/innobase/trx/trx0i_s.cc index a39fb5d2e95..c45c4f6a182 100644 --- a/storage/innobase/trx/trx0i_s.cc +++ b/storage/innobase/trx/trx0i_s.cc @@ -599,7 +599,7 @@ put_nth_field( ulint n, /*!< in: number of field */ const dict_index_t* index, /*!< in: index */ const rec_t* rec, /*!< in: record */ - const ulint* offsets)/*!< in: record offsets, returned + const offset_t* offsets)/*!< in: record offsets, returned by rec_get_offsets() */ { const byte* data; @@ -680,8 +680,8 @@ fill_lock_data( const dict_index_t* index; ulint n_fields; mem_heap_t* heap; - ulint offsets_onstack[REC_OFFS_NORMAL_SIZE]; - ulint* offsets; + offset_t offsets_onstack[REC_OFFS_NORMAL_SIZE]; + offset_t* offsets; char buf[TRX_I_S_LOCK_DATA_MAX_LEN]; ulint buf_used; ulint i; diff --git a/storage/innobase/trx/trx0rec.cc b/storage/innobase/trx/trx0rec.cc index 2db1fee062c..008e508f076 100644 --- a/storage/innobase/trx/trx0rec.cc +++ b/storage/innobase/trx/trx0rec.cc @@ -865,7 +865,7 @@ trx_undo_page_report_modify( delete marking is done */ const rec_t* rec, /*!< in: clustered index record which has NOT yet been modified */ - const ulint* offsets, /*!< in: rec_get_offsets(rec, index) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec, index) */ const upd_t* update, /*!< in: update vector which tells the columns to be updated; in the case of a delete, this should be set to NULL */ @@ -2067,7 +2067,7 @@ trx_undo_report_row_operation( const rec_t* rec, /*!< in: case of an update or delete marking, the record in the clustered index; NULL if insert */ - const ulint* offsets, /*!< in: rec_get_offsets(rec) */ + const offset_t* offsets, /*!< in: rec_get_offsets(rec) */ roll_ptr_t* roll_ptr) /*!< out: DB_ROLL_PTR to the undo log record */ { @@ -2325,7 +2325,7 @@ trx_undo_prev_version_build( index_rec page and purge_view */ const rec_t* rec, /*!< in: version of a clustered index record */ dict_index_t* index, /*!< in: clustered index */ - ulint* offsets,/*!< in/out: rec_get_offsets(rec, index) */ + offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */ mem_heap_t* heap, /*!< in: memory heap from which the memory needed is allocated */ rec_t** old_vers,/*!< out, own: previous version, or NULL if @@ -2510,8 +2510,10 @@ trx_undo_prev_version_build( } #if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG + offset_t offsets_dbg[REC_OFFS_NORMAL_SIZE]; + rec_offs_init(offsets_dbg); ut_a(!rec_offs_any_null_extern( - *old_vers, rec_get_offsets(*old_vers, index, NULL, true, + *old_vers, rec_get_offsets(*old_vers, index, offsets_dbg, true, ULINT_UNDEFINED, &heap))); #endif // defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG diff --git a/storage/innobase/ut/ut0rnd.cc b/storage/innobase/ut/ut0rnd.cc index 3c1e51536a1..8265121ef2e 100644 --- a/storage/innobase/ut/ut0rnd.cc +++ b/storage/innobase/ut/ut0rnd.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -25,6 +26,9 @@ Created 5/11/1994 Heikki Tuuri #include "ut0rnd.h" +/** Seed value of ut_rnd_gen() */ +int32 ut_rnd_current; + /** These random numbers are used in ut_find_prime */ /*@{*/ #define UT_RANDOM_1 1.0412321 @@ -32,9 +36,6 @@ Created 5/11/1994 Heikki Tuuri #define UT_RANDOM_3 1.0132677 /*@}*/ -/** Seed value of ut_rnd_gen_ulint(). */ -ulint ut_rnd_ulint_counter = 65654363; - /***********************************************************//** Looks for a prime number slightly greater than the given argument. The prime is chosen so that it is not near any power of 2. |