Merge tag 'mariadb-10.0.35' into 10.0-galera
This commit is contained in:
commit
e1ffb66449
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -23,6 +23,7 @@ pcre/testdata/greppatN4 -text
|
||||
*.frm binary
|
||||
*.MYD binary
|
||||
*.MYI binary
|
||||
*.jar binary
|
||||
|
||||
*.c diff=cpp
|
||||
*.h diff=cpp
|
||||
|
3
CREDITS
3
CREDITS
@ -5,15 +5,14 @@ The current main sponsors of the MariaDB Foundation are:
|
||||
|
||||
Alibaba Cloud https://www.alibabacloud.com/ (2017)
|
||||
Booking.com https://www.booking.com (2013)
|
||||
MariaDB Corporation https://www.mariadb.com (2013)
|
||||
Microsoft https://microsoft.com/ (2017)
|
||||
Tencent Cloud https://cloud.tencent.com (2017)
|
||||
Development Bank of Singapore https://dbs.com (2016)
|
||||
IBM https://www.ibm.com (2017)
|
||||
MariaDB Corporation https://www.mariadb.com (2013)
|
||||
Visma https://visma.com (2015)
|
||||
Acronis http://acronis.com (2016)
|
||||
Nexedi https://www.nexedi.com (2016)
|
||||
Automattic https://automattic.com (2014)
|
||||
Tencent Game DBA http://tencentdba.com/about (2016)
|
||||
Tencent TDSQL http://tdsql.org (2016)
|
||||
Verkkokauppa.com https://www.verkkokauppa.com (2015)
|
||||
|
@ -1418,7 +1418,7 @@ void close_statements()
|
||||
for (con= connections; con < next_con; con++)
|
||||
{
|
||||
if (con->stmt)
|
||||
mysql_stmt_close(con->stmt);
|
||||
do_stmt_close(con);
|
||||
con->stmt= 0;
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
|
4
debian/control
vendored
4
debian/control
vendored
@ -24,8 +24,8 @@ Build-Depends: bison,
|
||||
${LIBREADLINE_DEV}
|
||||
Standards-Version: 3.8.3
|
||||
Homepage: http://mariadb.org/
|
||||
Vcs-Browser: http://bazaar.launchpad.net/~maria-captains/maria/10.0/files
|
||||
Vcs-Bzr: bzr://lp:maria
|
||||
Vcs-Browser: https://github.com/MariaDB/server/
|
||||
Vcs-Git: https://github.com/MariaDB/server.git
|
||||
|
||||
Package: mariadb-galera-test-10.0
|
||||
Section: database
|
||||
|
@ -4,13 +4,12 @@ Booking.com https://www.booking.com Founding member, Platinum Sponsor of the Mar
|
||||
Alibaba Cloud https://www.alibabacloud.com/ Platinum Sponsor of the MariaDB Foundation
|
||||
Tencent Cloud https://cloud.tencent.com Platinum Sponsor of the MariaDB Foundation
|
||||
Microsoft https://microsoft.com/ Platinum Sponsor of the MariaDB Foundation
|
||||
MariaDB Corporation https://mariadb.com Founding member, Gold Sponsor of the MariaDB Foundation
|
||||
MariaDB Corporation https://mariadb.com Founding member, Platinum Sponsor of the MariaDB Foundation
|
||||
Visma https://visma.com Gold Sponsor of the MariaDB Foundation
|
||||
DBS https://dbs.com Gold Sponsor of the MariaDB Foundation
|
||||
IBM https://www.ibm.com Gold Sponsor of the MariaDB Foundation
|
||||
Nexedi https://www.nexedi.com Silver Sponsor of the MariaDB Foundation
|
||||
Acronis http://www.acronis.com Silver Sponsor of the MariaDB Foundation
|
||||
Auttomattic https://automattic.com Bronze Sponsor of the MariaDB Foundation
|
||||
Verkkokauppa.com https://www.verkkokauppa.com Bronze Sponsor of the MariaDB Foundation
|
||||
Virtuozzo https://virtuozzo.com Bronze Sponsor of the MariaDB Foundation
|
||||
Tencent Game DBA http://tencentdba.com/about Bronze Sponsor of the MariaDB Foundation
|
||||
|
@ -1883,5 +1883,15 @@ SELECT COLUMN_JSON(COLUMN_CREATE('test','First line\nSecond line')) AS json;
|
||||
json
|
||||
{"test":"First line\u000ASecond line"}
|
||||
#
|
||||
# MDEV-15230: column_json breaks cyrillic in 10.1.31
|
||||
#
|
||||
set names utf8;
|
||||
create table t1 (b blob);
|
||||
insert into t1 values (column_create('description',column_create('title','Описание')));
|
||||
select column_json(b) from t1;
|
||||
column_json(b)
|
||||
{"description":{"title":"Описание"}}
|
||||
drop table t1;
|
||||
#
|
||||
# end of 10.0 tests
|
||||
#
|
||||
|
@ -262,3 +262,9 @@ c2
|
||||
abcdefghi-abcdefghi
|
||||
DROP TABLE t1;
|
||||
SET optimizer_switch=@save_optimizer_switch;
|
||||
#
|
||||
# MDEV-13790 UNHEX() of a somewhat complicated CONCAT() returns NULL
|
||||
#
|
||||
SELECT UNHEX(CONCAT('414C2', HEX(8 + ROUND(RAND()*7)), SUBSTR(SHA(UUID()),6,33),HEX(2+ROUND(RAND()*8)))) IS NULL AS c1;
|
||||
c1
|
||||
0
|
||||
|
@ -571,6 +571,13 @@ AND 57813X540X1723 = 'Test';
|
||||
N AVG
|
||||
0 NULL
|
||||
drop table t1;
|
||||
SELECT NAME_CONST('a', -(1 OR 2)) OR 1;
|
||||
ERROR HY000: Incorrect arguments to NAME_CONST
|
||||
SELECT NAME_CONST('a', -(1 AND 2)) OR 1;
|
||||
ERROR HY000: Incorrect arguments to NAME_CONST
|
||||
SELECT NAME_CONST('a', -(1)) OR 1;
|
||||
NAME_CONST('a', -(1)) OR 1
|
||||
1
|
||||
#
|
||||
# MDEV-15630 uuid() function evaluates at wrong time in query
|
||||
#
|
||||
@ -582,13 +589,6 @@ COUNT(1) uid
|
||||
1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
DROP TABLE t1;
|
||||
SELECT NAME_CONST('a', -(1 OR 2)) OR 1;
|
||||
ERROR HY000: Incorrect arguments to NAME_CONST
|
||||
SELECT NAME_CONST('a', -(1 AND 2)) OR 1;
|
||||
ERROR HY000: Incorrect arguments to NAME_CONST
|
||||
SELECT NAME_CONST('a', -(1)) OR 1;
|
||||
NAME_CONST('a', -(1)) OR 1
|
||||
1
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
|
@ -4551,3 +4551,40 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select char(0xdf) AS `CHAR(0xDF)`
|
||||
#
|
||||
# MDEV-15619 using CONVERT() inside AES_ENCRYPT() in an UPDATE corrupts data
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL,
|
||||
session_id varchar(255) DEFAULT NULL,
|
||||
directory mediumtext,
|
||||
checksum int(10) DEFAULT NULL,
|
||||
last_update datetime DEFAULT NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY lastupdate (last_update)
|
||||
) DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES (1,'',NULL,38391,'2017-06-24 07:35:28');
|
||||
UPDATE t1 SET directory = AES_ENCRYPT(CONVERT('test stringrererejrjerjehrjekhrjkehrjkehrkjehrjkerhkjehrjekrhkjehrkjerhjkehrkjehrkjehrjkehrjkehrjkehrjkerjkehrjkehrjkehrjke rekjhrejrejhrjehgrehjgrhjerjhegrjherejhgrjhegrjehgrjhegrejhrgjehgrjhegrjhegrjhergjhegrjhegrhjegrjerhthkjjkdhjkgdfjkgjkdgdjkfjkhgjkfdhjgjkfdghkjdfghkjfdghfjkdghkdjfghdkjfghfjkdghfkjdghkjfdghfkjdghfkdjghfkjdghfdjkghjkdfhgdfjkghfjkdghfjkdghfjdkghfjkdghkfjdghfkjdghfkjdghkjdfghfjdkghjkfdghkjdfhgjkdfhgjkfdhgkjfdghkfjdhgkjfdgdjkejktjherjthkjrethkjrethjkerthjkerhtjkerhtkjerhtjkerhtjkerhtjkrehtkjerhtkjrehtjkrehtkjrehtkjerhtkjerhtjkrehtkjrehtjkrehtkjrethjkrethkjrehtkjethjkerhtjkrehtjkretkjerhtkjrehtjkerhtjkrehtjrehtkjrekjtrfgdsfgdhjsghjgfdhjsfhjdfgdhjshjdshjfghjdsfgjhsfgjhsdfgjhdsfgjdhsfgsjhfgjhsdfgsdjhfgjdhsfdjshfgdsjhfgjsdhfdjshfgdjhsfgdjshfgjdhsfgjhsdfgjhsdgfjhsdgfjhdsgfjhsgfjhsdgfjhdsgfhjsdehkjthrkjethjkre' USING latin1), '95F5A1F52A554'), last_update= NOW();
|
||||
SELECT directory IS NULL FROM t1;
|
||||
directory IS NULL
|
||||
0
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL PRIMARY KEY,
|
||||
directory mediumtext
|
||||
) DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES (1,AES_ENCRYPT(CONVERT(REPEAT('a',800) USING latin1),'95F5A1F52A554'));
|
||||
SELECT AES_DECRYPT(directory,'95F5A1F52A554') FROM t1;
|
||||
AES_DECRYPT(directory,'95F5A1F52A554')
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
DROP TABLE t1;
|
||||
SET @enc=AES_ENCRYPT(REPEAT(_latin1'a',800),'95F5A1F52A554');
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL PRIMARY KEY,
|
||||
directory mediumtext
|
||||
) DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES (1,AES_DECRYPT(CONVERT(@enc USING binary),'95F5A1F52A554'));
|
||||
SELECT * FROM t1;
|
||||
id directory
|
||||
1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
DROP TABLE t1;
|
||||
|
@ -2878,5 +2878,29 @@ NULL
|
||||
Warnings:
|
||||
Warning 1441 Datetime function: datetime field overflow
|
||||
#
|
||||
# MDEV-13202 Assertion `ltime->neg == 0' failed in date_to_datetime
|
||||
#
|
||||
CREATE TABLE t1 (i INT, d DATE);
|
||||
INSERT INTO t1 VALUES (1, '1970-01-01');
|
||||
SELECT MAX(NULLIF(i,1)) FROM t1 ORDER BY DATE_SUB(d,INTERVAL 17300000 HOUR);
|
||||
MAX(NULLIF(i,1))
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1441 Datetime function: datetime field overflow
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (i INT, d DATE);
|
||||
INSERT INTO t1 VALUES (1, '1970-01-01');
|
||||
SELECT CONCAT(DATE_SUB(d, INTERVAL 17300000 HOUR)) FROM t1;
|
||||
CONCAT(DATE_SUB(d, INTERVAL 17300000 HOUR))
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1441 Datetime function: datetime field overflow
|
||||
DROP TABLE t1;
|
||||
SELECT CONCAT(DATE_SUB(TIMESTAMP'1970-01-01 00:00:00', INTERVAL 17300000 HOUR));
|
||||
CONCAT(DATE_SUB(TIMESTAMP'1970-01-01 00:00:00', INTERVAL 17300000 HOUR))
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1441 Datetime function: datetime field overflow
|
||||
#
|
||||
# End of 10.0 tests
|
||||
#
|
||||
|
@ -723,4 +723,18 @@ SELECT * FROM t1 JOIN t2 ON c1 = c2 HAVING c2 > 'a' ORDER BY c2 LIMIT 1;
|
||||
c1 c2
|
||||
x x
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# MDEV-6736: Valgrind warnings 'Invalid read' in subselect_engine::calc_const_tables with SQ
|
||||
# in WHERE and HAVING, ORDER BY, materialization+semijoin
|
||||
#
|
||||
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (3),(8);
|
||||
CREATE TABLE t2 (b INT) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (2),(1);
|
||||
SELECT a FROM t1
|
||||
WHERE 9 IN ( SELECT MIN( a ) FROM t1 )
|
||||
HAVING a <> ( SELECT COUNT(*) FROM t2 )
|
||||
ORDER BY a;
|
||||
a
|
||||
DROP TABLE t1,t2;
|
||||
End of 10.0 tests
|
||||
|
@ -1,8 +1,10 @@
|
||||
The following options may be given as the first argument:
|
||||
--print-defaults Print the program argument list and exit.
|
||||
--no-defaults Don't read default options from any option file.
|
||||
The following specify which files/extra groups are read (specified before remaining options):
|
||||
--defaults-file=# Only read default options from the given file #.
|
||||
--defaults-extra-file=# Read this file after the global files are read.
|
||||
--defaults-group-suffix=# Additionally read default groups with # appended as a suffix.
|
||||
|
||||
--allow-suspicious-udfs
|
||||
Allows use of UDFs consisting of only one symbol xxx()
|
||||
|
@ -2634,3 +2634,14 @@ alter table t1 drop partition if exists p5;
|
||||
Warnings:
|
||||
Note 1507 Error in list of partitions to DROP
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT) ENGINE=MyISAM PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN (0));
|
||||
ALTER TABLE t1 ADD PARTITION (PARTITION p2 VALUES LESS THAN (1));
|
||||
PREPARE stmt FROM 'ALTER TABLE t1 ADD PARTITION IF NOT EXISTS (PARTITION p2 VALUES LESS THAN (2))';
|
||||
EXECUTE stmt;
|
||||
Warnings:
|
||||
Note 1517 Duplicate partition name p2
|
||||
EXECUTE stmt;
|
||||
Warnings:
|
||||
Note 1517 Duplicate partition name p2
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
|
@ -3,4 +3,4 @@ MySQL error code 1062 (ER_DUP_ENTRY): Duplicate entry '%-.192s' for key %d
|
||||
MySQL error code 1408 (ER_STARTUP): %s: ready for connections.
|
||||
Version: '%s' socket: '%s' port: %d %s
|
||||
MySQL error code 1459 (ER_TABLE_NEEDS_UPGRADE): Table upgrade required. Please do "REPAIR TABLE `%-.32s`" or dump/reload to fix it!
|
||||
MySQL error code 1461 (ER_MAX_PREPARED_STMT_COUNT_REACHED): Can't create more than max_prepared_stmt_count statements (current value: %lu)
|
||||
MySQL error code 1461 (ER_MAX_PREPARED_STMT_COUNT_REACHED): Can't create more than max_prepared_stmt_count statements (current value: %u)
|
||||
|
@ -820,7 +820,7 @@ Warnings:
|
||||
Warning 1292 Truncated incorrect max_prepared_stmt_count value: '10000000000000000'
|
||||
select @@max_prepared_stmt_count;
|
||||
@@max_prepared_stmt_count
|
||||
1048576
|
||||
4294967295
|
||||
set global max_prepared_stmt_count=default;
|
||||
select @@max_prepared_stmt_count;
|
||||
@@max_prepared_stmt_count
|
||||
|
@ -174,3 +174,9 @@ create database mysqltest1;
|
||||
create procedure mysqltest1.foo() select "foo";
|
||||
update mysql.proc set name='' where db='mysqltest1';
|
||||
drop database mysqltest1;
|
||||
create procedure p1() set @foo = 10;
|
||||
alter table mysql.proc drop primary key;
|
||||
drop procedure p1;
|
||||
ERROR HY000: Cannot load from mysql.proc. The table is probably corrupted
|
||||
alter table mysql.proc add primary key (db,name,type);
|
||||
drop procedure p1;
|
||||
|
@ -130,3 +130,37 @@ SET @@innodb_lock_wait_timeout= @innodb_lock_wait_timeout_saved;
|
||||
#
|
||||
# BUG 16041903: End of test case
|
||||
#
|
||||
#
|
||||
# MDEV-15035: SP using query with outer join and a parameter
|
||||
# in ON expression
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
id int NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1), (2);
|
||||
CREATE TABLE t2 (
|
||||
id int NOT NULL,
|
||||
id_foo int NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=InnoDB;
|
||||
INSERT INTO t2 VALUES (1, 1);
|
||||
DROP PROCEDURE IF EXISTS test_proc;
|
||||
CREATE PROCEDURE test_proc(IN param int)
|
||||
LANGUAGE SQL
|
||||
READS SQL DATA
|
||||
BEGIN
|
||||
SELECT DISTINCT f.id
|
||||
FROM t1 f
|
||||
LEFT OUTER JOIN t2 b ON b.id_foo = f.id
|
||||
WHERE (param <> 0 OR b.id IS NOT NULL);
|
||||
END|
|
||||
CALL test_proc(0);
|
||||
id
|
||||
1
|
||||
CALL test_proc(1);
|
||||
id
|
||||
1
|
||||
2
|
||||
DROP PROCEDURE IF EXISTS test_proc;
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -1641,3 +1641,21 @@ FROM mysql.column_stats;
|
||||
db_name table_name column_name HEX(min_value) HEX(max_value) nulls_ratio avg_frequency hist_size hist_type HEX(histogram)
|
||||
test t1 a D879626AF872675F73E662F8 D879626AF872675F73E662F8 0.0000 1.0000 0 NULL NULL
|
||||
drop table t1;
|
||||
#
|
||||
# MDEB-9744: session optimizer_use_condition_selectivity=5 causing SQL Error (1918):
|
||||
# Encountered illegal value '' when converting to DECIMAL
|
||||
#
|
||||
set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
|
||||
set optimizer_use_condition_selectivity=3, use_stat_tables=preferably;
|
||||
create table t1 (id int(10),cost decimal(9,2)) engine=innodb;
|
||||
ANALYZE TABLE t1 PERSISTENT FOR ALL;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze status OK
|
||||
create temporary table t2 (id int);
|
||||
insert into t2 (id) select id from t1 where cost > 0;
|
||||
select * from t2;
|
||||
id
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||
drop table t1,t2;
|
||||
|
@ -3155,4 +3155,30 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`c1` AS `c1`,`test`.`t2`.`c2` AS `c2`,`test`.`t4`.`c4` AS `c4` from `test`.`t1` left join (`test`.`t2` join `test`.`t4`) on(((`test`.`t2`.`c2` = `test`.`t1`.`c1`) and <in_optimizer>(`test`.`t1`.`c1`,<exists>(select `test`.`t3`.`c3` from `test`.`t3` where (<cache>(`test`.`t2`.`c2`) = `test`.`t3`.`c3`))))) where 1
|
||||
DROP TABLE t1,t2,t3,t4;
|
||||
#
|
||||
# MDEV-13699: Assertion `!new_field->field_name.str ||
|
||||
# strlen(new_field->field_name.str) == new_field->field_name.length'
|
||||
# failed in create_tmp_table on 2nd execution of PS with semijoin
|
||||
#
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (3),(4);
|
||||
CREATE TABLE t3 (c INT);
|
||||
CREATE ALGORITHM=MERGE VIEW v3 AS SELECT * FROM t3;
|
||||
INSERT INTO t3 VALUES (5),(6);
|
||||
PREPARE stmt FROM
|
||||
"SELECT * FROM t1
|
||||
WHERE EXISTS (
|
||||
SELECT * FROM t2 WHERE t1.a IN ( SELECT c AS fld FROM v3 )
|
||||
)";
|
||||
EXECUTE stmt;
|
||||
a
|
||||
EXECUTE stmt;
|
||||
a
|
||||
EXECUTE stmt;
|
||||
a
|
||||
drop view v3;
|
||||
drop table t1,t2,t3;
|
||||
# End of 5.5 test
|
||||
set optimizer_switch=@subselect_sj_tmp;
|
||||
|
@ -3169,6 +3169,32 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`c1` AS `c1`,`test`.`t2`.`c2` AS `c2`,`test`.`t4`.`c4` AS `c4` from `test`.`t1` left join (`test`.`t2` join `test`.`t4`) on(((`test`.`t2`.`c2` = `test`.`t1`.`c1`) and <in_optimizer>(`test`.`t1`.`c1`,<exists>(select `test`.`t3`.`c3` from `test`.`t3` where (<cache>(`test`.`t2`.`c2`) = `test`.`t3`.`c3`))))) where 1
|
||||
DROP TABLE t1,t2,t3,t4;
|
||||
#
|
||||
# MDEV-13699: Assertion `!new_field->field_name.str ||
|
||||
# strlen(new_field->field_name.str) == new_field->field_name.length'
|
||||
# failed in create_tmp_table on 2nd execution of PS with semijoin
|
||||
#
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (3),(4);
|
||||
CREATE TABLE t3 (c INT);
|
||||
CREATE ALGORITHM=MERGE VIEW v3 AS SELECT * FROM t3;
|
||||
INSERT INTO t3 VALUES (5),(6);
|
||||
PREPARE stmt FROM
|
||||
"SELECT * FROM t1
|
||||
WHERE EXISTS (
|
||||
SELECT * FROM t2 WHERE t1.a IN ( SELECT c AS fld FROM v3 )
|
||||
)";
|
||||
EXECUTE stmt;
|
||||
a
|
||||
EXECUTE stmt;
|
||||
a
|
||||
EXECUTE stmt;
|
||||
a
|
||||
drop view v3;
|
||||
drop table t1,t2,t3;
|
||||
# End of 5.5 test
|
||||
set optimizer_switch=@subselect_sj_tmp;
|
||||
#
|
||||
# BUG#49129: Wrong result with IN-subquery with join_cache_level=6 and firstmatch=off
|
||||
|
@ -2308,3 +2308,47 @@ col_int_nokey
|
||||
1
|
||||
DROP TABLE t1,t2,t3;
|
||||
SET TIMESTAMP=0;
|
||||
#
|
||||
# MDEV-15262 Wrong results for SELECT..WHERE non_indexed_datetime_column=indexed_time_column
|
||||
#
|
||||
SET TIMESTAMP=UNIX_TIMESTAMP('2012-01-31 10:14:35');
|
||||
CREATE TABLE t1 (col_time_key TIME, KEY(col_time_key));
|
||||
CREATE TABLE t2 (col_datetime_key DATETIME);
|
||||
INSERT INTO t1 VALUES ('-760:00:00'),('760:00:00');
|
||||
INSERT INTO t1 VALUES ('-770:00:00'),('770:00:00');
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key;
|
||||
col_datetime_key col_time_key
|
||||
2011-12-30 08:00:00 -760:00:00
|
||||
2012-03-02 16:00:00 760:00:00
|
||||
2011-12-29 22:00:00 -770:00:00
|
||||
2012-03-03 02:00:00 770:00:00
|
||||
SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key;
|
||||
col_datetime_key col_time_key
|
||||
2011-12-29 22:00:00 -770:00:00
|
||||
2011-12-30 08:00:00 -760:00:00
|
||||
2012-03-02 16:00:00 760:00:00
|
||||
2012-03-03 02:00:00 770:00:00
|
||||
INSERT INTO t1 VALUES ('-838:59:59'),('838:59:59');
|
||||
INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-838:59:59' HOUR_SECOND));
|
||||
INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '838:59:59' HOUR_SECOND));
|
||||
INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-839:00:00' HOUR_SECOND));
|
||||
INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '839:00:00' HOUR_SECOND));
|
||||
SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key;
|
||||
col_datetime_key col_time_key
|
||||
2011-12-30 08:00:00 -760:00:00
|
||||
2012-03-02 16:00:00 760:00:00
|
||||
2011-12-29 22:00:00 -770:00:00
|
||||
2012-03-03 02:00:00 770:00:00
|
||||
2011-12-27 01:00:01 -838:59:59
|
||||
2012-03-05 22:59:59 838:59:59
|
||||
SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key;
|
||||
col_datetime_key col_time_key
|
||||
2011-12-29 22:00:00 -770:00:00
|
||||
2011-12-30 08:00:00 -760:00:00
|
||||
2012-03-02 16:00:00 760:00:00
|
||||
2012-03-03 02:00:00 770:00:00
|
||||
2011-12-27 01:00:01 -838:59:59
|
||||
2012-03-05 22:59:59 838:59:59
|
||||
DROP TABLE t1, t2;
|
||||
SET TIMESTAMP=DEFAULT;
|
||||
|
@ -29,3 +29,13 @@ CREATE ALGORITHM=UNDEFINED VIEW `v1` AS select `t4`.`c1` AS `c1`,`t4`.`c2` AS `c
|
||||
UPDATE t1 a JOIN t2 b ON a.c1 = b.c1 JOIN v1 vw ON b.c2 = vw.c1 JOIN t3 del ON vw.c2 = del.c2 SET a.c2 = ( SELECT max(t.c1) FROM t3 t, v1 i WHERE del.c2 = t.c2 AND vw.c3 = i.c3 AND t.c3 = 4 ) WHERE a.c2 IS NULL OR a.c2 < '2011-05-01';
|
||||
drop view v1;
|
||||
drop table t1,t2,t3,t4;
|
||||
#
|
||||
# MDEV-14862: Server crashes in Bitmap<64u>::merge / add_key_field
|
||||
#
|
||||
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
CREATE TABLE t2 (b INT) ENGINE=InnoDB;
|
||||
DELETE FROM v1 WHERE a IN ( SELECT a FROM t2 );
|
||||
DELETE FROM v1 WHERE (a,a) IN ( SELECT a,a FROM t2 );
|
||||
drop view v1;
|
||||
drop table t1,t2;
|
||||
|
@ -1268,5 +1268,17 @@ c1 c2
|
||||
2 b2
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-15118 ExtractValue(xml,something_complex) does not work
|
||||
#
|
||||
CREATE TABLE t1 (a TEXT);
|
||||
INSERT INTO t1 VALUES (CONCAT('<a>aaa</a>'));
|
||||
SELECT ExtractValue(a, '/a') AS a FROM t1;
|
||||
a
|
||||
aaa
|
||||
SELECT ExtractValue(a, FROM_BASE64(TO_BASE64('/a'))) AS a FROM t1;
|
||||
a
|
||||
aaa
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 10.0 tests
|
||||
#
|
||||
|
@ -49,3 +49,5 @@ galera_toi_ddl_nonconflicting : MDEV-13549 Galera test failures
|
||||
galera_parallel_simple : MDEV-13549 Galera test failures
|
||||
galera_admin : MDEV-13549 Galera test failures
|
||||
MW-416 : MDEV-13549 Galera test failures
|
||||
galera_wan : MDEV-13549 Galera test failures
|
||||
MW-388 : MDEV-13549 Galera test failures
|
||||
|
@ -51,3 +51,7 @@ WHERE NAME='test/t';
|
||||
TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE
|
||||
# test/t 1 6 # Antelope Compact 0
|
||||
DROP TABLE t;
|
||||
CREATE TABLE t1(c1 INT) ENGINE=InnoDB;
|
||||
ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1);
|
||||
ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1);
|
||||
DROP TABLE t1;
|
||||
|
@ -1,4 +1,3 @@
|
||||
CREATE TABLE bug11754376 (c INT) ENGINE=INNODB;
|
||||
SET SESSION DEBUG_DBUG='+d,test_normalize_table_name_low';
|
||||
DROP TABLE bug11754376;
|
||||
SET SESSION DEBUG_DBUG='-d,test_normalize_table_name_low';
|
||||
|
24
mysql-test/suite/innodb/r/innodb_bug27216817.result
Normal file
24
mysql-test/suite/innodb/r/innodb_bug27216817.result
Normal file
@ -0,0 +1,24 @@
|
||||
create table t1 (a int not null, b int not null) engine=innodb;
|
||||
insert t1 values (1,2),(3,4);
|
||||
lock table t1 write, t1 tr read;
|
||||
flush status;
|
||||
alter table t1 add primary key (b);
|
||||
show status like 'Handler_read_rnd_next';
|
||||
Variable_name Value
|
||||
Handler_read_rnd_next 0
|
||||
unlock tables;
|
||||
alter table t1 drop primary key;
|
||||
lock table t1 write;
|
||||
flush status;
|
||||
alter table t1 add primary key (b);
|
||||
show status like 'Handler_read_rnd_next';
|
||||
Variable_name Value
|
||||
Handler_read_rnd_next 0
|
||||
unlock tables;
|
||||
alter table t1 drop primary key;
|
||||
flush status;
|
||||
alter table t1 add primary key (b);
|
||||
show status like 'Handler_read_rnd_next';
|
||||
Variable_name Value
|
||||
Handler_read_rnd_next 0
|
||||
drop table t1;
|
@ -3,7 +3,6 @@ create table bug56947(a int not null) engine = innodb;
|
||||
SET DEBUG_DBUG='+d,ib_rebuild_cannot_rename';
|
||||
alter table bug56947 add unique index (a);
|
||||
ERROR HY000: Got error 11 "xxx" from storage engine InnoDB
|
||||
SET DEBUG_DBUG='-d,ib_rebuild_cannot_rename';
|
||||
check table bug56947;
|
||||
Table Op Msg_type Msg_text
|
||||
test.bug56947 check status OK
|
||||
|
@ -1,26 +1,62 @@
|
||||
set names utf8;
|
||||
SET UNIQUE_CHECKS=0;
|
||||
CREATE TABLE corrupt_bit_test_ā(
|
||||
a INT AUTO_INCREMENT PRIMARY KEY,
|
||||
b CHAR(100),
|
||||
c INT,
|
||||
z INT,
|
||||
INDEX idx(b))
|
||||
ENGINE=InnoDB;
|
||||
INSERT INTO corrupt_bit_test_ā VALUES(0,'x',1, 1);
|
||||
CREATE UNIQUE INDEX idxā ON corrupt_bit_test_ā(c, b);
|
||||
CREATE UNIQUE INDEX idxē ON corrupt_bit_test_ā(z, b);
|
||||
SELECT * FROM corrupt_bit_test_ā;
|
||||
a b c z
|
||||
1 x 1 1
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+1,z+1 FROM corrupt_bit_test_ā;
|
||||
select count(*) from corrupt_bit_test_ā;
|
||||
count(*)
|
||||
2
|
||||
SET @save_dbug = @@SESSION.debug_dbug;
|
||||
SET debug_dbug = '+d,dict_set_index_corrupted';
|
||||
check table corrupt_bit_test_ā;
|
||||
Table Op Msg_type Msg_text
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idx" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idxā" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idxē" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check error Corrupt
|
||||
SET debug_dbug = @save_dbug;
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
ERROR HY000: Index "idx" is corrupted
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
ERROR HY000: Index "idx" is corrupted
|
||||
select c from corrupt_bit_test_ā;
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
select z from corrupt_bit_test_ā;
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Warning 180 InnoDB: Index "idxē" for table "test"."corrupt_bit_test_ā" is marked as corrupted
|
||||
Error 1712 Index corrupt_bit_test_ā is corrupted
|
||||
insert into corrupt_bit_test_ā values (10001, "a", 20001, 20001);
|
||||
select * from corrupt_bit_test_ā use index(primary) where a = 10001;
|
||||
a b c z
|
||||
10001 a 20001 20001
|
||||
begin;
|
||||
insert into corrupt_bit_test_ā values (10002, "a", 20002, 20002);
|
||||
delete from corrupt_bit_test_ā where a = 10001;
|
||||
insert into corrupt_bit_test_ā values (10001, "a", 20001, 20001);
|
||||
rollback;
|
||||
drop index idxā on corrupt_bit_test_ā;
|
||||
check table corrupt_bit_test_ā;
|
||||
Table Op Msg_type Msg_text
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idx" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idxē" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check error Corrupt
|
||||
set names utf8;
|
||||
select z from corrupt_bit_test_ā;
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
show create table corrupt_bit_test_ā;
|
||||
Table Create Table
|
||||
corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` (
|
||||
`a` int(11) NOT NULL AUTO_INCREMENT,
|
||||
@ -31,8 +67,12 @@ corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` (
|
||||
UNIQUE KEY `idxē` (`z`,`b`),
|
||||
KEY `idx` (`b`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=latin1
|
||||
drop index idxē on corrupt_bit_test_ā;
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
ERROR HY000: Index "idx" is corrupted
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
ERROR HY000: Index "idx" is corrupted
|
||||
show create table corrupt_bit_test_ā;
|
||||
Table Create Table
|
||||
corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` (
|
||||
`a` int(11) NOT NULL AUTO_INCREMENT,
|
||||
@ -42,7 +82,12 @@ corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` (
|
||||
PRIMARY KEY (`a`),
|
||||
KEY `idx` (`b`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=latin1
|
||||
drop index idx on corrupt_bit_test_ā;
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
select z from corrupt_bit_test_ā limit 10;
|
||||
z
|
||||
20001
|
||||
1
|
||||
2
|
||||
drop table corrupt_bit_test_ā;
|
||||
|
26
mysql-test/suite/innodb/r/mvcc.result
Normal file
26
mysql-test/suite/innodb/r/mvcc.result
Normal file
@ -0,0 +1,26 @@
|
||||
SET @save_per_table= @@GLOBAL.innodb_file_per_table;
|
||||
SET GLOBAL innodb_file_per_table= 1;
|
||||
#
|
||||
# MDEV-15249 Crash in MVCC read after IMPORT TABLESPACE
|
||||
#
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES(0);
|
||||
FLUSH TABLES t1 WITH READ LOCK;
|
||||
UNLOCK TABLES;
|
||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||
ALTER TABLE t1 FORCE, ALGORITHM=COPY;
|
||||
SELECT * FROM t1;
|
||||
ERROR HY000: Table definition has changed, please retry transaction
|
||||
COMMIT;
|
||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||
ALTER TABLE t1 DISCARD TABLESPACE;
|
||||
ALTER TABLE t1 IMPORT TABLESPACE;
|
||||
# FIXME: Block this with ER_TABLE_DEF_CHANGED
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
COMMIT;
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
0
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL innodb_file_per_table= @save_per_table;
|
43
mysql-test/suite/innodb/r/read_only_recover_committed.result
Normal file
43
mysql-test/suite/innodb/r/read_only_recover_committed.result
Normal file
@ -0,0 +1,43 @@
|
||||
CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t VALUES(1);
|
||||
BEGIN;
|
||||
INSERT INTO t VALUES(2);
|
||||
DELETE FROM t WHERE a=2;
|
||||
# Normal MariaDB shutdown would roll back the above transaction.
|
||||
# We want the transaction to remain open, so we will kill the server
|
||||
# after ensuring that any non-transactional files are clean.
|
||||
FLUSH TABLES;
|
||||
# Create another transaction that will be recovered as COMMITTED.
|
||||
BEGIN;
|
||||
SET DEBUG_SYNC='after_trx_committed_in_memory SIGNAL committed WAIT_FOR ever';
|
||||
COMMIT;
|
||||
SET DEBUG_SYNC='now WAIT_FOR committed';
|
||||
# Ensure that the above incomplete transactions become durable.
|
||||
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
||||
BEGIN;
|
||||
INSERT INTO t VALUES(-10000);
|
||||
ROLLBACK;
|
||||
SELECT * FROM t;
|
||||
a
|
||||
1
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
a
|
||||
1
|
||||
UPDATE t SET a=3 WHERE a=1;
|
||||
ERROR HY000: Table 't' is read only
|
||||
# Starting with MariaDB 10.2, innodb_read_only implies READ UNCOMMITTED.
|
||||
# In earlier versions, this would return the last committed version
|
||||
# (empty table)!
|
||||
SELECT * FROM t;
|
||||
a
|
||||
1
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
a
|
||||
1
|
||||
SELECT * FROM t;
|
||||
a
|
||||
1
|
||||
DROP TABLE t;
|
||||
NOT FOUND /Rolled back recovered transaction [^0]/ in mysqld.1.err
|
@ -52,5 +52,5 @@ INSERT INTO t1(a) SELECT NULL FROM t1;
|
||||
INSERT INTO t1(a) SELECT NULL FROM t1;
|
||||
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
||||
CREATE TABLE u(a SERIAL) ENGINE=INNODB;
|
||||
# Kill and restart
|
||||
FLUSH TABLES;
|
||||
DROP TABLE t,u;
|
||||
|
@ -71,6 +71,11 @@ WHERE NAME='test/t';
|
||||
|
||||
DROP TABLE t;
|
||||
|
||||
CREATE TABLE t1(c1 INT) ENGINE=InnoDB;
|
||||
ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1);
|
||||
ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1);
|
||||
DROP TABLE t1;
|
||||
|
||||
# Check that all connections opened by test cases in this file are really
|
||||
# gone so execution of other tests won't be affected by their presence.
|
||||
--source include/wait_until_count_sessions.inc
|
||||
|
@ -12,5 +12,3 @@ CREATE TABLE bug11754376 (c INT) ENGINE=INNODB;
|
||||
SET SESSION DEBUG_DBUG='+d,test_normalize_table_name_low';
|
||||
|
||||
DROP TABLE bug11754376;
|
||||
|
||||
SET SESSION DEBUG_DBUG='-d,test_normalize_table_name_low';
|
||||
|
@ -107,8 +107,5 @@ SLEEP 1;
|
||||
--enable_reconnect
|
||||
--source include/wait_until_connected_again.inc
|
||||
|
||||
# Note SET DEBUG = '-d,innodb_page_corruption_retries' is not required
|
||||
# because the session information is lost after server restart
|
||||
|
||||
--echo # Cleanup
|
||||
DROP TABLE t1;
|
||||
|
@ -11,7 +11,6 @@ SET DEBUG_DBUG='+d,ib_rebuild_cannot_rename';
|
||||
--replace_regex /"[^"]*"/"xxx"/
|
||||
--error ER_GET_ERRNO
|
||||
alter table bug56947 add unique index (a);
|
||||
SET DEBUG_DBUG='-d,ib_rebuild_cannot_rename';
|
||||
check table bug56947;
|
||||
|
||||
drop table bug56947;
|
||||
|
@ -8,7 +8,8 @@
|
||||
-- source include/have_debug.inc
|
||||
|
||||
-- disable_query_log
|
||||
call mtr.add_suppression("Flagged corruption of idx.*in");
|
||||
call mtr.add_suppression("Flagged corruption of idx.*in ");
|
||||
-- enable_query_log
|
||||
|
||||
set names utf8;
|
||||
|
||||
@ -37,9 +38,10 @@ INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+1,z+1 FROM corrupt_bit_test_ā;
|
||||
select count(*) from corrupt_bit_test_ā;
|
||||
|
||||
# This will flag all secondary indexes corrupted
|
||||
SET SESSION debug_dbug="+d,dict_set_index_corrupted";
|
||||
SET @save_dbug = @@SESSION.debug_dbug;
|
||||
SET debug_dbug = '+d,dict_set_index_corrupted';
|
||||
check table corrupt_bit_test_ā;
|
||||
SET SESSION debug_dbug="";
|
||||
SET debug_dbug = @save_dbug;
|
||||
|
||||
# Cannot create new indexes while corrupted indexes exist
|
||||
--error ER_INDEX_CORRUPT
|
||||
|
@ -26,7 +26,8 @@ call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE faile
|
||||
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
|
||||
call mtr.add_suppression("InnoDB: innodb_read_only prevents crash recovery");
|
||||
call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfiles");
|
||||
call mtr.add_suppression("InnoDB: Cannot create log files in read-only mode");
|
||||
call mtr.add_suppression("InnoDB: Cannot (create|resize) log files in read-only mode");
|
||||
call mtr.add_suppression("InnoDB: Can't initiate database recovery, running in read-only-mode");
|
||||
call mtr.add_suppression("InnoDB: Only one log file found");
|
||||
call mtr.add_suppression("InnoDB: Log file .*ib_logfile[01].* size");
|
||||
call mtr.add_suppression("InnoDB: Unable to open .*ib_logfile0. to check native AIO read support");
|
||||
|
52
mysql-test/suite/innodb/t/mvcc.test
Normal file
52
mysql-test/suite/innodb/t/mvcc.test
Normal file
@ -0,0 +1,52 @@
|
||||
--source include/have_innodb.inc
|
||||
|
||||
SET @save_per_table= @@GLOBAL.innodb_file_per_table;
|
||||
SET GLOBAL innodb_file_per_table= 1;
|
||||
|
||||
let MYSQLD_DATADIR =`SELECT @@datadir`;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15249 Crash in MVCC read after IMPORT TABLESPACE
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES(0);
|
||||
FLUSH TABLES t1 WITH READ LOCK;
|
||||
perl;
|
||||
do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl";
|
||||
ib_backup_tablespace("test", "t1");
|
||||
EOF
|
||||
UNLOCK TABLES;
|
||||
|
||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||
|
||||
connect (con1,localhost,root,,);
|
||||
ALTER TABLE t1 FORCE, ALGORITHM=COPY;
|
||||
|
||||
connection default;
|
||||
--error ER_TABLE_DEF_CHANGED
|
||||
SELECT * FROM t1;
|
||||
COMMIT;
|
||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||
|
||||
connection con1;
|
||||
|
||||
ALTER TABLE t1 DISCARD TABLESPACE;
|
||||
|
||||
perl;
|
||||
do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl";
|
||||
ib_restore_tablespace("test", "t1");
|
||||
EOF
|
||||
|
||||
ALTER TABLE t1 IMPORT TABLESPACE;
|
||||
disconnect con1;
|
||||
|
||||
connection default;
|
||||
--echo # FIXME: Block this with ER_TABLE_DEF_CHANGED
|
||||
SELECT * FROM t1;
|
||||
COMMIT;
|
||||
SELECT * FROM t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
SET GLOBAL innodb_file_per_table= @save_per_table;
|
68
mysql-test/suite/innodb/t/read_only_recover_committed.test
Normal file
68
mysql-test/suite/innodb/t/read_only_recover_committed.test
Normal file
@ -0,0 +1,68 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
# need to restart server
|
||||
--source include/not_embedded.inc
|
||||
|
||||
--connect(con1, localhost, root)
|
||||
CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
INSERT INTO t VALUES(1);
|
||||
BEGIN;
|
||||
# Generate insert_undo log.
|
||||
INSERT INTO t VALUES(2);
|
||||
# Generate update_undo log.
|
||||
DELETE FROM t WHERE a=2;
|
||||
--connect(con2, localhost, root)
|
||||
--echo # Normal MariaDB shutdown would roll back the above transaction.
|
||||
--echo # We want the transaction to remain open, so we will kill the server
|
||||
--echo # after ensuring that any non-transactional files are clean.
|
||||
FLUSH TABLES;
|
||||
--echo # Create another transaction that will be recovered as COMMITTED.
|
||||
BEGIN;
|
||||
# Generate multiple pages of both insert_undo and update_undo, so that
|
||||
# the state TRX_UNDO_CACHE will not be chosen.
|
||||
--disable_query_log
|
||||
let $n= 10000;
|
||||
while ($n) {
|
||||
dec $n;
|
||||
eval INSERT INTO t VALUES(-$n);
|
||||
eval DELETE FROM t WHERE a=-$n;
|
||||
}
|
||||
--enable_query_log
|
||||
SET DEBUG_SYNC='after_trx_committed_in_memory SIGNAL committed WAIT_FOR ever';
|
||||
send COMMIT;
|
||||
|
||||
connection default;
|
||||
SET DEBUG_SYNC='now WAIT_FOR committed';
|
||||
--echo # Ensure that the above incomplete transactions become durable.
|
||||
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
||||
BEGIN;
|
||||
INSERT INTO t VALUES(-10000);
|
||||
ROLLBACK;
|
||||
--let $restart_parameters= --innodb-force-recovery=3
|
||||
--let $shutdown_timeout= 0
|
||||
--source include/restart_mysqld.inc
|
||||
--let $shutdown_timeout= 30
|
||||
--disconnect con1
|
||||
--disconnect con2
|
||||
SELECT * FROM t;
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
# refused on MySQL 5.6, MariaDB 10.0, 10.1, but not MariaDB 10.2+
|
||||
--error ER_OPEN_AS_READONLY
|
||||
UPDATE t SET a=3 WHERE a=1;
|
||||
--let $restart_parameters= --innodb-read-only
|
||||
--source include/restart_mysqld.inc
|
||||
--echo # Starting with MariaDB 10.2, innodb_read_only implies READ UNCOMMITTED.
|
||||
--echo # In earlier versions, this would return the last committed version
|
||||
--echo # (empty table)!
|
||||
SELECT * FROM t;
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
--let $restart_parameters=
|
||||
--source include/restart_mysqld.inc
|
||||
SELECT * FROM t;
|
||||
DROP TABLE t;
|
||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
--let SEARCH_PATTERN= Rolled back recovered transaction [^0]
|
||||
--source include/search_pattern_in_file.inc
|
@ -41,7 +41,11 @@ INSERT INTO t1(a) SELECT NULL FROM t1;
|
||||
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
||||
CREATE TABLE u(a SERIAL) ENGINE=INNODB;
|
||||
|
||||
--source include/kill_and_restart_mysqld.inc
|
||||
FLUSH TABLES;
|
||||
|
||||
--let $shutdown_timeout=0
|
||||
--source include/restart_mysqld.inc
|
||||
--let $shutdown_timeout=60
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
--disable_query_log
|
||||
|
@ -2,5 +2,4 @@ CREATE TABLE t (a INT, b TEXT) engine=innodb;
|
||||
SET debug_dbug='+d,alter_table_rollback_new_index';
|
||||
ALTER TABLE t ADD FULLTEXT INDEX (b(64));
|
||||
ERROR HY000: Unknown error
|
||||
SET debug_dbug='-d,alter_table_rollback_new_index';
|
||||
DROP TABLE t;
|
||||
|
@ -88,9 +88,10 @@ title VARCHAR(200),
|
||||
body TEXT,
|
||||
FULLTEXT (title,body)
|
||||
) ENGINE=InnoDB;
|
||||
SET @saved_debug_dbug = @@SESSION.debug_dbug;
|
||||
SET SESSION debug_dbug="+d,ib_dict_create_index_tree_fail";
|
||||
CREATE FULLTEXT INDEX idx ON articles(body);
|
||||
ERROR HY000: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space
|
||||
SET SESSION debug_dbug="-d,ib_dict_create_index_tree_fail";
|
||||
SET SESSION debug_dbug=@saved_debug_dbug;
|
||||
ALTER TABLE articles STATS_PERSISTENT=DEFAULT;
|
||||
DROP TABLE articles;
|
||||
|
@ -26,6 +26,5 @@ SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('"mysql database"' IN BOOLEAN
|
||||
ERROR HY000: Table handler out of memory
|
||||
SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('"mysql database" @ 5' IN BOOLEAN MODE);
|
||||
ERROR HY000: Table handler out of memory
|
||||
SET SESSION debug_dbug="-d,fts_instrument_result_cache_limit";
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL innodb_ft_result_cache_limit=default;
|
||||
|
@ -14,6 +14,4 @@ SET debug_dbug='+d,alter_table_rollback_new_index';
|
||||
-- error ER_UNKNOWN_ERROR
|
||||
ALTER TABLE t ADD FULLTEXT INDEX (b(64));
|
||||
|
||||
SET debug_dbug='-d,alter_table_rollback_new_index';
|
||||
|
||||
DROP TABLE t;
|
||||
|
@ -197,10 +197,11 @@ CREATE TABLE articles (
|
||||
# Abort the operation in dict_create_index_step by setting
|
||||
# return status of dict_create_index_tree_step() to DB_OUT_OF_MEMORY
|
||||
# The newly create dict_index_t should be removed from fts cache
|
||||
SET @saved_debug_dbug = @@SESSION.debug_dbug;
|
||||
SET SESSION debug_dbug="+d,ib_dict_create_index_tree_fail";
|
||||
--error ER_OUT_OF_RESOURCES
|
||||
CREATE FULLTEXT INDEX idx ON articles(body);
|
||||
SET SESSION debug_dbug="-d,ib_dict_create_index_tree_fail";
|
||||
SET SESSION debug_dbug=@saved_debug_dbug;
|
||||
|
||||
# This simply go through ha_innobase::commit_inplace_alter_table
|
||||
# and do a fts_check_cached_index()
|
||||
|
@ -44,8 +44,6 @@ SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('"mysql database"' IN BOOLEAN
|
||||
--error 128
|
||||
SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('"mysql database" @ 5' IN BOOLEAN MODE);
|
||||
|
||||
SET SESSION debug_dbug="-d,fts_instrument_result_cache_limit";
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
SET GLOBAL innodb_ft_result_cache_limit=default;
|
||||
|
@ -35,3 +35,13 @@ ALTER TABLE t1 REORGANIZE PARTITION p1 INTO
|
||||
PARTITION p3 VALUES IN (4,5,6)
|
||||
);
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# MDEV-15456 Server crashes upon adding or dropping a partition in ALTER under LOCK TABLE after ER_SAME_NAME_PARTITION
|
||||
#
|
||||
--eval create table t1 (i int) engine=$engine partition by range(i) (partition p0 values less than (10))
|
||||
lock table t1 write;
|
||||
--error ER_SAME_NAME_PARTITION
|
||||
alter table t1 add partition (partition p0 values less than (20));
|
||||
alter table t1 add partition (partition p1 values less than (20)) /* comment */;
|
||||
drop table t1;
|
||||
|
@ -47,3 +47,9 @@ PARTITION p3 VALUES IN (4,5,6)
|
||||
);
|
||||
ERROR HY000: Syntax error: LIST PARTITIONING requires definition of VALUES IN for each partition
|
||||
DROP TABLE t1;
|
||||
create table t1 (i int) engine=InnoDB partition by range(i) (partition p0 values less than (10));
|
||||
lock table t1 write;
|
||||
alter table t1 add partition (partition p0 values less than (20));
|
||||
ERROR HY000: Duplicate partition name p0
|
||||
alter table t1 add partition (partition p1 values less than (20)) /* comment */;
|
||||
drop table t1;
|
||||
|
@ -69,3 +69,9 @@ PARTITION p3 VALUES IN (4,5,6)
|
||||
);
|
||||
ERROR HY000: Syntax error: LIST PARTITIONING requires definition of VALUES IN for each partition
|
||||
DROP TABLE t1;
|
||||
create table t1 (i int) engine=Aria partition by range(i) (partition p0 values less than (10));
|
||||
lock table t1 write;
|
||||
alter table t1 add partition (partition p0 values less than (20));
|
||||
ERROR HY000: Duplicate partition name p0
|
||||
alter table t1 add partition (partition p1 values less than (20)) /* comment */;
|
||||
drop table t1;
|
||||
|
@ -42,3 +42,9 @@ PARTITION p3 VALUES IN (4,5,6)
|
||||
);
|
||||
ERROR HY000: Syntax error: LIST PARTITIONING requires definition of VALUES IN for each partition
|
||||
DROP TABLE t1;
|
||||
create table t1 (i int) engine=MyISAM partition by range(i) (partition p0 values less than (10));
|
||||
lock table t1 write;
|
||||
alter table t1 add partition (partition p0 values less than (20));
|
||||
ERROR HY000: Duplicate partition name p0
|
||||
alter table t1 add partition (partition p1 values less than (20)) /* comment */;
|
||||
drop table t1;
|
||||
|
@ -46,40 +46,40 @@ Warnings:
|
||||
Warning 1292 Truncated incorrect max_prepared_stmt_count value: '100000000000'
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
@@global.max_prepared_stmt_count
|
||||
1048576
|
||||
4294967295
|
||||
SET @@global.max_prepared_stmt_count = 10000.01;
|
||||
ERROR 42000: Incorrect argument type to variable 'max_prepared_stmt_count'
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
@@global.max_prepared_stmt_count
|
||||
1048576
|
||||
4294967295
|
||||
SET @@global.max_prepared_stmt_count = -1024;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect max_prepared_stmt_count value: '-1024'
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
@@global.max_prepared_stmt_count
|
||||
0
|
||||
SET @@global.max_prepared_stmt_count = 1048577;
|
||||
SET @@global.max_prepared_stmt_count = 4294967296;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect max_prepared_stmt_count value: '1048577'
|
||||
Warning 1292 Truncated incorrect max_prepared_stmt_count value: '4294967296'
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
@@global.max_prepared_stmt_count
|
||||
1048576
|
||||
SET @@global.max_prepared_stmt_count = 104857612;
|
||||
4294967295
|
||||
SET @@global.max_prepared_stmt_count = 4294967295*1024;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect max_prepared_stmt_count value: '104857612'
|
||||
Warning 1292 Truncated incorrect max_prepared_stmt_count value: '4398046510080'
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
@@global.max_prepared_stmt_count
|
||||
1048576
|
||||
4294967295
|
||||
SET @@global.max_prepared_stmt_count = ON;
|
||||
ERROR 42000: Incorrect argument type to variable 'max_prepared_stmt_count'
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
@@global.max_prepared_stmt_count
|
||||
1048576
|
||||
4294967295
|
||||
SET @@global.max_prepared_stmt_count = 'test';
|
||||
ERROR 42000: Incorrect argument type to variable 'max_prepared_stmt_count'
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
@@global.max_prepared_stmt_count
|
||||
1048576
|
||||
4294967295
|
||||
'#-------------------FN_DYNVARS_081_05----------------------------#'
|
||||
SET @@session.max_prepared_stmt_count = 4096;
|
||||
ERROR HY000: Variable 'max_prepared_stmt_count' is a GLOBAL variable and should be set with SET GLOBAL
|
||||
|
@ -27,7 +27,7 @@ Warnings:
|
||||
Warning 1292 Truncated incorrect table_open_cache value: '1073741824'
|
||||
SELECT @@global.table_open_cache ;
|
||||
@@global.table_open_cache
|
||||
524288
|
||||
1048576
|
||||
SET @@global.table_open_cache = 18000;
|
||||
SELECT @@global.table_open_cache ;
|
||||
@@global.table_open_cache
|
||||
@ -48,7 +48,7 @@ Warnings:
|
||||
Warning 1292 Truncated incorrect table_open_cache value: '100000000000'
|
||||
SELECT @@global.table_open_cache ;
|
||||
@@global.table_open_cache
|
||||
524288
|
||||
1048576
|
||||
SET @@global.table_open_cache = -1024;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect table_open_cache value: '-1024'
|
||||
|
@ -92,9 +92,9 @@ SET @@global.max_prepared_stmt_count = 10000.01;
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
SET @@global.max_prepared_stmt_count = -1024;
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
SET @@global.max_prepared_stmt_count = 1048577;
|
||||
SET @@global.max_prepared_stmt_count = 4294967296;
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
SET @@global.max_prepared_stmt_count = 104857612;
|
||||
SET @@global.max_prepared_stmt_count = 4294967295*1024;
|
||||
SELECT @@global.max_prepared_stmt_count;
|
||||
|
||||
--Error ER_WRONG_TYPE_FOR_VAR
|
||||
|
@ -928,6 +928,15 @@ SELECT COLUMN_JSON(COLUMN_CREATE('a',1 AS DECIMAL,'b',1 AS DECIMAL));
|
||||
SELECT COLUMN_JSON(COLUMN_CREATE('test','"\\\t\n\Z')) AS json;
|
||||
SELECT COLUMN_JSON(COLUMN_CREATE('test','First line\nSecond line')) AS json;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15230: column_json breaks cyrillic in 10.1.31
|
||||
--echo #
|
||||
set names utf8;
|
||||
create table t1 (b blob);
|
||||
insert into t1 values (column_create('description',column_create('title','Описание')));
|
||||
select column_json(b) from t1;
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # end of 10.0 tests
|
||||
--echo #
|
||||
|
@ -236,3 +236,9 @@ SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT TRIM(t) t2 FROM t1) sub;
|
||||
DROP TABLE t1;
|
||||
|
||||
SET optimizer_switch=@save_optimizer_switch;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-13790 UNHEX() of a somewhat complicated CONCAT() returns NULL
|
||||
--echo #
|
||||
|
||||
SELECT UNHEX(CONCAT('414C2', HEX(8 + ROUND(RAND()*7)), SUBSTR(SHA(UUID()),6,33),HEX(2+ROUND(RAND()*8)))) IS NULL AS c1;
|
||||
|
@ -596,6 +596,15 @@ AND 57813X540X1723 = 'Test';
|
||||
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#12735545 - PARSER STACK OVERFLOW WITH NAME_CONST
|
||||
# CONTAINING OR EXPRESSION
|
||||
#
|
||||
--error ER_WRONG_ARGUMENTS
|
||||
SELECT NAME_CONST('a', -(1 OR 2)) OR 1;
|
||||
--error ER_WRONG_ARGUMENTS
|
||||
SELECT NAME_CONST('a', -(1 AND 2)) OR 1;
|
||||
SELECT NAME_CONST('a', -(1)) OR 1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15630 uuid() function evaluates at wrong time in query
|
||||
@ -608,16 +617,6 @@ SELECT COUNT(1), UUID() as uid FROM t1 GROUP BY uid;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
#
|
||||
# Bug#12735545 - PARSER STACK OVERFLOW WITH NAME_CONST
|
||||
# CONTAINING OR EXPRESSION
|
||||
#
|
||||
--error ER_WRONG_ARGUMENTS
|
||||
SELECT NAME_CONST('a', -(1 OR 2)) OR 1;
|
||||
--error ER_WRONG_ARGUMENTS
|
||||
SELECT NAME_CONST('a', -(1 AND 2)) OR 1;
|
||||
SELECT NAME_CONST('a', -(1)) OR 1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.5 tests
|
||||
--echo #
|
||||
|
@ -1754,3 +1754,39 @@ EXECUTE stmt;
|
||||
EXPLAIN EXTENDED SELECT CHAR(0xDF USING latin1);
|
||||
EXPLAIN EXTENDED SELECT CHAR(0xDF USING `binary`);
|
||||
EXPLAIN EXTENDED SELECT CHAR(0xDF);
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15619 using CONVERT() inside AES_ENCRYPT() in an UPDATE corrupts data
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL,
|
||||
session_id varchar(255) DEFAULT NULL,
|
||||
directory mediumtext,
|
||||
checksum int(10) DEFAULT NULL,
|
||||
last_update datetime DEFAULT NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY lastupdate (last_update)
|
||||
) DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES (1,'',NULL,38391,'2017-06-24 07:35:28');
|
||||
UPDATE t1 SET directory = AES_ENCRYPT(CONVERT('test stringrererejrjerjehrjekhrjkehrjkehrkjehrjkerhkjehrjekrhkjehrkjerhjkehrkjehrkjehrjkehrjkehrjkehrjkerjkehrjkehrjkehrjke rekjhrejrejhrjehgrehjgrhjerjhegrjherejhgrjhegrjehgrjhegrejhrgjehgrjhegrjhegrjhergjhegrjhegrhjegrjerhthkjjkdhjkgdfjkgjkdgdjkfjkhgjkfdhjgjkfdghkjdfghkjfdghfjkdghkdjfghdkjfghfjkdghfkjdghkjfdghfkjdghfkdjghfkjdghfdjkghjkdfhgdfjkghfjkdghfjkdghfjdkghfjkdghkfjdghfkjdghfkjdghkjdfghfjdkghjkfdghkjdfhgjkdfhgjkfdhgkjfdghkfjdhgkjfdgdjkejktjherjthkjrethkjrethjkerthjkerhtjkerhtkjerhtjkerhtjkerhtjkrehtkjerhtkjrehtjkrehtkjrehtkjerhtkjerhtjkrehtkjrehtjkrehtkjrethjkrethkjrehtkjethjkerhtjkrehtjkretkjerhtkjrehtjkerhtjkrehtjrehtkjrekjtrfgdsfgdhjsghjgfdhjsfhjdfgdhjshjdshjfghjdsfgjhsfgjhsdfgjhdsfgjdhsfgsjhfgjhsdfgsdjhfgjdhsfdjshfgdsjhfgjsdhfdjshfgdjhsfgdjshfgjdhsfgjhsdfgjhsdgfjhsdgfjhdsgfjhsgfjhsdgfjhdsgfhjsdehkjthrkjethjkre' USING latin1), '95F5A1F52A554'), last_update= NOW();
|
||||
SELECT directory IS NULL FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL PRIMARY KEY,
|
||||
directory mediumtext
|
||||
) DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES (1,AES_ENCRYPT(CONVERT(REPEAT('a',800) USING latin1),'95F5A1F52A554'));
|
||||
SELECT AES_DECRYPT(directory,'95F5A1F52A554') FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
SET @enc=AES_ENCRYPT(REPEAT(_latin1'a',800),'95F5A1F52A554');
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL PRIMARY KEY,
|
||||
directory mediumtext
|
||||
) DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES (1,AES_DECRYPT(CONVERT(@enc USING binary),'95F5A1F52A554'));
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
@ -1758,6 +1758,22 @@ SELECT ADDDATE(DATE'0000-01-01', INTERVAL '3652423:0:0:315569433559' DAY_SECOND)
|
||||
SELECT ADDDATE(DATE'0000-01-01', INTERVAL '0:87658175:0:315569433559' DAY_SECOND);
|
||||
SELECT ADDDATE(DATE'0000-01-01', INTERVAL '0:0:5259490559:315569433599' DAY_SECOND);
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-13202 Assertion `ltime->neg == 0' failed in date_to_datetime
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (i INT, d DATE);
|
||||
INSERT INTO t1 VALUES (1, '1970-01-01');
|
||||
SELECT MAX(NULLIF(i,1)) FROM t1 ORDER BY DATE_SUB(d,INTERVAL 17300000 HOUR);
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (i INT, d DATE);
|
||||
INSERT INTO t1 VALUES (1, '1970-01-01');
|
||||
SELECT CONCAT(DATE_SUB(d, INTERVAL 17300000 HOUR)) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
SELECT CONCAT(DATE_SUB(TIMESTAMP'1970-01-01 00:00:00', INTERVAL 17300000 HOUR));
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.0 tests
|
||||
|
@ -759,4 +759,22 @@ SELECT * FROM t1 JOIN t2 ON c1 = c2 HAVING c2 > 'a' ORDER BY c2 LIMIT 1;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-6736: Valgrind warnings 'Invalid read' in subselect_engine::calc_const_tables with SQ
|
||||
--echo # in WHERE and HAVING, ORDER BY, materialization+semijoin
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (3),(8);
|
||||
|
||||
CREATE TABLE t2 (b INT) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (2),(1);
|
||||
|
||||
SELECT a FROM t1
|
||||
WHERE 9 IN ( SELECT MIN( a ) FROM t1 )
|
||||
HAVING a <> ( SELECT COUNT(*) FROM t2 )
|
||||
ORDER BY a;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo End of 10.0 tests
|
||||
|
@ -2884,3 +2884,16 @@ alter table t1 drop partition if exists p5;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# MDEV-14696 Server crashes in in prep_alter_part_table on 2nd execution of PS.
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a INT) ENGINE=MyISAM PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN (0));
|
||||
ALTER TABLE t1 ADD PARTITION (PARTITION p2 VALUES LESS THAN (1));
|
||||
PREPARE stmt FROM 'ALTER TABLE t1 ADD PARTITION IF NOT EXISTS (PARTITION p2 VALUES LESS THAN (2))';
|
||||
EXECUTE stmt;
|
||||
EXECUTE stmt;
|
||||
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
@ -286,3 +286,13 @@ create database mysqltest1;
|
||||
create procedure mysqltest1.foo() select "foo";
|
||||
update mysql.proc set name='' where db='mysqltest1';
|
||||
drop database mysqltest1;
|
||||
|
||||
#
|
||||
# BUG#26881798: SERVER EXITS WHEN PRIMARY KEY IN MYSQL.PROC IS DROPPED
|
||||
#
|
||||
create procedure p1() set @foo = 10;
|
||||
alter table mysql.proc drop primary key;
|
||||
--error ER_CANNOT_LOAD_FROM_TABLE_V2
|
||||
drop procedure p1;
|
||||
alter table mysql.proc add primary key (db,name,type);
|
||||
drop procedure p1;
|
||||
|
@ -158,5 +158,47 @@ SET @@innodb_lock_wait_timeout= @innodb_lock_wait_timeout_saved;
|
||||
--echo # BUG 16041903: End of test case
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15035: SP using query with outer join and a parameter
|
||||
--echo # in ON expression
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (
|
||||
id int NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
INSERT INTO t1 VALUES (1), (2);
|
||||
|
||||
CREATE TABLE t2 (
|
||||
id int NOT NULL,
|
||||
id_foo int NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
INSERT INTO t2 VALUES (1, 1);
|
||||
|
||||
--disable_warnings
|
||||
DROP PROCEDURE IF EXISTS test_proc;
|
||||
--enable_warnings
|
||||
|
||||
DELIMITER |;
|
||||
CREATE PROCEDURE test_proc(IN param int)
|
||||
LANGUAGE SQL
|
||||
READS SQL DATA
|
||||
BEGIN
|
||||
SELECT DISTINCT f.id
|
||||
FROM t1 f
|
||||
LEFT OUTER JOIN t2 b ON b.id_foo = f.id
|
||||
WHERE (param <> 0 OR b.id IS NOT NULL);
|
||||
END|
|
||||
DELIMITER ;|
|
||||
|
||||
CALL test_proc(0);
|
||||
CALL test_proc(1);
|
||||
|
||||
DROP PROCEDURE IF EXISTS test_proc;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
# Wait till we reached the initial number of concurrent sessions
|
||||
--source include/wait_until_count_sessions.inc
|
||||
|
@ -717,3 +717,23 @@ select db_name, table_name, column_name,
|
||||
FROM mysql.column_stats;
|
||||
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEB-9744: session optimizer_use_condition_selectivity=5 causing SQL Error (1918):
|
||||
--echo # Encountered illegal value '' when converting to DECIMAL
|
||||
--echo #
|
||||
|
||||
set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
|
||||
set optimizer_use_condition_selectivity=3, use_stat_tables=preferably;
|
||||
|
||||
create table t1 (id int(10),cost decimal(9,2)) engine=innodb;
|
||||
ANALYZE TABLE t1 PERSISTENT FOR ALL;
|
||||
|
||||
create temporary table t2 (id int);
|
||||
insert into t2 (id) select id from t1 where cost > 0;
|
||||
select * from t2;
|
||||
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||
drop table t1,t2;
|
||||
|
||||
|
@ -2845,5 +2845,35 @@ eval EXPLAIN EXTENDED $q2;
|
||||
|
||||
DROP TABLE t1,t2,t3,t4;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-13699: Assertion `!new_field->field_name.str ||
|
||||
--echo # strlen(new_field->field_name.str) == new_field->field_name.length'
|
||||
--echo # failed in create_tmp_table on 2nd execution of PS with semijoin
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
|
||||
CREATE TABLE t2 (b INT);
|
||||
INSERT INTO t2 VALUES (3),(4);
|
||||
|
||||
CREATE TABLE t3 (c INT);
|
||||
CREATE ALGORITHM=MERGE VIEW v3 AS SELECT * FROM t3;
|
||||
INSERT INTO t3 VALUES (5),(6);
|
||||
|
||||
PREPARE stmt FROM
|
||||
"SELECT * FROM t1
|
||||
WHERE EXISTS (
|
||||
SELECT * FROM t2 WHERE t1.a IN ( SELECT c AS fld FROM v3 )
|
||||
)";
|
||||
EXECUTE stmt;
|
||||
EXECUTE stmt;
|
||||
EXECUTE stmt;
|
||||
|
||||
drop view v3;
|
||||
drop table t1,t2,t3;
|
||||
|
||||
--echo # End of 5.5 test
|
||||
|
||||
# The following command must be the last one the file
|
||||
set optimizer_switch=@subselect_sj_tmp;
|
||||
|
@ -172,6 +172,29 @@ eval $query;
|
||||
DROP TABLE t1,t2,t3;
|
||||
SET TIMESTAMP=0; # back to current time
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15262 Wrong results for SELECT..WHERE non_indexed_datetime_column=indexed_time_column
|
||||
--echo #
|
||||
|
||||
SET TIMESTAMP=UNIX_TIMESTAMP('2012-01-31 10:14:35');
|
||||
CREATE TABLE t1 (col_time_key TIME, KEY(col_time_key));
|
||||
CREATE TABLE t2 (col_datetime_key DATETIME);
|
||||
INSERT INTO t1 VALUES ('-760:00:00'),('760:00:00');
|
||||
INSERT INTO t1 VALUES ('-770:00:00'),('770:00:00');
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key;
|
||||
SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key;
|
||||
INSERT INTO t1 VALUES ('-838:59:59'),('838:59:59');
|
||||
INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-838:59:59' HOUR_SECOND));
|
||||
INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '838:59:59' HOUR_SECOND));
|
||||
INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-839:00:00' HOUR_SECOND));
|
||||
INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '839:00:00' HOUR_SECOND));
|
||||
SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key;
|
||||
SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key;
|
||||
DROP TABLE t1, t2;
|
||||
SET TIMESTAMP=DEFAULT;
|
||||
|
||||
#
|
||||
# End of 10.0 tests
|
||||
#
|
||||
|
@ -37,3 +37,16 @@ UPDATE t1 a JOIN t2 b ON a.c1 = b.c1 JOIN v1 vw ON b.c2 = vw.c1 JOIN t3 del ON v
|
||||
|
||||
drop view v1;
|
||||
drop table t1,t2,t3,t4;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-14862: Server crashes in Bitmap<64u>::merge / add_key_field
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
CREATE TABLE t2 (b INT) ENGINE=InnoDB;
|
||||
DELETE FROM v1 WHERE a IN ( SELECT a FROM t2 );
|
||||
DELETE FROM v1 WHERE (a,a) IN ( SELECT a,a FROM t2 );
|
||||
|
||||
drop view v1;
|
||||
drop table t1,t2;
|
||||
|
@ -748,6 +748,15 @@ SELECT *,IF(@i:=c1,ExtractValue('<a><b>b1</b><b>b2</b></a>','//b[$@i]'),0) AS xp
|
||||
SELECT * FROM t1 WHERE c2=IF(@i:=c1,ExtractValue('<a><b>b1</b><b>b2</b></a>','//b[$@i]'),0);
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15118 ExtractValue(xml,something_complex) does not work
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a TEXT);
|
||||
INSERT INTO t1 VALUES (CONCAT('<a>aaa</a>'));
|
||||
SELECT ExtractValue(a, '/a') AS a FROM t1;
|
||||
SELECT ExtractValue(a, FROM_BASE64(TO_BASE64('/a'))) AS a FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.0 tests
|
||||
|
@ -23,59 +23,59 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Based on 10.0 48636f09720af45454e5db1183b62a1991db8faf
|
||||
|
||||
main.count_distinct2 : MDEV-11768 - timeout
|
||||
main.create : Modified in 10.0.34
|
||||
main.create_delayed : MDEV-10605 - failed with timeout
|
||||
main.ctype_utf8 : Modified in 10.0.34
|
||||
main.ctype_utf8mb4 : Modified in 10.0.34
|
||||
main.ctype_ucs : Modified in 10.0.35
|
||||
main.ctype_utf8mb4 : Modified in 10.0.35
|
||||
main.debug_sync : MDEV-10607 - internal error
|
||||
main.derived : Modified in 10.0.34
|
||||
main.derived_opt : MDEV-11768 - timeout
|
||||
main.dyncol : Modified in 10.0.34
|
||||
main.dyncol : Modified in 10.0.35
|
||||
main.events_slowlog : MDEV-12821 - wrong result
|
||||
main.fulltext : Modified in 10.0.34
|
||||
main.func_isnull : Modified in 10.0.34
|
||||
main.func_misc : Modified in 10.0.34
|
||||
main.func_set : Modified in 10.0.34
|
||||
main.func_str : Modified in 10.0.34
|
||||
main.func_concat : Modified in 10.0.35
|
||||
main.func_misc : Modified in 10.0.35
|
||||
main.func_str : Modified in 10.0.35
|
||||
main.func_time : Modified in 10.0.35
|
||||
main.having : Modified in 10.0.35
|
||||
main.gis : MDEV-13411 - wrong result on P8
|
||||
main.group_by : Modified in 10.0.34
|
||||
main.having : Modified in 10.0.34
|
||||
main.host_cache_size_functionality : MDEV-10606 - sporadic failure on shutdown
|
||||
main.index_intersect_innodb : MDEV-10643 - failed with timeout
|
||||
main.index_merge_innodb : MDEV-7142 - wrong result
|
||||
main.innodb_mysql_lock : MDEV-7861 - sporadic lock detection failure
|
||||
main.join_cache : Modified in 10.0.34
|
||||
main.join_outer : Modified in 10.0.34
|
||||
main.join_outer : Modified in 10.0.35
|
||||
main.kill_processlist-6619 : MDEV-10793 - wrong result
|
||||
main.log_tables-big : MDEV-13408 - wrong result
|
||||
main.mdev_14586 : Added in 10.0.34
|
||||
main.mdev-504 : MDEV-10607 - sporadic "can't connect"
|
||||
main.mdev375 : MDEV-10607 - sporadic "can't connect"
|
||||
main.merge : MDEV-10607 - sporadic "can't connect"; modified in 10.0.34
|
||||
main.myisam_optimize : Modified in 10.0.34
|
||||
main.mysqlbinlog : Modified in 10.0.34
|
||||
main.mysqldump-nl : Modified in 10.0.34
|
||||
main.merge : MDEV-10607 - sporadic "can't connect"
|
||||
main.mysqlhotcopy_myisam : MDEV-10995 - test hangs on debug build
|
||||
main.mysqltest : MDEV-9269 - fails on Alpha
|
||||
main.mysql_client_test_nonblock : MDEV-15096 - exec failed
|
||||
main.order_by : Modified in 10.0.34
|
||||
main.ps : MDEV-11017 - sporadic wrong Prepared_stmt_count; modified in 10.0.34
|
||||
main.query_cache_debug : Modified in 10.0.34
|
||||
main.repair : Modified in 10.0.34
|
||||
main.parser : Modified in 10.0.35
|
||||
main.partition : Modified in 10.0.35
|
||||
main.ps : MDEV-11017 - sporadic wrong Prepared_stmt_count
|
||||
main.ps_qc_innodb : Added in 10.0.35
|
||||
main.query_cache_debug : MDEV-15281 - resize or similar command in progress
|
||||
main.read_only_innodb : Modified in 10.0.35
|
||||
main.show_explain : MDEV-10674 - wrong result
|
||||
main.sp-destruct : Modified in 10.0.35
|
||||
main.sp_notembedded : MDEV-10607 - internal error
|
||||
main.sp-security : MDEV-10607 - sporadic "can't connect"
|
||||
main.stat_tables_par_innodb : MDEV-14155 - wrong rounding
|
||||
main.subselect : Modified in 10.0.34
|
||||
main.subselect_exists2in : Modified in 10.0.34
|
||||
main.statistics : Modified in 10.0.35
|
||||
main.subselect_innodb : MDEV-10614 - sporadic wrong results
|
||||
main.subselect_mat : Modified in 10.0.35
|
||||
main.subselect4 : Modified in 10.0.35
|
||||
main.symlink-aria-11902 : MDEV-15098 - error 40 from storage engine
|
||||
main.symlink-myisam-11902 : MDEV-15098 - error 40 from storage engine
|
||||
main.tc_heuristic_recover : MDEV-15200 - wrong error on mysqld_stub_cmd
|
||||
main.type_datetime : MDEV-14322 - wrong result
|
||||
main.union : Modified in 10.0.34
|
||||
main.view : Modified in 10.0.34
|
||||
main.xa : MDEV-11769 - lock wait timeout; modified in 10.0.34
|
||||
main.type_time_6065 : Modified in 10.0.35
|
||||
main.update_innodb : Modified in 10.0.35
|
||||
main.view : Modified in 10.0.35
|
||||
main.xa : MDEV-11769 - lock wait timeout
|
||||
main.xml : Modified in 10.0.35
|
||||
|
||||
#----------------------------------------------------------------
|
||||
|
||||
@ -91,8 +91,21 @@ binlog.binlog_xa_recover : MDEV-8517 - Extra checkpoint
|
||||
|
||||
#----------------------------------------------------------------
|
||||
|
||||
connect.json : Sporadic wrong result
|
||||
connect.zip : Sporadic wrong result
|
||||
connect.jdbc : Included file modified in 10.0.35
|
||||
connect.jdbc_new : Included file modified in 10.0.35
|
||||
connect.jdbc_oracle : Included file modified in 10.0.35
|
||||
connect.jdbc_postgresql : Modified in 10.0.35
|
||||
connect.json_java_2 : Included file modified in 10.0.35
|
||||
connect.json_java_3 : Included file modified in 10.0.35
|
||||
connect.json_mongo_c : Included file modified in 10.0.35
|
||||
connect.json_udf : Modified in 10.0.35
|
||||
connect.mongo_c : Included file modified in 10.0.35
|
||||
connect.mongo_java_2 : Included file modified in 10.0.35
|
||||
connect.mongo_java_3 : Included file modified in 10.0.35
|
||||
connect.mongo_test : Modified in 10.0.35
|
||||
connect.tbl_thread : Modified in 10.0.35
|
||||
connect.vcol : Added in 10.0.35
|
||||
connect.zip : MDEV-13884 - wrong result
|
||||
|
||||
#----------------------------------------------------------------
|
||||
|
||||
@ -119,28 +132,31 @@ funcs_2/charset.* : MDEV-10999 - test not maintained
|
||||
innodb.binlog_consistent : MDEV-10618 - Server fails to start
|
||||
innodb.group_commit_crash : MDEV-11770 - checksum mismatch
|
||||
innodb.group_commit_crash_no_optimize_thread : MDEV-11770 - checksum mismatch
|
||||
innodb.innodb : Modified in 10.0.34
|
||||
innodb.innodb-alter-nullable : Modified in 10.0.35
|
||||
innodb.innodb-alter-table : MDEV-10619 - Testcase timeout
|
||||
innodb.innodb-autoinc : Modified in 10.0.34
|
||||
innodb.innodb_bug11754376 : Modified in 10.0.35
|
||||
innodb.innodb_bug27216817 : Added in 10.0.35
|
||||
innodb.innodb_bug30423 : MDEV-7311 - Wrong number of rows in the plan
|
||||
innodb.innodb_bug48024 : MDEV-14352 - Assertion failure
|
||||
innodb.innodb-index-debug : Modified in 10.0.34
|
||||
innodb.innodb-index-online : Modified in 10.0.34
|
||||
innodb.innodb_bug56947 : Modified in 10.0.35
|
||||
innodb.innodb_corrupt_bit : Modified in 10.0.35
|
||||
innodb.innodb_monitor : MDEV-10939 - Testcase timeout
|
||||
innodb.innodb-replace-debug : Added in 10.0.34
|
||||
innodb.innodb-wl5522-debug : Modified in 10.0.34
|
||||
innodb.recovery_shutdown : Added in 10.0.34
|
||||
innodb.innodb-replace-debug : Modified in 10.0.35
|
||||
innodb.log_file_size : MDEV-15668 - Not found pattern; modified in 10.0.35
|
||||
innodb.mvcc : Added in 10.0.35
|
||||
innodb.read_only_recover_committed : Added in 10.0.35
|
||||
innodb.recovery_shutdown : MDEV-15671 - Warning: database page corruption; modified in 10.0.35
|
||||
innodb.xa_recovery : MDEV-15279 - mysqld got exception
|
||||
|
||||
innodb_fts.innobase_drop_fts_index_table : Modified in 10.0.35
|
||||
innodb_fts.innodb-fts-fic : MDEV-14154 - Assertion failure
|
||||
innodb_fts.innodb_fts_misc_debug : MDEV-14156 - Unexpected warning
|
||||
|
||||
innodb_zip.wl5522_debug_zip : Added in 10.0.34
|
||||
innodb_fts.innodb_fts_misc_debug : MDEV-14156 - Unexpected warning; modified in 10.0.35
|
||||
innodb_fts.innodb_fts_result_cache_limit : Modified in 10.0.35
|
||||
|
||||
#----------------------------------------------------------------
|
||||
|
||||
maria.lock : Modified in 10.0.34
|
||||
maria.maria : MDEV-14430 - Wrong result; modified in 10.0.34
|
||||
maria.repair : Added in 10.0.34
|
||||
maria.dynamic : Added in 10.0.35
|
||||
maria.maria : MDEV-14430 - Wrong result
|
||||
|
||||
#----------------------------------------------------------------
|
||||
|
||||
@ -162,9 +178,9 @@ multi_source.status_vars : MDEV-4632 - failed while waiting for Slave_received_h
|
||||
|
||||
#----------------------------------------------------------------
|
||||
|
||||
parts.partition_alter_innodb : Added in 10.0.34
|
||||
parts.partition_alter_maria : Modified in 10.0.34
|
||||
parts.partition_alter_myisam : Added in 10.0.34
|
||||
parts.partition_alter_innodb : Include file modified in 10.0.35
|
||||
parts.partition_alter_maria : Modified in 10.0.35
|
||||
parts.partition_alter_myisam : Include file modified in 10.0.35
|
||||
parts.partition_auto_increment_maria : MDEV-14430 - wrong result
|
||||
parts.partition_debug_innodb : MDEV-15095 - table does not exist
|
||||
parts.partition_exch_qa_10 : MDEV-11765 - wrong result
|
||||
@ -182,14 +198,12 @@ perfschema_stress.* : MDEV-10996 - tests not maintained
|
||||
#----------------------------------------------------------------
|
||||
|
||||
plugins.feedback_plugin_send : MDEV-7932 - ssl failed for url, MDEV-11118 - wrong result
|
||||
plugins.server_audit : MDEV-9562 - crashes on sol10-sparc; modified in 10.0.34
|
||||
plugins.thread_pool_server_audit : MDEV-9562 - crashes on sol10-sparc, MDEV-14295 - wrong result; modified in 10.0.34
|
||||
plugins.server_audit : MDEV-9562 - crashes on sol10-sparc; modified in 10.0.35
|
||||
plugins.thread_pool_server_audit : MDEV-9562 - crashes on sol10-sparc, MDEV-14295 - wrong result
|
||||
|
||||
#----------------------------------------------------------------
|
||||
|
||||
roles.create_and_grant_role : MDEV-11772 - wrong result
|
||||
roles.flush_roles-12366 : Added in 10.0.34
|
||||
roles.set_role-13655 : Added in 10.0.34
|
||||
|
||||
#----------------------------------------------------------------
|
||||
|
||||
@ -233,7 +247,7 @@ spider/bg.direct_aggregate : MDEV-7098 - Trying to unlock mutex that wasn't
|
||||
spider/bg.direct_aggregate_part : MDEV-7098 - Trying to unlock mutex that wasn't locked
|
||||
spider/bg.spider3_fixes : MDEV-7098 - Trying to unlock mutex that wasn't locked
|
||||
spider/bg.spider_fixes_part : MDEV-7098 - Trying to unlock mutex that wasn't locked
|
||||
spider/bg.ha : MDEV-7914, MDEV-9329 - Crash, failures on s390x
|
||||
spider/bg.ha : MDEV-7914 (fixed in 10.3), MDEV-9329 - Crash, failures on s390x
|
||||
spider/bg.ha_part : MDEV-9329 - Fails on Ubuntu/s390x
|
||||
spider/bg.spider_fixes : MDEV-7098, MDEV-9329 - Mutex problem, failures on s390x
|
||||
spider/bg.vp_fixes : MDEV-9329 - Fails on Ubuntu/s390x
|
||||
@ -253,15 +267,11 @@ stress.ddl_innodb : MDEV-10635 - Testcase timeout
|
||||
#----------------------------------------------------------------
|
||||
|
||||
sys_vars.autocommit_func2 : MDEV-9329 - Fails on Ubuntu/s390x
|
||||
sys_vars.innodb_buffer_pool_dump_now_basic : Modified in 10.0.34
|
||||
sys_vars.innodb_buffer_pool_dump_pct_basic : Modified in 10.0.34
|
||||
sys_vars.innodb_buffer_pool_load_now_basic : Modified in 10.0.34
|
||||
sys_vars.innodb_print_lock_wait_timeout_info_basic : Added in 10.0.34
|
||||
sys_vars.max_prepared_stmt_count_basic : Modified in 10.0.35
|
||||
sys_vars.thread_cache_size_func : MDEV-11775 - wrong result
|
||||
|
||||
#----------------------------------------------------------------
|
||||
|
||||
tokudb.card_scale_percent : Modified in 10.0.34
|
||||
tokudb.change_column_all_1000_10 : MDEV-12640 - Lost connection during query
|
||||
tokudb.change_column_bin : MDEV-12640 - Lost connection during query
|
||||
tokudb.change_column_char : MDEV-12822 - Lost connection during query
|
||||
@ -269,14 +279,12 @@ tokudb.cluster_filter_unpack_varchar : MDEV-10636 - Wrong execution plan
|
||||
tokudb.dir_per_db : MDEV-11537 - wrong result
|
||||
tokudb.dir_per_db_rename_to_nonexisting_schema : MDEV-12823 - Valgrind
|
||||
tokudb.hotindex-insert-bigchar : MDEV-13870 - ASAN failures
|
||||
tokudb.hotindex-update-0 : MDEV-15198 - Timeout
|
||||
tokudb.hotindex-update-1 : MDEV-12640 - Lost connection during query
|
||||
tokudb.locking-read-repeatable-read-1 : Added in 10.0.34
|
||||
tokudb.locking-read-repeatable-read-2 : Added in 10.0.34
|
||||
tokudb.locks-select-update-1 : MDEV-13406 - Lock wait timeout
|
||||
tokudb.nonflushing_analyze_debug : Added in 10.0.34
|
||||
tokudb.rows-32m-rand-insert : MDEV-12640 - Lost connection during query
|
||||
tokudb.rows-32m-seq-insert : MDEV-12640 - Lost connection during query
|
||||
tokudb.row_format : Modified in 10.0.34
|
||||
tokudb.savepoint-5 : MDEV-15280 - wrong result
|
||||
|
||||
tokudb_backup.* : MDEV-11001 - tests don't work
|
||||
|
||||
@ -287,11 +295,6 @@ tokudb_bugs.frm_store2 : MDEV-12823 - Valgrind
|
||||
tokudb_bugs.frm_store3 : MDEV-12823 - Valgrind
|
||||
tokudb_bugs.xa : MDEV-11804 - Lock wait timeout
|
||||
|
||||
tokudb_parts.nonflushing_analyze_debug : Added in 10.0.34
|
||||
|
||||
tokudb_perfschema.crash_tokudb : Added in 10.0.34
|
||||
tokudb_perfschema.start_server_tokudb : Added in 10.0.34
|
||||
|
||||
tokudb_rpl.* : MDEV-11001 - tests don't work
|
||||
tokudb_sys_vars.* : MDEV-11001 - tests don't work
|
||||
|
||||
@ -301,7 +304,7 @@ rpl-tokudb.* : MDEV-14354 - Tests fail with tcmalloc
|
||||
|
||||
unit.lf : MDEV-12897 - Unexpected return code
|
||||
unit.ma_test_loghandler : MDEV-10638 - record read not ok
|
||||
unit.pfs : MySQL:84457 - unittest pft-t failing
|
||||
unit.my_atomic : MDEV-15670 - Signal 11 thrown
|
||||
|
||||
#----------------------------------------------------------------
|
||||
|
||||
|
@ -3834,7 +3834,7 @@ my_bool dynstr_append_json_quoted(DYNAMIC_STRING *str,
|
||||
for (i= 0; i < len; i++)
|
||||
{
|
||||
register char c= append[i];
|
||||
if (unlikely(c <= 0x1F))
|
||||
if (unlikely(((uchar)c) <= 0x1F))
|
||||
{
|
||||
if (lim < 5)
|
||||
{
|
||||
|
@ -1102,10 +1102,12 @@ void print_defaults(const char *conf_file, const char **groups)
|
||||
}
|
||||
}
|
||||
puts("\nThe following options may be given as the first argument:\n\
|
||||
--print-defaults Print the program argument list and exit.\n\
|
||||
--no-defaults Don't read default options from any option file.\n\
|
||||
--defaults-file=# Only read default options from the given file #.\n\
|
||||
--defaults-extra-file=# Read this file after the global files are read.");
|
||||
--print-defaults Print the program argument list and exit.\n\
|
||||
--no-defaults Don't read default options from any option file.\n\
|
||||
The following specify which files/extra groups are read (specified before remaining options):\n\
|
||||
--defaults-file=# Only read default options from the given file #.\n\
|
||||
--defaults-extra-file=# Read this file after the global files are read.\n\
|
||||
--defaults-group-suffix=# Additionally read default groups with # appended as a suffix.");
|
||||
}
|
||||
|
||||
|
||||
|
@ -8,7 +8,7 @@ Email domain: cam.ac.uk
|
||||
University of Cambridge Computing Service,
|
||||
Cambridge, England.
|
||||
|
||||
Copyright (c) 1997-2017 University of Cambridge
|
||||
Copyright (c) 1997-2018 University of Cambridge
|
||||
All rights reserved
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@ Written by: Zoltan Herczeg
|
||||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2010-2017 Zoltan Herczeg
|
||||
Copyright(c) 2010-2018 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ Written by: Zoltan Herczeg
|
||||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2009-2017 Zoltan Herczeg
|
||||
Copyright(c) 2009-2018 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
@ -4,6 +4,59 @@ ChangeLog for PCRE
|
||||
Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All
|
||||
development is happening in the PCRE2 10.xx series.
|
||||
|
||||
|
||||
Version 8.42 20-March-2018
|
||||
--------------------------
|
||||
|
||||
1. Fixed a MIPS issue in the JIT compiler reported by Joshua Kinard.
|
||||
|
||||
2. Fixed outdated real_pcre definitions in pcre.h.in (patch by Evgeny Kotkov).
|
||||
|
||||
3. pcregrep was truncating components of file names to 128 characters when
|
||||
processing files with the -r option, and also (some very odd code) truncating
|
||||
path names to 512 characters. There is now a check on the absolute length of
|
||||
full path file names, which may be up to 2047 characters long.
|
||||
|
||||
4. Using pcre_dfa_exec(), in UTF mode when UCP support was not defined, there
|
||||
was the possibility of a false positive match when caselessly matching a "not
|
||||
this character" item such as [^\x{1234}] (with a code point greater than 127)
|
||||
because the "other case" variable was not being initialized.
|
||||
|
||||
5. Although pcre_jit_exec checks whether the pattern is compiled
|
||||
in a given mode, it was also expected that at least one mode is available.
|
||||
This is fixed and pcre_jit_exec returns with PCRE_ERROR_JIT_BADOPTION
|
||||
when the pattern is not optimized by JIT at all.
|
||||
|
||||
6. The line number and related variables such as match counts in pcregrep
|
||||
were all int variables, causing overflow when files with more than 2147483647
|
||||
lines were processed (assuming 32-bit ints). They have all been changed to
|
||||
unsigned long ints.
|
||||
|
||||
7. If a backreference with a minimum repeat count of zero was first in a
|
||||
pattern, apart from assertions, an incorrect first matching character could be
|
||||
recorded. For example, for the pattern /(?=(a))\1?b/, "b" was incorrectly set
|
||||
as the first character of a match.
|
||||
|
||||
8. Fix out-of-bounds read for partial matching of /./ against an empty string
|
||||
when the newline type is CRLF.
|
||||
|
||||
9. When matching using the the REG_STARTEND feature of the POSIX API with a
|
||||
non-zero starting offset, unset capturing groups with lower numbers than a
|
||||
group that did capture something were not being correctly returned as "unset"
|
||||
(that is, with offset values of -1).
|
||||
|
||||
10. Matching the pattern /(*UTF)\C[^\v]+\x80/ against an 8-bit string
|
||||
containing multi-code-unit characters caused bad behaviour and possibly a
|
||||
crash. This issue was fixed for other kinds of repeat in release 8.37 by change
|
||||
38, but repeating character classes were overlooked.
|
||||
|
||||
11. A small fix to pcregrep to avoid compiler warnings for -Wformat-overflow=2.
|
||||
|
||||
12. Added --enable-jit=auto support to configure.ac.
|
||||
|
||||
13. Fix misleading error message in configure.ac.
|
||||
|
||||
|
||||
Version 8.41 05-July-2017
|
||||
-------------------------
|
||||
|
||||
|
316
pcre/INSTALL
316
pcre/INSTALL
@ -1,8 +1,8 @@
|
||||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
|
||||
Inc.
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
@ -12,97 +12,96 @@ without warranty of any kind.
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell command `./configure && make && make install'
|
||||
Briefly, the shell command './configure && make && make install'
|
||||
should configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
more-detailed instructions are generic; see the 'README' file for
|
||||
instructions specific to this package. Some packages provide this
|
||||
`INSTALL' file but do not implement all of the features documented
|
||||
'INSTALL' file but do not implement all of the features documented
|
||||
below. The lack of an optional feature in a given package is not
|
||||
necessarily a bug. More recommendations for GNU packages can be found
|
||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
The 'configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
those values to create a 'Makefile' in each directory of the package.
|
||||
It may also create one or more '.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script 'config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
file 'config.log' containing compiler output (useful mainly for
|
||||
debugging 'configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
It can also use an optional file (typically called 'config.cache' and
|
||||
enabled with '--cache-file=config.cache' or simply '-C') that saves the
|
||||
results of its tests to speed up reconfiguring. Caching is disabled by
|
||||
default to prevent problems with accidental use of stale cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
to figure out how 'configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the 'README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
some point 'config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
The file 'configure.ac' (or 'configure.in') is used to create
|
||||
'configure' by a program called 'autoconf'. You need 'configure.ac' if
|
||||
you want to change it or regenerate 'configure' using a newer version of
|
||||
'autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
1. 'cd' to the directory containing the package's source code and type
|
||||
'./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
Running 'configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
2. Type 'make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
3. Optionally, type 'make check' to run any self-tests that come with
|
||||
the package, generally using the just-built uninstalled binaries.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
4. Type 'make install' to install the programs and any data files and
|
||||
documentation. When installing into a prefix owned by root, it is
|
||||
recommended that the package be configured and built as a regular
|
||||
user, and only the `make install' phase executed with root
|
||||
user, and only the 'make install' phase executed with root
|
||||
privileges.
|
||||
|
||||
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||
5. Optionally, type 'make installcheck' to repeat any self-tests, but
|
||||
this time using the binaries in their final installed location.
|
||||
This target does not install anything. Running this target as a
|
||||
regular user, particularly if the prior `make install' required
|
||||
regular user, particularly if the prior 'make install' required
|
||||
root privileges, verifies that the installation completed
|
||||
correctly.
|
||||
|
||||
6. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
source code directory by typing 'make clean'. To also remove the
|
||||
files that 'configure' created (so you can compile the package for
|
||||
a different kind of computer), type 'make distclean'. There is
|
||||
also a 'make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
7. Often, you can also type `make uninstall' to remove the installed
|
||||
7. Often, you can also type 'make uninstall' to remove the installed
|
||||
files again. In practice, not all packages have tested that
|
||||
uninstallation works correctly, even though it is required by the
|
||||
GNU Coding Standards.
|
||||
|
||||
8. Some packages, particularly those that use Automake, provide `make
|
||||
8. Some packages, particularly those that use Automake, provide 'make
|
||||
distcheck', which can by used by developers to test that all other
|
||||
targets like `make install' and `make uninstall' work correctly.
|
||||
targets like 'make install' and 'make uninstall' work correctly.
|
||||
This target is generally not run by end users.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
the 'configure' script does not know about. Run './configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
You can give 'configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here is
|
||||
an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
@ -113,21 +112,21 @@ Compiling For Multiple Architectures
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
own directory. To do this, you can use GNU 'make'. 'cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'. This
|
||||
is known as a "VPATH" build.
|
||||
the 'configure' script. 'configure' automatically checks for the source
|
||||
code in the directory that 'configure' is in and in '..'. This is known
|
||||
as a "VPATH" build.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
With a non-GNU 'make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
installed the package for one architecture, use 'make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
On MacOS X 10.5 and later systems, you can create libraries and
|
||||
executables that work on multiple system types--known as "fat" or
|
||||
"universal" binaries--by specifying multiple `-arch' options to the
|
||||
compiler but only a single `-arch' option to the preprocessor. Like
|
||||
"universal" binaries--by specifying multiple '-arch' options to the
|
||||
compiler but only a single '-arch' option to the preprocessor. Like
|
||||
this:
|
||||
|
||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
@ -136,105 +135,104 @@ this:
|
||||
|
||||
This is not guaranteed to produce working output in all cases, you
|
||||
may have to build one architecture at a time and combine the results
|
||||
using the `lipo' tool if you have problems.
|
||||
using the 'lipo' tool if you have problems.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||
By default, 'make install' installs the package's commands under
|
||||
'/usr/local/bin', include files under '/usr/local/include', etc. You
|
||||
can specify an installation prefix other than '/usr/local' by giving
|
||||
'configure' the option '--prefix=PREFIX', where PREFIX must be an
|
||||
absolute file name.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them. In general, the
|
||||
default for these options is expressed in terms of `${prefix}', so that
|
||||
specifying just `--prefix' will affect all of the other directory
|
||||
options like '--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run 'configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them. In general, the default
|
||||
for these options is expressed in terms of '${prefix}', so that
|
||||
specifying just '--prefix' will affect all of the other directory
|
||||
specifications that were not explicitly provided.
|
||||
|
||||
The most portable way to affect installation locations is to pass the
|
||||
correct locations to `configure'; however, many packages provide one or
|
||||
correct locations to 'configure'; however, many packages provide one or
|
||||
both of the following shortcuts of passing variable assignments to the
|
||||
`make install' command line to change installation locations without
|
||||
'make install' command line to change installation locations without
|
||||
having to reconfigure or recompile.
|
||||
|
||||
The first method involves providing an override variable for each
|
||||
affected directory. For example, `make install
|
||||
affected directory. For example, 'make install
|
||||
prefix=/alternate/directory' will choose an alternate location for all
|
||||
directory configuration variables that were expressed in terms of
|
||||
`${prefix}'. Any directories that were specified during `configure',
|
||||
but not in terms of `${prefix}', must each be overridden at install
|
||||
time for the entire installation to be relocated. The approach of
|
||||
makefile variable overrides for each directory variable is required by
|
||||
the GNU Coding Standards, and ideally causes no recompilation.
|
||||
However, some platforms have known limitations with the semantics of
|
||||
shared libraries that end up requiring recompilation when using this
|
||||
method, particularly noticeable in packages that use GNU Libtool.
|
||||
'${prefix}'. Any directories that were specified during 'configure',
|
||||
but not in terms of '${prefix}', must each be overridden at install time
|
||||
for the entire installation to be relocated. The approach of makefile
|
||||
variable overrides for each directory variable is required by the GNU
|
||||
Coding Standards, and ideally causes no recompilation. However, some
|
||||
platforms have known limitations with the semantics of shared libraries
|
||||
that end up requiring recompilation when using this method, particularly
|
||||
noticeable in packages that use GNU Libtool.
|
||||
|
||||
The second method involves providing the `DESTDIR' variable. For
|
||||
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||
`/alternate/directory' before all installation names. The approach of
|
||||
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
The second method involves providing the 'DESTDIR' variable. For
|
||||
example, 'make install DESTDIR=/alternate/directory' will prepend
|
||||
'/alternate/directory' before all installation names. The approach of
|
||||
'DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
does not work on platforms that have drive letters. On the other hand,
|
||||
it does better at avoiding recompilation issues, and works well even
|
||||
when some directory options were not specified in terms of `${prefix}'
|
||||
at `configure' time.
|
||||
when some directory options were not specified in terms of '${prefix}'
|
||||
at 'configure' time.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
with an extra prefix or suffix on their names by giving 'configure' the
|
||||
option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
Some packages pay attention to '--enable-FEATURE' options to
|
||||
'configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to '--with-PACKAGE' options, where PACKAGE
|
||||
is something like 'gnu-as' or 'x' (for the X Window System). The
|
||||
'README' should mention any '--enable-' and '--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
For packages that use the X Window System, 'configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
you can use the 'configure' options '--x-includes=DIR' and
|
||||
'--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Some packages offer the ability to configure how verbose the
|
||||
execution of `make' will be. For these packages, running `./configure
|
||||
execution of 'make' will be. For these packages, running './configure
|
||||
--enable-silent-rules' sets the default to minimal output, which can be
|
||||
overridden with `make V=1'; while running `./configure
|
||||
overridden with 'make V=1'; while running './configure
|
||||
--disable-silent-rules' sets the default to verbose, which can be
|
||||
overridden with `make V=0'.
|
||||
overridden with 'make V=0'.
|
||||
|
||||
Particular systems
|
||||
==================
|
||||
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||
CC is not installed, it is recommended to use the following options in
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC
|
||||
is not installed, it is recommended to use the following options in
|
||||
order to use an ANSI C compiler:
|
||||
|
||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||
|
||||
HP-UX `make' updates targets which have the same time stamps as
|
||||
their prerequisites, which makes it generally unusable when shipped
|
||||
generated files such as `configure' are involved. Use GNU `make'
|
||||
instead.
|
||||
HP-UX 'make' updates targets which have the same time stamps as their
|
||||
prerequisites, which makes it generally unusable when shipped generated
|
||||
files such as 'configure' are involved. Use GNU 'make' instead.
|
||||
|
||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||
to try
|
||||
parse its '<wchar.h>' header file. The option '-nodtk' can be used as a
|
||||
workaround. If GNU CC is not installed, it is therefore recommended to
|
||||
try
|
||||
|
||||
./configure CC="cc"
|
||||
|
||||
@ -242,26 +240,26 @@ and if that doesn't work, try
|
||||
|
||||
./configure CC="cc -nodtk"
|
||||
|
||||
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||
On Solaris, don't put '/usr/ucb' early in your 'PATH'. This
|
||||
directory contains several dysfunctional programs; working variants of
|
||||
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||
in your `PATH', put it _after_ `/usr/bin'.
|
||||
these programs are available in '/usr/bin'. So, if you need '/usr/ucb'
|
||||
in your 'PATH', put it _after_ '/usr/bin'.
|
||||
|
||||
On Haiku, software installed for all users goes in `/boot/common',
|
||||
not `/usr/local'. It is recommended to use the following options:
|
||||
On Haiku, software installed for all users goes in '/boot/common',
|
||||
not '/usr/local'. It is recommended to use the following options:
|
||||
|
||||
./configure --prefix=/boot/common
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out
|
||||
There may be some features 'configure' cannot figure out
|
||||
automatically, but needs to determine by the type of machine the package
|
||||
will run on. Usually, assuming the package is built to be run on the
|
||||
_same_ architectures, `configure' can figure that out, but if it prints
|
||||
_same_ architectures, 'configure' can figure that out, but if it prints
|
||||
a message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
'--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as 'sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
@ -270,101 +268,101 @@ where SYSTEM can have one of these forms:
|
||||
OS
|
||||
KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
See the file 'config.sub' for the possible values of each field. If
|
||||
'config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
use the option '--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
eventually be run) with '--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
If you want to set default values for 'configure' scripts to share,
|
||||
you can create a site shell script called 'config.site' that gives
|
||||
default values for variables like 'CC', 'cache_file', and 'prefix'.
|
||||
'configure' looks for 'PREFIX/share/config.site' if it exists, then
|
||||
'PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
'CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all 'configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
environment passed to 'configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
them in the 'configure' command line, using 'VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
causes the specified 'gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf limitation. Until the limitation is lifted, you can use
|
||||
this workaround:
|
||||
Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
|
||||
Autoconf limitation. Until the limitation is lifted, you can use this
|
||||
workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
'configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
'configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of all of the options to `configure', and exit.
|
||||
'--help'
|
||||
'-h'
|
||||
Print a summary of all of the options to 'configure', and exit.
|
||||
|
||||
`--help=short'
|
||||
`--help=recursive'
|
||||
'--help=short'
|
||||
'--help=recursive'
|
||||
Print a summary of the options unique to this package's
|
||||
`configure', and exit. The `short' variant lists options used
|
||||
only in the top level, while the `recursive' variant lists options
|
||||
also present in any nested packages.
|
||||
'configure', and exit. The 'short' variant lists options used only
|
||||
in the top level, while the 'recursive' variant lists options also
|
||||
present in any nested packages.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
'--version'
|
||||
'-V'
|
||||
Print the version of Autoconf used to generate the 'configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
'--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
traditionally 'config.cache'. FILE defaults to '/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
'--config-cache'
|
||||
'-C'
|
||||
Alias for '--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
'--quiet'
|
||||
'--silent'
|
||||
'-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
suppress all normal output, redirect it to '/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
'--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
'configure' can determine that directory automatically.
|
||||
|
||||
`--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names::
|
||||
for more details, including other options available for fine-tuning
|
||||
the installation locations.
|
||||
'--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names:: for
|
||||
more details, including other options available for fine-tuning the
|
||||
installation locations.
|
||||
|
||||
`--no-create'
|
||||
`-n'
|
||||
'--no-create'
|
||||
'-n'
|
||||
Run the configure checks, but stop before creating any output
|
||||
files.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
'configure' also accepts some other, not widely useful, options. Run
|
||||
'configure --help' for more details.
|
||||
|
@ -25,7 +25,7 @@ Email domain: cam.ac.uk
|
||||
University of Cambridge Computing Service,
|
||||
Cambridge, England.
|
||||
|
||||
Copyright (c) 1997-2017 University of Cambridge
|
||||
Copyright (c) 1997-2018 University of Cambridge
|
||||
All rights reserved.
|
||||
|
||||
|
||||
@ -36,7 +36,7 @@ Written by: Zoltan Herczeg
|
||||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2010-2017 Zoltan Herczeg
|
||||
Copyright(c) 2010-2018 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
@ -47,7 +47,7 @@ Written by: Zoltan Herczeg
|
||||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2009-2017 Zoltan Herczeg
|
||||
Copyright(c) 2009-2018 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
@ -1,6 +1,12 @@
|
||||
News about PCRE releases
|
||||
------------------------
|
||||
|
||||
Release 8.42 20-March-2018
|
||||
--------------------------
|
||||
|
||||
This is a bug-fix release.
|
||||
|
||||
|
||||
Release 8.41 13-June-2017
|
||||
-------------------------
|
||||
|
||||
|
@ -760,13 +760,14 @@ The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and
|
||||
applications can be supported through UNIX System Services, and in such an
|
||||
environment PCRE can be built in the same way as in other systems. However, in
|
||||
native z/OS (without UNIX System Services) and in z/VM, special ports are
|
||||
required. For details, please see this web site:
|
||||
required. PCRE1 version 8.39 is available in file 882 on this site:
|
||||
|
||||
http://www.zaconsultants.net
|
||||
http://www.cbttape.org
|
||||
|
||||
You may download PCRE from WWW.CBTTAPE.ORG, file 882. Everything, source and
|
||||
executable, is in EBCDIC and native z/OS file formats and this is the
|
||||
recommended download site.
|
||||
Everything, source and executable, is in EBCDIC and native z/OS file formats.
|
||||
However, this software is not maintained and will not be upgraded. If you are
|
||||
new to PCRE you should be looking at PCRE2 (version 10.30 or later).
|
||||
|
||||
==========================
|
||||
Last Updated: 25 June 2015
|
||||
===============================
|
||||
Last Updated: 13 September 2017
|
||||
===============================
|
||||
|
@ -9,18 +9,18 @@ dnl The PCRE_PRERELEASE feature is for identifying release candidates. It might
|
||||
dnl be defined as -RC2, for example. For real releases, it should be empty.
|
||||
|
||||
m4_define(pcre_major, [8])
|
||||
m4_define(pcre_minor, [41])
|
||||
m4_define(pcre_minor, [42])
|
||||
m4_define(pcre_prerelease, [])
|
||||
m4_define(pcre_date, [2017-07-05])
|
||||
m4_define(pcre_date, [2018-03-20])
|
||||
|
||||
# NOTE: The CMakeLists.txt file searches for the above variables in the first
|
||||
# 50 lines of this file. Please update that if the variables above are moved.
|
||||
|
||||
# Libtool shared library interface versions (current:revision:age)
|
||||
m4_define(libpcre_version, [3:9:2])
|
||||
m4_define(libpcre16_version, [2:9:2])
|
||||
m4_define(libpcre32_version, [0:9:0])
|
||||
m4_define(libpcreposix_version, [0:5:0])
|
||||
m4_define(libpcre_version, [3:10:2])
|
||||
m4_define(libpcre16_version, [2:10:2])
|
||||
m4_define(libpcre32_version, [0:10:0])
|
||||
m4_define(libpcreposix_version, [0:6:0])
|
||||
m4_define(libpcrecpp_version, [0:1:0])
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
@ -155,6 +155,18 @@ AC_ARG_ENABLE(jit,
|
||||
[enable Just-In-Time compiling support]),
|
||||
, enable_jit=no)
|
||||
|
||||
# This code enables JIT if the hardware supports it.
|
||||
|
||||
if test "$enable_jit" = "auto"; then
|
||||
AC_LANG(C)
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
||||
#define SLJIT_CONFIG_AUTO 1
|
||||
#include "sljit/sljitConfigInternal.h"
|
||||
#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
|
||||
#error unsupported
|
||||
#endif]])], enable_jit=yes, enable_jit=no)
|
||||
fi
|
||||
|
||||
# Handle --disable-pcregrep-jit (enabled by default)
|
||||
AC_ARG_ENABLE(pcregrep-jit,
|
||||
AS_HELP_STRING([--disable-pcregrep-jit],
|
||||
@ -469,7 +481,7 @@ pcre_have_type_traits="0"
|
||||
pcre_have_bits_type_traits="0"
|
||||
|
||||
if test "x$enable_cpp" = "xyes" -a -z "$CXX"; then
|
||||
AC_MSG_ERROR([You need a C++ compiler for C++ support.])
|
||||
AC_MSG_ERROR([Invalid C++ compiler or C++ compiler flags])
|
||||
fi
|
||||
|
||||
if test "x$enable_cpp" = "xyes" -a -n "$CXX"
|
||||
|
@ -760,13 +760,14 @@ The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and
|
||||
applications can be supported through UNIX System Services, and in such an
|
||||
environment PCRE can be built in the same way as in other systems. However, in
|
||||
native z/OS (without UNIX System Services) and in z/VM, special ports are
|
||||
required. For details, please see this web site:
|
||||
required. PCRE1 version 8.39 is available in file 882 on this site:
|
||||
|
||||
http://www.zaconsultants.net
|
||||
http://www.cbttape.org
|
||||
|
||||
You may download PCRE from WWW.CBTTAPE.ORG, file 882. Everything, source and
|
||||
executable, is in EBCDIC and native z/OS file formats and this is the
|
||||
recommended download site.
|
||||
Everything, source and executable, is in EBCDIC and native z/OS file formats.
|
||||
However, this software is not maintained and will not be upgraded. If you are
|
||||
new to PCRE you should be looking at PCRE2 (version 10.30 or later).
|
||||
|
||||
==========================
|
||||
Last Updated: 25 June 2015
|
||||
===============================
|
||||
Last Updated: 13 September 2017
|
||||
===============================
|
||||
|
@ -321,11 +321,11 @@ these bits, just add new ones on the end, in order to remain compatible. */
|
||||
|
||||
/* Types */
|
||||
|
||||
struct real_pcre; /* declaration; the definition is private */
|
||||
typedef struct real_pcre pcre;
|
||||
struct real_pcre8_or_16; /* declaration; the definition is private */
|
||||
typedef struct real_pcre8_or_16 pcre;
|
||||
|
||||
struct real_pcre16; /* declaration; the definition is private */
|
||||
typedef struct real_pcre16 pcre16;
|
||||
struct real_pcre8_or_16; /* declaration; the definition is private */
|
||||
typedef struct real_pcre8_or_16 pcre16;
|
||||
|
||||
struct real_pcre32; /* declaration; the definition is private */
|
||||
typedef struct real_pcre32 pcre32;
|
||||
|
@ -8063,7 +8063,7 @@ for (;; ptr++)
|
||||
single group (i.e. not to a duplicated name. */
|
||||
|
||||
HANDLE_REFERENCE:
|
||||
if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;
|
||||
if (firstcharflags == REQ_UNSET) zerofirstcharflags = firstcharflags = REQ_NONE;
|
||||
previous = code;
|
||||
item_hwm_offset = cd->hwm - cd->start_workspace;
|
||||
*code++ = ((options & PCRE_CASELESS) != 0)? OP_REFI : OP_REF;
|
||||
|
@ -2287,12 +2287,14 @@ for (;;)
|
||||
case OP_NOTI:
|
||||
if (clen > 0)
|
||||
{
|
||||
unsigned int otherd;
|
||||
pcre_uint32 otherd;
|
||||
#ifdef SUPPORT_UTF
|
||||
if (utf && d >= 128)
|
||||
{
|
||||
#ifdef SUPPORT_UCP
|
||||
otherd = UCD_OTHERCASE(d);
|
||||
#else
|
||||
otherd = d;
|
||||
#endif /* SUPPORT_UCP */
|
||||
}
|
||||
else
|
||||
|
@ -6,7 +6,7 @@
|
||||
and semantics are as close as possible to those of the Perl 5 language.
|
||||
|
||||
Written by Philip Hazel
|
||||
Copyright (c) 1997-2014 University of Cambridge
|
||||
Copyright (c) 1997-2018 University of Cambridge
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -2313,7 +2313,7 @@ for (;;)
|
||||
case OP_ANY:
|
||||
if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
|
||||
if (md->partial != 0 &&
|
||||
eptr + 1 >= md->end_subject &&
|
||||
eptr == md->end_subject - 1 &&
|
||||
NLBLOCK->nltype == NLTYPE_FIXED &&
|
||||
NLBLOCK->nllen == 2 &&
|
||||
UCHAR21TEST(eptr) == NLBLOCK->nl[0])
|
||||
@ -3061,7 +3061,7 @@ for (;;)
|
||||
{
|
||||
RMATCH(eptr, ecode, offset_top, md, eptrb, RM18);
|
||||
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||
if (eptr-- == pp) break; /* Stop if tried at original pos */
|
||||
if (eptr-- <= pp) break; /* Stop if tried at original pos */
|
||||
BACKCHAR(eptr);
|
||||
}
|
||||
}
|
||||
@ -3218,7 +3218,7 @@ for (;;)
|
||||
{
|
||||
RMATCH(eptr, ecode, offset_top, md, eptrb, RM21);
|
||||
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||
if (eptr-- == pp) break; /* Stop if tried at original pos */
|
||||
if (eptr-- <= pp) break; /* Stop if tried at original pos */
|
||||
#ifdef SUPPORT_UTF
|
||||
if (utf) BACKCHAR(eptr);
|
||||
#endif
|
||||
|
@ -164,7 +164,6 @@ typedef struct jit_arguments {
|
||||
const pcre_uchar *begin;
|
||||
const pcre_uchar *end;
|
||||
int *offsets;
|
||||
pcre_uchar *uchar_ptr;
|
||||
pcre_uchar *mark_ptr;
|
||||
void *callout_data;
|
||||
/* Everything else after. */
|
||||
@ -214,7 +213,7 @@ enum control_types {
|
||||
type_then_trap = 1
|
||||
};
|
||||
|
||||
typedef int (SLJIT_CALL *jit_function)(jit_arguments *args);
|
||||
typedef int (SLJIT_FUNC *jit_function)(jit_arguments *args);
|
||||
|
||||
/* The following structure is the key data type for the recursive
|
||||
code generator. It is allocated by compile_matchingpath, and contains
|
||||
@ -489,9 +488,24 @@ typedef struct compare_context {
|
||||
/* Used for accessing the elements of the stack. */
|
||||
#define STACK(i) ((i) * (int)sizeof(sljit_sw))
|
||||
|
||||
#ifdef SLJIT_PREF_SHIFT_REG
|
||||
#if SLJIT_PREF_SHIFT_REG == SLJIT_R2
|
||||
/* Nothing. */
|
||||
#elif SLJIT_PREF_SHIFT_REG == SLJIT_R3
|
||||
#define SHIFT_REG_IS_R3
|
||||
#else
|
||||
#error "Unsupported shift register"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define TMP1 SLJIT_R0
|
||||
#ifdef SHIFT_REG_IS_R3
|
||||
#define TMP2 SLJIT_R3
|
||||
#define TMP3 SLJIT_R2
|
||||
#else
|
||||
#define TMP2 SLJIT_R2
|
||||
#define TMP3 SLJIT_R3
|
||||
#endif
|
||||
#define STR_PTR SLJIT_S0
|
||||
#define STR_END SLJIT_S1
|
||||
#define STACK_TOP SLJIT_R1
|
||||
@ -520,13 +534,10 @@ the start pointers when the end of the capturing group has not yet reached. */
|
||||
|
||||
#if defined COMPILE_PCRE8
|
||||
#define MOV_UCHAR SLJIT_MOV_U8
|
||||
#define MOVU_UCHAR SLJIT_MOVU_U8
|
||||
#elif defined COMPILE_PCRE16
|
||||
#define MOV_UCHAR SLJIT_MOV_U16
|
||||
#define MOVU_UCHAR SLJIT_MOVU_U16
|
||||
#elif defined COMPILE_PCRE32
|
||||
#define MOV_UCHAR SLJIT_MOV_U32
|
||||
#define MOVU_UCHAR SLJIT_MOVU_U32
|
||||
#else
|
||||
#error Unsupported compiling mode
|
||||
#endif
|
||||
@ -2383,12 +2394,25 @@ if (length < 8)
|
||||
}
|
||||
else
|
||||
{
|
||||
GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START);
|
||||
OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1);
|
||||
loop = LABEL();
|
||||
OP1(SLJIT_MOVU, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_R0, 0);
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1);
|
||||
JUMPTO(SLJIT_NOT_ZERO, loop);
|
||||
if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw)) == SLJIT_SUCCESS)
|
||||
{
|
||||
GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START);
|
||||
OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1);
|
||||
loop = LABEL();
|
||||
sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw));
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1);
|
||||
JUMPTO(SLJIT_NOT_ZERO, loop);
|
||||
}
|
||||
else
|
||||
{
|
||||
GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START + sizeof(sljit_sw));
|
||||
OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1);
|
||||
loop = LABEL();
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0);
|
||||
OP2(SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_sw));
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1);
|
||||
JUMPTO(SLJIT_NOT_ZERO, loop);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2421,12 +2445,25 @@ if (length < 8)
|
||||
}
|
||||
else
|
||||
{
|
||||
GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + sizeof(sljit_sw));
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2);
|
||||
loop = LABEL();
|
||||
OP1(SLJIT_MOVU, SLJIT_MEM1(TMP2), sizeof(sljit_sw), TMP1, 0);
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1);
|
||||
JUMPTO(SLJIT_NOT_ZERO, loop);
|
||||
if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw)) == SLJIT_SUCCESS)
|
||||
{
|
||||
GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + sizeof(sljit_sw));
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2);
|
||||
loop = LABEL();
|
||||
sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1);
|
||||
JUMPTO(SLJIT_NOT_ZERO, loop);
|
||||
}
|
||||
else
|
||||
{
|
||||
GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + 2 * sizeof(sljit_sw));
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2);
|
||||
loop = LABEL();
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, TMP1, 0);
|
||||
OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, sizeof(sljit_sw));
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1);
|
||||
JUMPTO(SLJIT_NOT_ZERO, loop);
|
||||
}
|
||||
}
|
||||
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0);
|
||||
@ -2436,10 +2473,10 @@ if (common->control_head_ptr != 0)
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(jit_arguments, stack));
|
||||
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, base));
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, end));
|
||||
}
|
||||
|
||||
static sljit_sw SLJIT_CALL do_search_mark(sljit_sw *current, const pcre_uchar *skip_arg)
|
||||
static sljit_sw SLJIT_FUNC do_search_mark(sljit_sw *current, const pcre_uchar *skip_arg)
|
||||
{
|
||||
while (current != NULL)
|
||||
{
|
||||
@ -2460,7 +2497,7 @@ while (current != NULL)
|
||||
SLJIT_ASSERT(current[0] == 0 || current < (sljit_sw*)current[0]);
|
||||
current = (sljit_sw*)current[0];
|
||||
}
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static SLJIT_INLINE void copy_ovector(compiler_common *common, int topbracket)
|
||||
@ -2468,6 +2505,7 @@ static SLJIT_INLINE void copy_ovector(compiler_common *common, int topbracket)
|
||||
DEFINE_COMPILER;
|
||||
struct sljit_label *loop;
|
||||
struct sljit_jump *early_quit;
|
||||
BOOL has_pre;
|
||||
|
||||
/* At this point we can freely use all registers. */
|
||||
OP1(SLJIT_MOV, SLJIT_S2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));
|
||||
@ -2481,17 +2519,30 @@ if (common->mark_ptr != 0)
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R2, 0);
|
||||
OP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, offsets), SLJIT_IMM, sizeof(int));
|
||||
OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, begin));
|
||||
GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START);
|
||||
|
||||
has_pre = sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)) == SLJIT_SUCCESS;
|
||||
GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START - (has_pre ? sizeof(sljit_sw) : 0));
|
||||
|
||||
/* Unlikely, but possible */
|
||||
early_quit = CMP(SLJIT_EQUAL, SLJIT_R1, 0, SLJIT_IMM, 0);
|
||||
loop = LABEL();
|
||||
OP2(SLJIT_SUB, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0);
|
||||
OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw));
|
||||
|
||||
if (has_pre)
|
||||
sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw));
|
||||
else
|
||||
{
|
||||
OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0);
|
||||
OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw));
|
||||
}
|
||||
|
||||
OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, sizeof(int));
|
||||
OP2(SLJIT_SUB, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_R0, 0);
|
||||
/* Copy the integer value to the output buffer */
|
||||
#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
|
||||
OP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT);
|
||||
#endif
|
||||
OP1(SLJIT_MOVU_S32, SLJIT_MEM1(SLJIT_R2), sizeof(int), SLJIT_S1, 0);
|
||||
|
||||
OP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R2), 0, SLJIT_S1, 0);
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
|
||||
JUMPTO(SLJIT_NOT_ZERO, loop);
|
||||
JUMPHERE(early_quit);
|
||||
@ -2499,14 +2550,29 @@ JUMPHERE(early_quit);
|
||||
/* Calculate the return value, which is the maximum ovector value. */
|
||||
if (topbracket > 1)
|
||||
{
|
||||
GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + topbracket * 2 * sizeof(sljit_sw));
|
||||
OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1);
|
||||
if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw))) == SLJIT_SUCCESS)
|
||||
{
|
||||
GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + topbracket * 2 * sizeof(sljit_sw));
|
||||
OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1);
|
||||
|
||||
/* OVECTOR(0) is never equal to SLJIT_S2. */
|
||||
loop = LABEL();
|
||||
OP1(SLJIT_MOVU, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw)));
|
||||
OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
|
||||
CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop);
|
||||
/* OVECTOR(0) is never equal to SLJIT_S2. */
|
||||
loop = LABEL();
|
||||
sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw)));
|
||||
OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
|
||||
CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop);
|
||||
}
|
||||
else
|
||||
{
|
||||
GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + (topbracket - 1) * 2 * sizeof(sljit_sw));
|
||||
OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1);
|
||||
|
||||
/* OVECTOR(0) is never equal to SLJIT_S2. */
|
||||
loop = LABEL();
|
||||
OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), 0);
|
||||
OP2(SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2 * (sljit_sw)sizeof(sljit_sw));
|
||||
OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);
|
||||
CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop);
|
||||
}
|
||||
OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_R1, 0);
|
||||
}
|
||||
else
|
||||
@ -5167,93 +5233,190 @@ OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);
|
||||
sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
|
||||
}
|
||||
|
||||
#define CHAR1 STR_END
|
||||
#define CHAR2 STACK_TOP
|
||||
|
||||
static void do_casefulcmp(compiler_common *common)
|
||||
{
|
||||
DEFINE_COMPILER;
|
||||
struct sljit_jump *jump;
|
||||
struct sljit_label *label;
|
||||
int char1_reg;
|
||||
int char2_reg;
|
||||
|
||||
sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
|
||||
if (sljit_get_register_index(TMP3) < 0)
|
||||
{
|
||||
char1_reg = STR_END;
|
||||
char2_reg = STACK_TOP;
|
||||
}
|
||||
else
|
||||
{
|
||||
char1_reg = TMP3;
|
||||
char2_reg = RETURN_ADDR;
|
||||
}
|
||||
|
||||
sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
|
||||
OP1(SLJIT_MOV, TMP3, 0, CHAR1, 0);
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, CHAR2, 0);
|
||||
OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
|
||||
label = LABEL();
|
||||
OP1(MOVU_UCHAR, CHAR1, 0, SLJIT_MEM1(TMP1), IN_UCHARS(1));
|
||||
OP1(MOVU_UCHAR, CHAR2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
|
||||
jump = CMP(SLJIT_NOT_EQUAL, CHAR1, 0, CHAR2, 0);
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
JUMPTO(SLJIT_NOT_ZERO, label);
|
||||
if (char1_reg == STR_END)
|
||||
{
|
||||
OP1(SLJIT_MOV, TMP3, 0, char1_reg, 0);
|
||||
OP1(SLJIT_MOV, RETURN_ADDR, 0, char2_reg, 0);
|
||||
}
|
||||
|
||||
JUMPHERE(jump);
|
||||
OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
OP1(SLJIT_MOV, CHAR1, 0, TMP3, 0);
|
||||
OP1(SLJIT_MOV, CHAR2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
|
||||
if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
|
||||
{
|
||||
label = LABEL();
|
||||
sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));
|
||||
sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
|
||||
jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
JUMPTO(SLJIT_NOT_ZERO, label);
|
||||
|
||||
JUMPHERE(jump);
|
||||
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
}
|
||||
else if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
|
||||
{
|
||||
OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
|
||||
label = LABEL();
|
||||
sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));
|
||||
sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
|
||||
jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
JUMPTO(SLJIT_NOT_ZERO, label);
|
||||
|
||||
JUMPHERE(jump);
|
||||
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
}
|
||||
else
|
||||
{
|
||||
label = LABEL();
|
||||
OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0);
|
||||
OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0);
|
||||
OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
JUMPTO(SLJIT_NOT_ZERO, label);
|
||||
|
||||
JUMPHERE(jump);
|
||||
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
}
|
||||
|
||||
if (char1_reg == STR_END)
|
||||
{
|
||||
OP1(SLJIT_MOV, char1_reg, 0, TMP3, 0);
|
||||
OP1(SLJIT_MOV, char2_reg, 0, RETURN_ADDR, 0);
|
||||
}
|
||||
|
||||
sljit_emit_fast_return(compiler, TMP1, 0);
|
||||
}
|
||||
|
||||
#define LCC_TABLE STACK_LIMIT
|
||||
|
||||
static void do_caselesscmp(compiler_common *common)
|
||||
{
|
||||
DEFINE_COMPILER;
|
||||
struct sljit_jump *jump;
|
||||
struct sljit_label *label;
|
||||
int char1_reg = STR_END;
|
||||
int char2_reg;
|
||||
int lcc_table;
|
||||
int opt_type = 0;
|
||||
|
||||
sljit_emit_fast_enter(compiler, RETURN_ADDR, 0);
|
||||
if (sljit_get_register_index(TMP3) < 0)
|
||||
{
|
||||
char2_reg = STACK_TOP;
|
||||
lcc_table = STACK_LIMIT;
|
||||
}
|
||||
else
|
||||
{
|
||||
char2_reg = RETURN_ADDR;
|
||||
lcc_table = TMP3;
|
||||
}
|
||||
|
||||
if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
|
||||
opt_type = 1;
|
||||
else if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)
|
||||
opt_type = 2;
|
||||
|
||||
sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
|
||||
|
||||
OP1(SLJIT_MOV, TMP3, 0, LCC_TABLE, 0);
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, CHAR1, 0);
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, CHAR2, 0);
|
||||
OP1(SLJIT_MOV, LCC_TABLE, 0, SLJIT_IMM, common->lcc);
|
||||
OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, char1_reg, 0);
|
||||
|
||||
if (char2_reg == STACK_TOP)
|
||||
{
|
||||
OP1(SLJIT_MOV, TMP3, 0, char2_reg, 0);
|
||||
OP1(SLJIT_MOV, RETURN_ADDR, 0, lcc_table, 0);
|
||||
}
|
||||
|
||||
OP1(SLJIT_MOV, lcc_table, 0, SLJIT_IMM, common->lcc);
|
||||
|
||||
if (opt_type == 1)
|
||||
{
|
||||
label = LABEL();
|
||||
sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));
|
||||
sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
|
||||
}
|
||||
else if (opt_type == 2)
|
||||
{
|
||||
OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
|
||||
label = LABEL();
|
||||
sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));
|
||||
sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
|
||||
}
|
||||
else
|
||||
{
|
||||
label = LABEL();
|
||||
OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0);
|
||||
OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0);
|
||||
OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
}
|
||||
|
||||
label = LABEL();
|
||||
OP1(MOVU_UCHAR, CHAR1, 0, SLJIT_MEM1(TMP1), IN_UCHARS(1));
|
||||
OP1(MOVU_UCHAR, CHAR2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));
|
||||
#ifndef COMPILE_PCRE8
|
||||
jump = CMP(SLJIT_GREATER, CHAR1, 0, SLJIT_IMM, 255);
|
||||
jump = CMP(SLJIT_GREATER, char1_reg, 0, SLJIT_IMM, 255);
|
||||
#endif
|
||||
OP1(SLJIT_MOV_U8, CHAR1, 0, SLJIT_MEM2(LCC_TABLE, CHAR1), 0);
|
||||
OP1(SLJIT_MOV_U8, char1_reg, 0, SLJIT_MEM2(lcc_table, char1_reg), 0);
|
||||
#ifndef COMPILE_PCRE8
|
||||
JUMPHERE(jump);
|
||||
jump = CMP(SLJIT_GREATER, CHAR2, 0, SLJIT_IMM, 255);
|
||||
jump = CMP(SLJIT_GREATER, char2_reg, 0, SLJIT_IMM, 255);
|
||||
#endif
|
||||
OP1(SLJIT_MOV_U8, CHAR2, 0, SLJIT_MEM2(LCC_TABLE, CHAR2), 0);
|
||||
OP1(SLJIT_MOV_U8, char2_reg, 0, SLJIT_MEM2(lcc_table, char2_reg), 0);
|
||||
#ifndef COMPILE_PCRE8
|
||||
JUMPHERE(jump);
|
||||
#endif
|
||||
jump = CMP(SLJIT_NOT_EQUAL, CHAR1, 0, CHAR2, 0);
|
||||
|
||||
if (opt_type == 0)
|
||||
OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
|
||||
jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
JUMPTO(SLJIT_NOT_ZERO, label);
|
||||
|
||||
JUMPHERE(jump);
|
||||
OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
OP1(SLJIT_MOV, LCC_TABLE, 0, TMP3, 0);
|
||||
OP1(SLJIT_MOV, CHAR1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
OP1(SLJIT_MOV, CHAR2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
|
||||
sljit_emit_fast_return(compiler, RETURN_ADDR, 0);
|
||||
}
|
||||
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
|
||||
#undef LCC_TABLE
|
||||
#undef CHAR1
|
||||
#undef CHAR2
|
||||
if (opt_type == 2)
|
||||
OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
||||
|
||||
if (char2_reg == STACK_TOP)
|
||||
{
|
||||
OP1(SLJIT_MOV, char2_reg, 0, TMP3, 0);
|
||||
OP1(SLJIT_MOV, lcc_table, 0, RETURN_ADDR, 0);
|
||||
}
|
||||
|
||||
OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
|
||||
sljit_emit_fast_return(compiler, TMP1, 0);
|
||||
}
|
||||
|
||||
#if defined SUPPORT_UTF && defined SUPPORT_UCP
|
||||
|
||||
static const pcre_uchar * SLJIT_CALL do_utf_caselesscmp(pcre_uchar *src1, jit_arguments *args, pcre_uchar *end1)
|
||||
static const pcre_uchar * SLJIT_FUNC do_utf_caselesscmp(pcre_uchar *src1, pcre_uchar *src2, pcre_uchar *end1, pcre_uchar *end2)
|
||||
{
|
||||
/* This function would be ineffective to do in JIT level. */
|
||||
sljit_u32 c1, c2;
|
||||
const pcre_uchar *src2 = args->uchar_ptr;
|
||||
const pcre_uchar *end2 = args->end;
|
||||
const ucd_record *ur;
|
||||
const sljit_u32 *pp;
|
||||
|
||||
@ -6776,32 +6939,37 @@ else
|
||||
#if defined SUPPORT_UTF && defined SUPPORT_UCP
|
||||
if (common->utf && *cc == OP_REFI)
|
||||
{
|
||||
SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1 && TMP2 == SLJIT_R2);
|
||||
SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1);
|
||||
if (ref)
|
||||
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
|
||||
OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));
|
||||
else
|
||||
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
|
||||
OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));
|
||||
|
||||
if (withchecks)
|
||||
jump = CMP(SLJIT_EQUAL, TMP1, 0, TMP2, 0);
|
||||
jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_R2, 0);
|
||||
|
||||
/* Needed to save important temporary registers. */
|
||||
/* No free saved registers so save data on stack. */
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);
|
||||
OP1(SLJIT_MOV, SLJIT_R1, 0, ARGUMENTS, 0);
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, uchar_ptr), STR_PTR, 0);
|
||||
sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_utf_caselesscmp));
|
||||
OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0);
|
||||
OP1(SLJIT_MOV, SLJIT_R3, 0, STR_END, 0);
|
||||
sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_utf_caselesscmp));
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
|
||||
|
||||
if (common->mode == JIT_COMPILE)
|
||||
add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1));
|
||||
else
|
||||
{
|
||||
add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
|
||||
nopartial = CMP(SLJIT_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1);
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_LESS, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1);
|
||||
|
||||
add_jump(compiler, backtracks, JUMP(SLJIT_LESS));
|
||||
|
||||
nopartial = JUMP(SLJIT_NOT_EQUAL);
|
||||
OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);
|
||||
check_partial(common, FALSE);
|
||||
add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));
|
||||
JUMPHERE(nopartial);
|
||||
}
|
||||
OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);
|
||||
}
|
||||
else
|
||||
#endif /* SUPPORT_UTF && SUPPORT_UCP */
|
||||
@ -7125,7 +7293,7 @@ add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IM
|
||||
return cc + 1 + LINK_SIZE;
|
||||
}
|
||||
|
||||
static int SLJIT_CALL do_callout(struct jit_arguments *arguments, PUBL(callout_block) *callout_block, pcre_uchar **jit_ovector)
|
||||
static sljit_s32 SLJIT_FUNC do_callout(struct jit_arguments *arguments, PUBL(callout_block) *callout_block, pcre_uchar **jit_ovector)
|
||||
{
|
||||
const pcre_uchar *begin = arguments->begin;
|
||||
int *offset_vector = arguments->offsets;
|
||||
@ -7207,18 +7375,17 @@ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);
|
||||
/* SLJIT_R0 = arguments */
|
||||
OP1(SLJIT_MOV, SLJIT_R1, 0, STACK_TOP, 0);
|
||||
GET_LOCAL_BASE(SLJIT_R2, 0, OVECTOR_START);
|
||||
sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_callout));
|
||||
OP1(SLJIT_MOV_S32, SLJIT_RETURN_REG, 0, SLJIT_RETURN_REG, 0);
|
||||
sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(S32) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_callout));
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
free_stack(common, CALLOUT_ARG_SIZE / sizeof(sljit_sw));
|
||||
|
||||
/* Check return value. */
|
||||
OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
|
||||
add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER));
|
||||
OP2(SLJIT_SUB32 | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
|
||||
add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER32));
|
||||
if (common->forced_quit_label == NULL)
|
||||
add_jump(compiler, &common->forced_quit, JUMP(SLJIT_NOT_EQUAL) /* SIG_LESS */);
|
||||
add_jump(compiler, &common->forced_quit, JUMP(SLJIT_NOT_EQUAL32) /* SIG_LESS */);
|
||||
else
|
||||
JUMPTO(SLJIT_NOT_EQUAL /* SIG_LESS */, common->forced_quit_label);
|
||||
JUMPTO(SLJIT_NOT_EQUAL32 /* SIG_LESS */, common->forced_quit_label);
|
||||
return cc + 2 + 2 * LINK_SIZE;
|
||||
}
|
||||
|
||||
@ -10439,11 +10606,11 @@ if (opcode == OP_SKIP_ARG)
|
||||
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, (sljit_sw)(current->cc + 2));
|
||||
sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_search_mark));
|
||||
sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_search_mark));
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
|
||||
OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0);
|
||||
add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, -1));
|
||||
add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -11031,7 +11198,7 @@ if (!compiler)
|
||||
common->compiler = compiler;
|
||||
|
||||
/* Main pcre_jit_exec entry. */
|
||||
sljit_emit_enter(compiler, 0, 1, 5, 5, 0, 0, private_data_size);
|
||||
sljit_emit_enter(compiler, 0, SLJIT_ARG1(SW), 5, 5, 0, 0, private_data_size);
|
||||
|
||||
/* Register init. */
|
||||
reset_ovector(common, (re->top_bracket + 1) * 2);
|
||||
@ -11044,8 +11211,8 @@ OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str))
|
||||
OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, end));
|
||||
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack));
|
||||
OP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, limit_match));
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, base));
|
||||
OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, limit));
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, end));
|
||||
OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, start));
|
||||
OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH, TMP1, 0);
|
||||
|
||||
@ -11251,20 +11418,22 @@ common->quit_label = quit_label;
|
||||
set_jumps(common->stackalloc, LABEL());
|
||||
/* RETURN_ADDR is not a saved register. */
|
||||
sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP2, 0);
|
||||
OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
|
||||
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack));
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, top), STACK_TOP, 0);
|
||||
OP2(SLJIT_SUB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, limit), SLJIT_IMM, STACK_GROWTH_RATE);
|
||||
|
||||
sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize));
|
||||
jump = CMP(SLJIT_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
|
||||
OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);
|
||||
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack));
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, top));
|
||||
OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, limit));
|
||||
OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
|
||||
sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1);
|
||||
|
||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, STACK_TOP, 0);
|
||||
OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0);
|
||||
OP2(SLJIT_SUB, SLJIT_R1, 0, STACK_LIMIT, 0, SLJIT_IMM, STACK_GROWTH_RATE);
|
||||
OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, stack));
|
||||
OP1(SLJIT_MOV, STACK_LIMIT, 0, TMP2, 0);
|
||||
|
||||
sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize));
|
||||
jump = CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);
|
||||
OP1(SLJIT_MOV, TMP2, 0, STACK_LIMIT, 0);
|
||||
OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_RETURN_REG, 0);
|
||||
OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);
|
||||
OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);
|
||||
sljit_emit_fast_return(compiler, TMP1, 0);
|
||||
|
||||
/* Allocation failed. */
|
||||
JUMPHERE(jump);
|
||||
@ -11409,9 +11578,9 @@ union {
|
||||
sljit_u8 local_space[MACHINE_STACK_SIZE];
|
||||
struct sljit_stack local_stack;
|
||||
|
||||
local_stack.max_limit = local_space;
|
||||
local_stack.limit = local_space;
|
||||
local_stack.base = local_space + MACHINE_STACK_SIZE;
|
||||
local_stack.min_start = local_space;
|
||||
local_stack.start = local_space;
|
||||
local_stack.end = local_space + MACHINE_STACK_SIZE;
|
||||
local_stack.top = local_space + MACHINE_STACK_SIZE;
|
||||
arguments->stack = &local_stack;
|
||||
convert_executable_func.executable_func = executable_func;
|
||||
@ -11529,7 +11698,7 @@ if ((options & PCRE_PARTIAL_HARD) != 0)
|
||||
else if ((options & PCRE_PARTIAL_SOFT) != 0)
|
||||
mode = JIT_PARTIAL_SOFT_COMPILE;
|
||||
|
||||
if (functions->executable_funcs[mode] == NULL)
|
||||
if (functions == NULL || functions->executable_funcs[mode] == NULL)
|
||||
return PCRE_ERROR_JIT_BADOPTION;
|
||||
|
||||
/* Sanity checks should be handled by pcre_exec. */
|
||||
|
@ -1387,8 +1387,8 @@ Returns: nothing
|
||||
*/
|
||||
|
||||
static void
|
||||
do_after_lines(int lastmatchnumber, char *lastmatchrestart, char *endptr,
|
||||
char *printname)
|
||||
do_after_lines(unsigned long int lastmatchnumber, char *lastmatchrestart,
|
||||
char *endptr, char *printname)
|
||||
{
|
||||
if (after_context > 0 && lastmatchnumber > 0)
|
||||
{
|
||||
@ -1398,7 +1398,7 @@ if (after_context > 0 && lastmatchnumber > 0)
|
||||
int ellength;
|
||||
char *pp = lastmatchrestart;
|
||||
if (printname != NULL) fprintf(stdout, "%s-", printname);
|
||||
if (number) fprintf(stdout, "%d-", lastmatchnumber++);
|
||||
if (number) fprintf(stdout, "%lu-", lastmatchnumber++);
|
||||
pp = end_of_line(pp, endptr, &ellength);
|
||||
FWRITE(lastmatchrestart, 1, pp - lastmatchrestart, stdout);
|
||||
lastmatchrestart = pp;
|
||||
@ -1502,11 +1502,11 @@ static int
|
||||
pcregrep(void *handle, int frtype, char *filename, char *printname)
|
||||
{
|
||||
int rc = 1;
|
||||
int linenumber = 1;
|
||||
int lastmatchnumber = 0;
|
||||
int count = 0;
|
||||
int filepos = 0;
|
||||
int offsets[OFFSET_SIZE];
|
||||
unsigned long int linenumber = 1;
|
||||
unsigned long int lastmatchnumber = 0;
|
||||
unsigned long int count = 0;
|
||||
char *lastmatchrestart = NULL;
|
||||
char *ptr = main_buffer;
|
||||
char *endptr;
|
||||
@ -1609,7 +1609,7 @@ while (ptr < endptr)
|
||||
|
||||
if (endlinelength == 0 && t == main_buffer + bufsize)
|
||||
{
|
||||
fprintf(stderr, "pcregrep: line %d%s%s is too long for the internal buffer\n"
|
||||
fprintf(stderr, "pcregrep: line %lu%s%s is too long for the internal buffer\n"
|
||||
"pcregrep: check the --buffer-size option\n",
|
||||
linenumber,
|
||||
(filename == NULL)? "" : " of file ",
|
||||
@ -1747,7 +1747,7 @@ while (ptr < endptr)
|
||||
prevoffsets[1] = offsets[1];
|
||||
|
||||
if (printname != NULL) fprintf(stdout, "%s:", printname);
|
||||
if (number) fprintf(stdout, "%d:", linenumber);
|
||||
if (number) fprintf(stdout, "%lu:", linenumber);
|
||||
|
||||
/* Handle --line-offsets */
|
||||
|
||||
@ -1862,7 +1862,7 @@ while (ptr < endptr)
|
||||
{
|
||||
char *pp = lastmatchrestart;
|
||||
if (printname != NULL) fprintf(stdout, "%s-", printname);
|
||||
if (number) fprintf(stdout, "%d-", lastmatchnumber++);
|
||||
if (number) fprintf(stdout, "%lu-", lastmatchnumber++);
|
||||
pp = end_of_line(pp, endptr, &ellength);
|
||||
FWRITE(lastmatchrestart, 1, pp - lastmatchrestart, stdout);
|
||||
lastmatchrestart = pp;
|
||||
@ -1902,7 +1902,7 @@ while (ptr < endptr)
|
||||
int ellength;
|
||||
char *pp = p;
|
||||
if (printname != NULL) fprintf(stdout, "%s-", printname);
|
||||
if (number) fprintf(stdout, "%d-", linenumber - linecount--);
|
||||
if (number) fprintf(stdout, "%lu-", linenumber - linecount--);
|
||||
pp = end_of_line(pp, endptr, &ellength);
|
||||
FWRITE(p, 1, pp - p, stdout);
|
||||
p = pp;
|
||||
@ -1916,7 +1916,7 @@ while (ptr < endptr)
|
||||
endhyphenpending = TRUE;
|
||||
|
||||
if (printname != NULL) fprintf(stdout, "%s:", printname);
|
||||
if (number) fprintf(stdout, "%d:", linenumber);
|
||||
if (number) fprintf(stdout, "%lu:", linenumber);
|
||||
|
||||
/* In multiline mode, we want to print to the end of the line in which
|
||||
the end of the matched string is found, so we adjust linelength and the
|
||||
@ -2112,7 +2112,7 @@ if (count_only && !quiet)
|
||||
{
|
||||
if (printname != NULL && filenames != FN_NONE)
|
||||
fprintf(stdout, "%s:", printname);
|
||||
fprintf(stdout, "%d\n", count);
|
||||
fprintf(stdout, "%lu\n", count);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2234,7 +2234,7 @@ if (isdirectory(pathname))
|
||||
|
||||
if (dee_action == dee_RECURSE)
|
||||
{
|
||||
char buffer[1024];
|
||||
char buffer[2048];
|
||||
char *nextfile;
|
||||
directory_type *dir = opendirectory(pathname);
|
||||
|
||||
@ -2249,7 +2249,14 @@ if (isdirectory(pathname))
|
||||
while ((nextfile = readdirectory(dir)) != NULL)
|
||||
{
|
||||
int frc;
|
||||
sprintf(buffer, "%.512s%c%.128s", pathname, FILESEP, nextfile);
|
||||
int fnlength = strlen(pathname) + strlen(nextfile) + 2;
|
||||
if (fnlength > 2048)
|
||||
{
|
||||
fprintf(stderr, "pcre2grep: recursive filename is too long\n");
|
||||
rc = 2;
|
||||
break;
|
||||
}
|
||||
sprintf(buffer, "%s%c%s", pathname, FILESEP, nextfile);
|
||||
frc = grep_or_recurse(buffer, dir_recurse, FALSE);
|
||||
if (frc > 1) rc = frc;
|
||||
else if (frc == 0 && rc == 1) rc = 0;
|
||||
@ -2520,7 +2527,14 @@ if ((popts & PO_FIXED_STRINGS) != 0)
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(buffer, "%s%.*s%s", prefix[popts], patlen, ps, suffix[popts]);
|
||||
if (snprintf(buffer, PATBUFSIZE, "%s%.*s%s", prefix[popts], patlen, ps,
|
||||
suffix[popts]) > PATBUFSIZE)
|
||||
{
|
||||
fprintf(stderr, "pcregrep: Buffer overflow while compiling \"%s\"\n",
|
||||
ps);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
p->compiled = pcre_compile(buffer, options, &error, &errptr, pcretables);
|
||||
if (p->compiled != NULL) return TRUE;
|
||||
|
||||
@ -2756,8 +2770,15 @@ for (i = 1; i < argc; i++)
|
||||
int arglen = (argequals == NULL || equals == NULL)?
|
||||
(int)strlen(arg) : (int)(argequals - arg);
|
||||
|
||||
sprintf(buff1, "%.*s", baselen, op->long_name);
|
||||
sprintf(buff2, "%s%.*s", buff1, fulllen - baselen - 2, opbra + 1);
|
||||
if (snprintf(buff1, sizeof(buff1), "%.*s", baselen, op->long_name) >
|
||||
(int)sizeof(buff1) ||
|
||||
snprintf(buff2, sizeof(buff2), "%s%.*s", buff1,
|
||||
fulllen - baselen - 2, opbra + 1) > (int)sizeof(buff2))
|
||||
{
|
||||
fprintf(stderr, "pcregrep: Buffer overflow when parsing %s option\n",
|
||||
op->long_name);
|
||||
pcregrep_exit(2);
|
||||
}
|
||||
|
||||
if (strncmp(arg, buff1, arglen) == 0 ||
|
||||
strncmp(arg, buff2, arglen) == 0)
|
||||
|
@ -6,7 +6,7 @@
|
||||
and semantics are as close as possible to those of the Perl 5 language.
|
||||
|
||||
Written by Philip Hazel
|
||||
Copyright (c) 1997-2017 University of Cambridge
|
||||
Copyright (c) 1997-2018 University of Cambridge
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -389,8 +389,8 @@ if (rc >= 0)
|
||||
{
|
||||
for (i = 0; i < (size_t)rc; i++)
|
||||
{
|
||||
pmatch[i].rm_so = ovector[i*2] + so;
|
||||
pmatch[i].rm_eo = ovector[i*2+1] + so;
|
||||
pmatch[i].rm_so = (ovector[i*2] < 0)? -1 : ovector[i*2] + so;
|
||||
pmatch[i].rm_eo = (ovector[i*2+1] < 0)? -1: ovector[i*2+1] + so;
|
||||
}
|
||||
if (allocated_ovector) free(ovector);
|
||||
for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;
|
||||
|
8
pcre/testdata/testinput2
vendored
8
pcre/testdata/testinput2
vendored
@ -4249,4 +4249,12 @@ backtracking verbs. --/
|
||||
|
||||
/(?=.*[A-Z])/I
|
||||
|
||||
"(?<=(a))\1?b"
|
||||
ab
|
||||
aaab
|
||||
|
||||
"(?=(a))\1?b"
|
||||
ab
|
||||
aaab
|
||||
|
||||
/-- End of testinput2 --/
|
||||
|
6
pcre/testdata/testinput5
vendored
6
pcre/testdata/testinput5
vendored
@ -798,4 +798,10 @@
|
||||
/(?<=\K\x{17f})/8G+
|
||||
\x{17f}\x{17f}\x{17f}\x{17f}\x{17f}
|
||||
|
||||
/\C[^\v]+\x80/8
|
||||
[AΏBŀC]
|
||||
|
||||
/\C[^\d]+\x80/8
|
||||
[AΏBŀC]
|
||||
|
||||
/-- End of testinput5 --/
|
||||
|
16
pcre/testdata/testoutput2
vendored
16
pcre/testdata/testoutput2
vendored
@ -14705,4 +14705,20 @@ No options
|
||||
No first char
|
||||
No need char
|
||||
|
||||
"(?<=(a))\1?b"
|
||||
ab
|
||||
0: b
|
||||
1: a
|
||||
aaab
|
||||
0: ab
|
||||
1: a
|
||||
|
||||
"(?=(a))\1?b"
|
||||
ab
|
||||
0: ab
|
||||
1: a
|
||||
aaab
|
||||
0: ab
|
||||
1: a
|
||||
|
||||
/-- End of testinput2 --/
|
||||
|
8
pcre/testdata/testoutput5
vendored
8
pcre/testdata/testoutput5
vendored
@ -1942,4 +1942,12 @@ Need char = 'z'
|
||||
0: \x{17f}
|
||||
0+
|
||||
|
||||
/\C[^\v]+\x80/8
|
||||
[AΏBŀC]
|
||||
No match
|
||||
|
||||
/\C[^\d]+\x80/8
|
||||
[AΏBŀC]
|
||||
No match
|
||||
|
||||
/-- End of testinput5 --/
|
||||
|
@ -41,13 +41,12 @@ struct show_table_contributors_st show_table_contributors[]= {
|
||||
{"Alibaba Cloud", "https://www.alibabacloud.com/", "Platinum Sponsor of the MariaDB Foundation"},
|
||||
{"Tencent Cloud", "https://cloud.tencent.com", "Platinum Sponsor of the MariaDB Foundation"},
|
||||
{"Microsoft", "https://microsoft.com/", "Platinum Sponsor of the MariaDB Foundation"},
|
||||
{"MariaDB Corporation", "https://mariadb.com", "Founding member, Gold Sponsor of the MariaDB Foundation"},
|
||||
{"MariaDB Corporation", "https://mariadb.com", "Founding member, Platinum Sponsor of the MariaDB Foundation"},
|
||||
{"Visma", "https://visma.com", "Gold Sponsor of the MariaDB Foundation"},
|
||||
{"DBS", "https://dbs.com", "Gold Sponsor of the MariaDB Foundation"},
|
||||
{"IBM", "https://www.ibm.com", "Gold Sponsor of the MariaDB Foundation"},
|
||||
{"Nexedi", "https://www.nexedi.com", "Silver Sponsor of the MariaDB Foundation"},
|
||||
{"Acronis", "http://www.acronis.com", "Silver Sponsor of the MariaDB Foundation"},
|
||||
{"Auttomattic", "https://automattic.com", "Bronze Sponsor of the MariaDB Foundation"},
|
||||
{"Verkkokauppa.com", "https://www.verkkokauppa.com", "Bronze Sponsor of the MariaDB Foundation"},
|
||||
{"Virtuozzo", "https://virtuozzo.com", "Bronze Sponsor of the MariaDB Foundation"},
|
||||
{"Tencent Game DBA", "http://tencentdba.com/about", "Bronze Sponsor of the MariaDB Foundation"},
|
||||
|
@ -5330,6 +5330,13 @@ static void calc_datetime_days_diff(MYSQL_TIME *ltime, long days)
|
||||
ltime->second) * 1000000LL +
|
||||
ltime->second_part);
|
||||
unpack_time(timediff, ltime);
|
||||
/*
|
||||
unpack_time() broke down hours into ltime members hour,day,month.
|
||||
Mix them back to ltime->hour using the same factors
|
||||
that pack_time()/unpack_time() use (i.e. 32 for month).
|
||||
*/
|
||||
ltime->hour+= (ltime->month * 32 + ltime->day) * 24;
|
||||
ltime->month= ltime->day= 0;
|
||||
}
|
||||
ltime->time_type= MYSQL_TIMESTAMP_TIME;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
Copyright (c) 2009, 2018, 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
|
||||
@ -790,7 +790,9 @@ static my_bool closecon_handlerton(THD *thd, plugin_ref plugin,
|
||||
*/
|
||||
void ha_close_connection(THD* thd)
|
||||
{
|
||||
plugin_foreach(thd, closecon_handlerton, MYSQL_STORAGE_ENGINE_PLUGIN, 0);
|
||||
plugin_foreach_with_mask(thd, closecon_handlerton,
|
||||
MYSQL_STORAGE_ENGINE_PLUGIN,
|
||||
PLUGIN_IS_DELETED|PLUGIN_IS_READY, 0);
|
||||
}
|
||||
|
||||
static my_bool kill_handlerton(THD *thd, plugin_ref plugin,
|
||||
@ -4354,18 +4356,6 @@ handler::check_if_supported_inplace_alter(TABLE *altered_table,
|
||||
DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Default implementation to support in-place alter table
|
||||
and old online add/drop index API
|
||||
*/
|
||||
|
||||
void handler::notify_table_changed()
|
||||
{
|
||||
ha_create_partitioning_metadata(table->s->path.str, NULL, CHF_INDEX_FLAG);
|
||||
}
|
||||
|
||||
|
||||
void Alter_inplace_info::report_unsupported_error(const char *not_supported,
|
||||
const char *try_instead)
|
||||
{
|
||||
@ -4464,7 +4454,6 @@ handler::ha_create_partitioning_metadata(const char *name, const char *old_name,
|
||||
DBUG_ASSERT(m_lock_type == F_UNLCK ||
|
||||
(!old_name && strcmp(name, table_share->path.str)));
|
||||
|
||||
mark_trx_read_write();
|
||||
|
||||
return create_partitioning_metadata(name, old_name, action_flag);
|
||||
}
|
||||
|
@ -3723,7 +3723,7 @@ protected:
|
||||
|
||||
@note No errors are allowed during notify_table_changed().
|
||||
*/
|
||||
virtual void notify_table_changed();
|
||||
virtual void notify_table_changed() { }
|
||||
|
||||
public:
|
||||
/* End of On-line/in-place ALTER TABLE interface. */
|
||||
|
@ -548,6 +548,7 @@ Item::Item():
|
||||
in_rollup= 0;
|
||||
decimals= 0; max_length= 0;
|
||||
with_subselect= 0;
|
||||
with_param= 0;
|
||||
cmp_context= IMPOSSIBLE_RESULT;
|
||||
/* Initially this item is not attached to any JOIN_TAB. */
|
||||
join_tab_idx= MAX_TABLES;
|
||||
@ -594,6 +595,7 @@ Item::Item(THD *thd, Item *item):
|
||||
null_value(item->null_value),
|
||||
unsigned_flag(item->unsigned_flag),
|
||||
with_sum_func(item->with_sum_func),
|
||||
with_param(item->with_param),
|
||||
with_field(item->with_field),
|
||||
fixed(item->fixed),
|
||||
is_autogenerated_name(item->is_autogenerated_name),
|
||||
@ -1475,6 +1477,9 @@ bool Item_sp_variable::fix_fields(THD *thd, Item **)
|
||||
max_length= it->max_length;
|
||||
decimals= it->decimals;
|
||||
unsigned_flag= it->unsigned_flag;
|
||||
with_param= 1;
|
||||
if (thd->lex->current_select->master_unit()->item)
|
||||
thd->lex->current_select->master_unit()->item->with_param= 1;
|
||||
fixed= 1;
|
||||
collation.set(it->collation.collation, it->collation.derivation);
|
||||
|
||||
@ -7220,6 +7225,7 @@ void Item_ref::set_properties()
|
||||
split_sum_func() doesn't try to change the reference.
|
||||
*/
|
||||
with_sum_func= (*ref)->with_sum_func;
|
||||
with_param= (*ref)->with_param;
|
||||
with_field= (*ref)->with_field;
|
||||
unsigned_flag= (*ref)->unsigned_flag;
|
||||
fixed= 1;
|
||||
@ -7667,6 +7673,7 @@ Item_cache_wrapper::Item_cache_wrapper(Item *item_arg)
|
||||
decimals= orig_item->decimals;
|
||||
collation.set(orig_item->collation);
|
||||
with_sum_func= orig_item->with_sum_func;
|
||||
with_param= orig_item->with_param;
|
||||
with_field= orig_item->with_field;
|
||||
unsigned_flag= orig_item->unsigned_flag;
|
||||
name= item_arg->name;
|
||||
|
@ -669,6 +669,7 @@ public:
|
||||
bool null_value; /* if item is null */
|
||||
bool unsigned_flag;
|
||||
bool with_sum_func; /* True if item contains a sum func */
|
||||
bool with_param; /* True if contains an SP parameter */
|
||||
/**
|
||||
True if any item except Item_sum_func contains a field. Set during parsing.
|
||||
*/
|
||||
|
@ -1571,6 +1571,7 @@ bool Item_in_optimizer::fix_left(THD *thd)
|
||||
}
|
||||
eval_not_null_tables(NULL);
|
||||
with_sum_func= args[0]->with_sum_func;
|
||||
with_param= args[0]->with_param || args[1]->with_param;
|
||||
with_field= args[0]->with_field;
|
||||
if ((const_item_cache= args[0]->const_item()))
|
||||
{
|
||||
@ -1620,6 +1621,7 @@ bool Item_in_optimizer::fix_fields(THD *thd, Item **ref)
|
||||
with_subselect= 1;
|
||||
with_sum_func= with_sum_func || args[1]->with_sum_func;
|
||||
with_field= with_field || args[1]->with_field;
|
||||
with_param= args[0]->with_param || args[1]->with_param;
|
||||
used_tables_cache|= args[1]->used_tables();
|
||||
const_item_cache&= args[1]->const_item();
|
||||
fixed= 1;
|
||||
@ -2171,6 +2173,7 @@ void Item_func_interval::fix_length_and_dec()
|
||||
used_tables_cache|= row->used_tables();
|
||||
not_null_tables_cache= row->not_null_tables();
|
||||
with_sum_func= with_sum_func || row->with_sum_func;
|
||||
with_param= with_param || row->with_param;
|
||||
with_field= with_field || row->with_field;
|
||||
const_item_cache&= row->const_item();
|
||||
}
|
||||
@ -4401,6 +4404,7 @@ Item_cond::fix_fields(THD *thd, Item **ref)
|
||||
List_iterator<Item> li(list);
|
||||
Item *item;
|
||||
uchar buff[sizeof(char*)]; // Max local vars in function
|
||||
bool is_and_cond= functype() == Item_func::COND_AND_FUNC;
|
||||
not_null_tables_cache= used_tables_cache= 0;
|
||||
const_item_cache= 1;
|
||||
|
||||
@ -4462,26 +4466,33 @@ Item_cond::fix_fields(THD *thd, Item **ref)
|
||||
(item= *li.ref())->check_cols(1))
|
||||
return TRUE; /* purecov: inspected */
|
||||
used_tables_cache|= item->used_tables();
|
||||
if (item->const_item())
|
||||
if (item->const_item() && !item->with_param &&
|
||||
!item->is_expensive() && !cond_has_datetime_is_null(item))
|
||||
{
|
||||
if (!item->is_expensive() && !cond_has_datetime_is_null(item) &&
|
||||
item->val_int() == 0)
|
||||
if (item->val_int() == is_and_cond && top_level())
|
||||
{
|
||||
/*
|
||||
This is "... OR false_cond OR ..."
|
||||
a. This is "... AND true_cond AND ..."
|
||||
In this case, true_cond has no effect on cond_and->not_null_tables()
|
||||
b. This is "... OR false_cond/null cond OR ..."
|
||||
In this case, false_cond has no effect on cond_or->not_null_tables()
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
This is "... OR const_cond OR ..."
|
||||
a. This is "... AND false_cond/null_cond AND ..."
|
||||
The whole condition is FALSE/UNKNOWN.
|
||||
b. This is "... OR const_cond OR ..."
|
||||
In this case, cond_or->not_null_tables()=0, because the condition
|
||||
const_cond might evaluate to true (regardless of whether some tables
|
||||
were NULL-complemented).
|
||||
*/
|
||||
not_null_tables_cache= (table_map) 0;
|
||||
and_tables_cache= (table_map) 0;
|
||||
}
|
||||
if (thd->is_error())
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4493,6 +4504,7 @@ Item_cond::fix_fields(THD *thd, Item **ref)
|
||||
}
|
||||
|
||||
with_sum_func= with_sum_func || item->with_sum_func;
|
||||
with_param= with_param || item->with_param;
|
||||
with_field= with_field || item->with_field;
|
||||
with_subselect|= item->has_subquery();
|
||||
if (item->maybe_null)
|
||||
@ -4509,30 +4521,36 @@ bool
|
||||
Item_cond::eval_not_null_tables(uchar *opt_arg)
|
||||
{
|
||||
Item *item;
|
||||
bool is_and_cond= functype() == Item_func::COND_AND_FUNC;
|
||||
List_iterator<Item> li(list);
|
||||
not_null_tables_cache= (table_map) 0;
|
||||
and_tables_cache= ~(table_map) 0;
|
||||
while ((item=li++))
|
||||
{
|
||||
table_map tmp_table_map;
|
||||
if (item->const_item())
|
||||
if (item->const_item() && !item->with_param &&
|
||||
!item->is_expensive() && !cond_has_datetime_is_null(item))
|
||||
{
|
||||
if (!item->is_expensive() && !cond_has_datetime_is_null(item) &&
|
||||
item->val_int() == 0)
|
||||
if (item->val_int() == is_and_cond && top_level())
|
||||
{
|
||||
/*
|
||||
This is "... OR false_cond OR ..."
|
||||
a. This is "... AND true_cond AND ..."
|
||||
In this case, true_cond has no effect on cond_and->not_null_tables()
|
||||
b. This is "... OR false_cond/null cond OR ..."
|
||||
In this case, false_cond has no effect on cond_or->not_null_tables()
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
This is "... OR const_cond OR ..."
|
||||
a. This is "... AND false_cond/null_cond AND ..."
|
||||
The whole condition is FALSE/UNKNOWN.
|
||||
b. This is "... OR const_cond OR ..."
|
||||
In this case, cond_or->not_null_tables()=0, because the condition
|
||||
some_cond_or might be true regardless of what tables are
|
||||
NULL-complemented.
|
||||
const_cond might evaluate to true (regardless of whether some tables
|
||||
were NULL-complemented).
|
||||
*/
|
||||
not_null_tables_cache= (table_map) 0;
|
||||
and_tables_cache= (table_map) 0;
|
||||
}
|
||||
}
|
||||
|
@ -220,6 +220,7 @@ Item_func::fix_fields(THD *thd, Item **ref)
|
||||
maybe_null=1;
|
||||
|
||||
with_sum_func= with_sum_func || item->with_sum_func;
|
||||
with_param= with_param || item->with_param;
|
||||
with_field= with_field || item->with_field;
|
||||
used_tables_cache|= item->used_tables();
|
||||
const_item_cache&= item->const_item();
|
||||
|
@ -90,6 +90,7 @@ public:
|
||||
args= tmp_arg;
|
||||
args[0]= a;
|
||||
with_sum_func= a->with_sum_func;
|
||||
with_param= a->with_param;
|
||||
with_field= a->with_field;
|
||||
}
|
||||
Item_func(Item *a,Item *b):
|
||||
@ -98,6 +99,7 @@ public:
|
||||
args= tmp_arg;
|
||||
args[0]= a; args[1]= b;
|
||||
with_sum_func= a->with_sum_func || b->with_sum_func;
|
||||
with_param= a->with_param || b->with_param;
|
||||
with_field= a->with_field || b->with_field;
|
||||
}
|
||||
Item_func(Item *a,Item *b,Item *c):
|
||||
@ -109,6 +111,7 @@ public:
|
||||
arg_count= 3;
|
||||
args[0]= a; args[1]= b; args[2]= c;
|
||||
with_sum_func= a->with_sum_func || b->with_sum_func || c->with_sum_func;
|
||||
with_param= a->with_param || b->with_param || c->with_param;
|
||||
with_field= a->with_field || b->with_field || c->with_field;
|
||||
}
|
||||
}
|
||||
@ -122,6 +125,8 @@ public:
|
||||
args[0]= a; args[1]= b; args[2]= c; args[3]= d;
|
||||
with_sum_func= a->with_sum_func || b->with_sum_func ||
|
||||
c->with_sum_func || d->with_sum_func;
|
||||
with_param= a->with_param || b->with_param ||
|
||||
c->with_param || d->with_param;
|
||||
with_field= a->with_field || b->with_field ||
|
||||
c->with_field || d->with_field;
|
||||
}
|
||||
@ -135,6 +140,8 @@ public:
|
||||
args[0]= a; args[1]= b; args[2]= c; args[3]= d; args[4]= e;
|
||||
with_sum_func= a->with_sum_func || b->with_sum_func ||
|
||||
c->with_sum_func || d->with_sum_func || e->with_sum_func ;
|
||||
with_param= a->with_param || b->with_param ||
|
||||
c->with_param || d->with_param || e->with_param;
|
||||
with_field= a->with_field || b->with_field ||
|
||||
c->with_field || d->with_field || e->with_field;
|
||||
}
|
||||
|
@ -126,6 +126,7 @@ bool Item_row::fix_fields(THD *thd, Item **ref)
|
||||
with_sum_func= with_sum_func || item->with_sum_func;
|
||||
with_field= with_field || item->with_field;
|
||||
with_subselect|= item->with_subselect;
|
||||
with_param|= item->with_param;
|
||||
}
|
||||
fixed= 1;
|
||||
return FALSE;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user