mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
merge mysql-5.1-bugteam into mysql-5.1-security
This commit is contained in:
commit
9a561cca25
69 changed files with 1266 additions and 697 deletions
|
@ -2880,7 +2880,8 @@ fi
|
|||
|
||||
AC_CONFIG_FILES(Makefile extra/Makefile mysys/Makefile dnl
|
||||
unittest/Makefile unittest/mytap/Makefile unittest/mytap/t/Makefile dnl
|
||||
unittest/mysys/Makefile unittest/examples/Makefile dnl
|
||||
unittest/mysys/Makefile unittest/strings/Makefile dnl
|
||||
unittest/examples/Makefile dnl
|
||||
strings/Makefile regex/Makefile storage/Makefile dnl
|
||||
man/Makefile BUILD/Makefile vio/Makefile dnl
|
||||
libmysql/Makefile libmysql_r/Makefile client/Makefile dnl
|
||||
|
|
|
@ -185,7 +185,7 @@ void Base64Decoder::Decode()
|
|||
{
|
||||
word32 bytes = coded_.size();
|
||||
word32 plainSz = bytes - ((bytes + (pemLineSz - 1)) / pemLineSz);
|
||||
plainSz = (plainSz * 3 + 3) / 4;
|
||||
plainSz = ((plainSz * 3) / 4) + 3;
|
||||
decoded_.New(plainSz);
|
||||
|
||||
word32 i = 0;
|
||||
|
|
|
@ -100,7 +100,8 @@ TEST_DIRS = t r include std_data std_data/parts collections \
|
|||
suite/rpl_ndb suite/rpl_ndb/t suite/rpl_ndb/r \
|
||||
suite/parts suite/parts/t suite/parts/r suite/parts/inc \
|
||||
suite/innodb suite/innodb/t suite/innodb/r suite/innodb/include \
|
||||
suite/innodb_plugin suite/innodb_plugin/t suite/innodb_plugin/r suite/innodb_plugin/include \
|
||||
suite/innodb_plugin suite/innodb_plugin/t suite/innodb_plugin/r \
|
||||
suite/innodb_plugin/include \
|
||||
suite/engines suite/engines/funcs suite/engines/iuds suite/engines/rr_trx \
|
||||
suite/engines/funcs/r suite/engines/funcs/t suite/engines/iuds/r \
|
||||
suite/engines/iuds/t suite/engines/rr_trx/include suite/engines/rr_trx/r \
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
--source include/not_embedded.inc
|
||||
disable_query_log;
|
||||
--require r/true.require
|
||||
SELECT (plugin_library LIKE 'ha_innodb_plugin%') AS `TRUE` FROM information_schema.plugins WHERE LOWER(plugin_name) = 'innodb' AND LOWER(plugin_status) = 'active';
|
||||
|
|
|
@ -1810,4 +1810,39 @@ MAX(t2.a)
|
|||
2
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# Bug#55188: GROUP BY, GROUP_CONCAT and TEXT - inconsistent results
|
||||
#
|
||||
CREATE TABLE t1 (a text, b varchar(10));
|
||||
INSERT INTO t1 VALUES (repeat('1', 1300),'one'), (repeat('1', 1300),'two');
|
||||
EXPLAIN
|
||||
SELECT SUBSTRING(a,1,10), LENGTH(a), GROUP_CONCAT(b) FROM t1 GROUP BY a;
|
||||
id 1
|
||||
select_type SIMPLE
|
||||
table t1
|
||||
type ALL
|
||||
possible_keys NULL
|
||||
key NULL
|
||||
key_len NULL
|
||||
ref NULL
|
||||
rows 2
|
||||
Extra Using filesort
|
||||
SELECT SUBSTRING(a,1,10), LENGTH(a), GROUP_CONCAT(b) FROM t1 GROUP BY a;
|
||||
SUBSTRING(a,1,10) LENGTH(a) GROUP_CONCAT(b)
|
||||
1111111111 1300 one,two
|
||||
EXPLAIN
|
||||
SELECT SUBSTRING(a,1,10), LENGTH(a) FROM t1 GROUP BY a;
|
||||
id 1
|
||||
select_type SIMPLE
|
||||
table t1
|
||||
type ALL
|
||||
possible_keys NULL
|
||||
key NULL
|
||||
key_len NULL
|
||||
ref NULL
|
||||
rows 2
|
||||
Extra Using temporary; Using filesort
|
||||
SELECT SUBSTRING(a,1,10), LENGTH(a) FROM t1 GROUP BY a;
|
||||
SUBSTRING(a,1,10) LENGTH(a)
|
||||
1111111111 1300
|
||||
DROP TABLE t1;
|
||||
# End of 5.1 tests
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
SET @old_general_log= @@global.general_log;
|
||||
SET @old_slow_query_log= @@global.slow_query_log;
|
||||
ok
|
||||
SET @@global.general_log= @old_general_log;
|
||||
SET @@global.slow_query_log= @old_slow_query_log;
|
||||
|
|
|
@ -1,125 +1,51 @@
|
|||
Certificate:
|
||||
Data:
|
||||
Version: 1 (0x0)
|
||||
Serial Number: 1048579 (0x100003)
|
||||
Signature Algorithm: md5WithRSAEncryption
|
||||
Issuer: C=SE, ST=Uppsala, L=Uppsala, O=MySQL AB
|
||||
Validity
|
||||
Not Before: Jan 29 12:01:53 2010 GMT
|
||||
Not After : Jan 28 12:01:53 2015 GMT
|
||||
Subject: C=SE, ST=Uppsala, O=MySQL AB, CN=server
|
||||
Subject Public Key Info:
|
||||
Public Key Algorithm: rsaEncryption
|
||||
Public-Key: (8192 bit)
|
||||
Modulus:
|
||||
00:ca:aa:1d:c4:11:ec:91:f0:c7:ff:5f:90:92:fc:
|
||||
40:0c:5e:b7:3d:00:c5:20:d5:0f:89:31:07:d7:41:
|
||||
4c:8b:60:80:aa:38:14:de:93:6b:9c:74:88:41:68:
|
||||
b5:02:41:01:2d:86:a2:7a:95:53:5e:7b:67:2f:6c:
|
||||
1e:29:51:f9:44:fd:4a:80:be:b2:23:a1:3e:1b:38:
|
||||
cf:88:c4:71:ee:f8:6b:41:c5:2d:c0:c3:52:ac:59:
|
||||
7d:81:34:19:95:32:b8:9a:51:b6:41:36:d4:c4:a1:
|
||||
ae:84:e6:38:b9:e8:bf:96:be:19:7a:6b:77:4d:e0:
|
||||
de:e6:b3:b6:6b:bc:3d:dd:68:bc:4b:c4:eb:f5:36:
|
||||
93:ed:56:a2:15:50:8a:10:e8:d6:22:ed:6c:b1:cd:
|
||||
c3:18:c9:f6:0a:e1:de:61:65:62:d6:14:41:8c:b5:
|
||||
fb:14:68:c1:cf:12:5d:41:21:9d:57:11:43:7d:bb:
|
||||
43:2c:21:bb:c3:44:7d:a8:cf:1f:c3:71:75:b5:47:
|
||||
c2:7d:ce:38:3c:73:64:9e:15:d8:a7:27:cf:bd:40:
|
||||
c8:45:08:e3:c8:39:a8:0b:8e:c2:5b:7b:f1:47:91:
|
||||
12:91:cc:e1:00:e0:94:5b:bd:32:e4:0c:8d:c3:be:
|
||||
cc:76:32:52:12:69:b0:18:e0:b0:c2:76:34:5a:5f:
|
||||
79:d9:f6:81:9d:02:0a:61:69:1c:33:ce:49:fa:76:
|
||||
03:1e:07:5b:27:0b:bf:34:9e:34:96:b8:03:9b:50:
|
||||
3a:6a:2f:17:7a:14:cf:65:63:00:37:52:a8:73:ce:
|
||||
4b:14:40:f4:d2:9a:56:54:33:b8:77:2e:42:5b:8f:
|
||||
ec:1f:18:f4:ad:ab:8a:4a:8d:6d:70:25:f3:58:e7:
|
||||
cb:66:51:14:7d:16:f4:eb:6d:56:76:76:51:6e:d6:
|
||||
1d:da:d3:8d:c0:64:5a:67:4e:af:e2:bf:33:d1:b8:
|
||||
f6:2a:fc:57:87:a7:35:5e:80:c9:ac:fc:87:c9:71:
|
||||
17:91:bf:b7:4d:a3:ed:3c:1b:27:f4:66:a0:f9:46:
|
||||
03:27:cc:ea:80:f6:4b:40:f6:41:94:cd:bd:0a:b3:
|
||||
ef:26:be:de:6f:69:ae:0f:3f:1c:55:63:33:90:9b:
|
||||
ed:ca:5a:12:4d:de:4b:06:c2:a2:92:b0:42:3d:31:
|
||||
af:a4:15:12:15:f8:8a:e9:88:8d:cf:fd:85:66:50:
|
||||
6f:11:f1:9f:48:f3:b5:ba:9d:86:68:24:a2:5d:a8:
|
||||
7c:54:42:fa:d8:b5:c5:f2:dd:0e:0f:d0:68:e4:54:
|
||||
7e:c5:b9:a0:9b:65:2d:77:f4:8f:b9:30:0a:d5:86:
|
||||
5c:ed:c9:7c:d1:da:9d:0d:63:50:ee:e5:1e:92:63:
|
||||
cc:a2:0c:e8:4a:96:02:4d:dc:8f:df:7c:8f:08:18:
|
||||
a8:30:88:d7:af:89:ad:fc:57:4b:10:f9:f1:cb:48:
|
||||
e8:b6:3b:c8:3f:fc:c2:d3:d1:4a:10:3c:1b:6b:64:
|
||||
dc:e5:65:1e:5b:b2:da:b1:e2:24:97:8f:ee:c0:4b:
|
||||
8e:18:83:7c:17:a6:3c:45:b3:60:06:23:f2:2f:18:
|
||||
13:9e:17:8a:c6:72:79:8c:4d:04:f3:9d:ea:e0:25:
|
||||
d3:33:8c:1e:11:47:63:1f:a5:45:3f:bd:85:b3:fe:
|
||||
a5:68:ee:48:b7:0c:a4:c9:7f:72:d0:75:66:9b:6a:
|
||||
f9:a0:50:f3:a8:59:6d:a3:dd:38:4f:70:2b:bb:ff:
|
||||
92:2e:71:ab:ef:e9:00:ed:0d:d1:b4:6f:f0:8e:b2:
|
||||
09:fb:4d:61:0d:d9:10:d5:54:11:cd:03:94:84:fd:
|
||||
a8:68:e4:45:6e:1e:6a:1e:2f:85:a1:6d:f5:b6:c0:
|
||||
f1:ee:f7:36:e9:fe:c2:f7:ad:cc:13:46:5b:88:42:
|
||||
f0:2d:1f:b5:0e:7e:b5:2b:e4:8d:ab:b9:87:30:6a:
|
||||
3d:12:f4:ad:f3:1c:ac:cc:1a:48:29:2a:96:7b:80:
|
||||
00:0b:6e:59:87:bf:a3:ca:70:99:1b:1c:fd:72:3d:
|
||||
b2:d3:94:4a:cf:55:75:be:1f:40:ec:55:35:48:2d:
|
||||
55:f0:00:da:3c:b0:60:ba:11:32:66:54:0b:be:06:
|
||||
a4:5e:b7:c9:59:bb:4d:f4:92:06:26:48:6e:c2:12:
|
||||
d4:7c:f0:20:b8:a2:e1:bc:6a:b6:19:0e:37:47:55:
|
||||
c9:f2:49:0d:96:75:a2:84:64:bf:34:fc:be:b2:41:
|
||||
e4:f5:88:eb:e1:b7:26:a5:e5:41:c2:20:0c:f6:e2:
|
||||
a8:a5:e7:76:54:a5:fb:4b:80:05:7d:18:85:7a:ba:
|
||||
bc:b7:ad:c0:2f:60:85:cc:15:12:1c:2f:0a:9e:f3:
|
||||
7c:40:cf:f4:3e:23:d2:95:ca:d0:06:58:52:f0:84:
|
||||
d8:0f:3d:eb:ff:12:68:94:79:8f:be:40:29:5f:98:
|
||||
c8:90:6c:05:2f:99:8c:2a:63:78:1f:23:b1:29:c5:
|
||||
e7:49:c9:b2:92:0f:53:0b:d5:71:28:17:c2:19:bf:
|
||||
60:bf:7c:87:a8:ab:c1:f4:0a:c1:b8:d2:68:ee:c1:
|
||||
ce:a7:13:13:17:6d:24:5d:a2:37:a6:d7:7d:48:8b:
|
||||
2b:74:2d:40:2e:ca:19:d5:b6:3e:6c:42:71:fa:cf:
|
||||
85:87:f9:de:80:73:8b:89:f4:70:f0:d8:d7:ff:40:
|
||||
41:9c:c7:15:6d:9b:6e:4c:b5:52:02:99:79:32:73:
|
||||
ca:26:a0:ac:31:6f:c4:b0:f5:da:bb:c2:1f:e0:9f:
|
||||
44:ba:25:f7:9f
|
||||
Exponent: 65537 (0x10001)
|
||||
Signature Algorithm: md5WithRSAEncryption
|
||||
08:75:dc:b9:3f:aa:b6:7e:81:7a:39:d1:ee:ed:44:b6:ce:1b:
|
||||
37:c4:4c:19:d0:66:e6:eb:b5:4f:2a:ef:95:58:64:21:55:01:
|
||||
12:30:ac:8a:95:d1:06:de:29:46:a4:f1:7d:7f:b0:1e:d2:4e:
|
||||
fb:f6:fa:9a:74:be:85:62:db:0b:82:90:58:62:c5:5f:f1:80:
|
||||
02:9f:c5:fb:f3:6b:b0:b4:3b:04:b1:e5:53:c2:d0:00:a1:1a:
|
||||
9d:65:60:6f:73:98:67:e0:9c:c8:12:94:79:59:bf:43:7b:f5:
|
||||
77:c8:8f:df:b1:cd:11:1c:01:19:99:c2:22:42:f7:41:ae:b4:
|
||||
b8:1a
|
||||
-----BEGIN CERTIFICATE-----
|
||||
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
|
||||
sc0RHAEZmcIiQvdBrrS4Gg==
|
||||
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
|
||||
/w8pMRr8gEuRqpL2WdJiKGG6lhMHLVFo
|
||||
-----END CERTIFICATE-----
|
||||
|
|
|
@ -1,99 +1,99 @@
|
|||
-----BEGIN RSA PRIVATE KEY-----
|
||||
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
|
||||
-----END RSA PRIVATE KEY-----
|
||||
|
|
118
mysql-test/suite/innodb/r/innodb_bug53756.result
Normal file
118
mysql-test/suite/innodb/r/innodb_bug53756.result
Normal file
|
@ -0,0 +1,118 @@
|
|||
DROP TABLE IF EXISTS bug_53756 ;
|
||||
CREATE TABLE bug_53756 (pk INT, c1 INT) ENGINE=InnoDB;
|
||||
ALTER TABLE bug_53756 ADD PRIMARY KEY (pk);
|
||||
INSERT INTO bug_53756 VALUES(1, 11), (2, 22), (3, 33), (4, 44);
|
||||
|
||||
# Select a less restrictive isolation level.
|
||||
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
COMMIT;
|
||||
|
||||
# Start a transaction in the default connection for isolation.
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
SELECT * FROM bug_53756;
|
||||
pk c1
|
||||
1 11
|
||||
2 22
|
||||
3 33
|
||||
4 44
|
||||
|
||||
# connection con1 deletes row 1
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
DELETE FROM bug_53756 WHERE pk=1;
|
||||
|
||||
# connection con2 deletes row 2
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
DELETE FROM bug_53756 WHERE pk=2;
|
||||
|
||||
# connection con3 updates row 3
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
UPDATE bug_53756 SET c1=77 WHERE pk=3;
|
||||
|
||||
# connection con4 updates row 4
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
UPDATE bug_53756 SET c1=88 WHERE pk=4;
|
||||
|
||||
# connection con5 inserts row 5
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
INSERT INTO bug_53756 VALUES(5, 55);
|
||||
|
||||
# connection con6 inserts row 6
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
@@tx_isolation
|
||||
READ-COMMITTED
|
||||
INSERT INTO bug_53756 VALUES(6, 66);
|
||||
|
||||
# connection con1 commits.
|
||||
COMMIT;
|
||||
|
||||
# connection con3 commits.
|
||||
COMMIT;
|
||||
|
||||
# connection con4 rolls back.
|
||||
ROLLBACK;
|
||||
|
||||
# connection con6 rolls back.
|
||||
ROLLBACK;
|
||||
|
||||
# The connections 2 and 5 stay open.
|
||||
|
||||
# connection default selects resulting data.
|
||||
# Delete of row 1 was committed.
|
||||
# Update of row 3 was committed.
|
||||
# Due to isolation level read committed, these should be included.
|
||||
# All other changes should not be included.
|
||||
SELECT * FROM bug_53756;
|
||||
pk c1
|
||||
2 22
|
||||
3 77
|
||||
4 44
|
||||
|
||||
# connection default
|
||||
#
|
||||
# Crash server.
|
||||
START TRANSACTION;
|
||||
INSERT INTO bug_53756 VALUES (666,666);
|
||||
SET SESSION debug="+d,crash_commit_before";
|
||||
COMMIT;
|
||||
ERROR HY000: Lost connection to MySQL server during query
|
||||
|
||||
#
|
||||
# disconnect con1, con2, con3, con4, con5, con6.
|
||||
#
|
||||
# Restart server.
|
||||
|
||||
#
|
||||
# Select recovered data.
|
||||
# Delete of row 1 was committed.
|
||||
# Update of row 3 was committed.
|
||||
# These should be included.
|
||||
# All other changes should not be included.
|
||||
# Delete of row 2 and insert of row 5 should be rolled back
|
||||
SELECT * FROM bug_53756;
|
||||
pk c1
|
||||
2 22
|
||||
3 77
|
||||
4 44
|
||||
|
||||
# Clean up.
|
||||
DROP TABLE bug_53756;
|
1
mysql-test/suite/innodb/t/innodb_bug53756-master.opt
Normal file
1
mysql-test/suite/innodb/t/innodb_bug53756-master.opt
Normal file
|
@ -0,0 +1 @@
|
|||
--skip-stack-trace --skip-core-file
|
184
mysql-test/suite/innodb/t/innodb_bug53756.test
Normal file
184
mysql-test/suite/innodb/t/innodb_bug53756.test
Normal file
|
@ -0,0 +1,184 @@
|
|||
# This is the test case for bug #53756. Alter table operation could
|
||||
# leave a deleted record for the temp table (later renamed to the altered
|
||||
# table) in the SYS_TABLES secondary index, we should ignore this row and
|
||||
# find the first non-deleted row for the specified table_id when load table
|
||||
# metadata in the function dict_load_table_on_id() during crash recovery.
|
||||
|
||||
#
|
||||
# innobackup needs to connect to the server. Not supported in embedded.
|
||||
--source include/not_embedded.inc
|
||||
#
|
||||
# This test case needs to crash the server. Needs a debug server.
|
||||
--source include/have_debug.inc
|
||||
#
|
||||
# Don't test this under valgrind, memory leaks will occur.
|
||||
--source include/not_valgrind.inc
|
||||
#
|
||||
# This test case needs InnoDB.
|
||||
--source include/have_innodb.inc
|
||||
|
||||
#
|
||||
# Precautionary clean up.
|
||||
#
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS bug_53756 ;
|
||||
--enable_warnings
|
||||
|
||||
#
|
||||
# Create test data.
|
||||
#
|
||||
CREATE TABLE bug_53756 (pk INT, c1 INT) ENGINE=InnoDB;
|
||||
ALTER TABLE bug_53756 ADD PRIMARY KEY (pk);
|
||||
INSERT INTO bug_53756 VALUES(1, 11), (2, 22), (3, 33), (4, 44);
|
||||
|
||||
--echo
|
||||
--echo # Select a less restrictive isolation level.
|
||||
# Don't use user variables. They won't survive server crash.
|
||||
--let $global_isolation= `SELECT @@global.tx_isolation`;
|
||||
--let $session_isolation= `SELECT @@session.tx_isolation`;
|
||||
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
COMMIT;
|
||||
|
||||
--echo
|
||||
--echo # Start a transaction in the default connection for isolation.
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
SELECT * FROM bug_53756;
|
||||
|
||||
--echo
|
||||
--echo # connection con1 deletes row 1
|
||||
--connect (con1,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
DELETE FROM bug_53756 WHERE pk=1;
|
||||
|
||||
--echo
|
||||
--echo # connection con2 deletes row 2
|
||||
--connect (con2,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
DELETE FROM bug_53756 WHERE pk=2;
|
||||
|
||||
--echo
|
||||
--echo # connection con3 updates row 3
|
||||
--connect (con3,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
UPDATE bug_53756 SET c1=77 WHERE pk=3;
|
||||
|
||||
--echo
|
||||
--echo # connection con4 updates row 4
|
||||
--connect (con4,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
UPDATE bug_53756 SET c1=88 WHERE pk=4;
|
||||
|
||||
--echo
|
||||
--echo # connection con5 inserts row 5
|
||||
--connect (con5,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
INSERT INTO bug_53756 VALUES(5, 55);
|
||||
|
||||
--echo
|
||||
--echo # connection con6 inserts row 6
|
||||
--connect (con6,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
SELECT @@tx_isolation;
|
||||
INSERT INTO bug_53756 VALUES(6, 66);
|
||||
|
||||
--echo
|
||||
--echo # connection con1 commits.
|
||||
--connection con1
|
||||
COMMIT;
|
||||
|
||||
--echo
|
||||
--echo # connection con3 commits.
|
||||
--connection con3
|
||||
COMMIT;
|
||||
|
||||
--echo
|
||||
--echo # connection con4 rolls back.
|
||||
--connection con4
|
||||
ROLLBACK;
|
||||
|
||||
--echo
|
||||
--echo # connection con6 rolls back.
|
||||
--connection con6
|
||||
ROLLBACK;
|
||||
|
||||
--echo
|
||||
--echo # The connections 2 and 5 stay open.
|
||||
|
||||
--echo
|
||||
--echo # connection default selects resulting data.
|
||||
--echo # Delete of row 1 was committed.
|
||||
--echo # Update of row 3 was committed.
|
||||
--echo # Due to isolation level read committed, these should be included.
|
||||
--echo # All other changes should not be included.
|
||||
--connection default
|
||||
SELECT * FROM bug_53756;
|
||||
|
||||
--echo
|
||||
--echo # connection default
|
||||
--connection default
|
||||
--echo #
|
||||
--echo # Crash server.
|
||||
#
|
||||
# Write file to make mysql-test-run.pl expect the "crash", but don't start
|
||||
# it until it's told to
|
||||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
#
|
||||
START TRANSACTION;
|
||||
INSERT INTO bug_53756 VALUES (666,666);
|
||||
#
|
||||
# Request a crash on next execution of commit.
|
||||
SET SESSION debug="+d,crash_commit_before";
|
||||
#
|
||||
# Execute the statement that causes the crash.
|
||||
--error 2013
|
||||
COMMIT;
|
||||
--echo
|
||||
--echo #
|
||||
--echo # disconnect con1, con2, con3, con4, con5, con6.
|
||||
--disconnect con1
|
||||
--disconnect con2
|
||||
--disconnect con3
|
||||
--disconnect con4
|
||||
--disconnect con5
|
||||
--disconnect con6
|
||||
--echo #
|
||||
--echo # Restart server.
|
||||
#
|
||||
# Write file to make mysql-test-run.pl start up the server again
|
||||
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
#
|
||||
# Turn on reconnect
|
||||
--enable_reconnect
|
||||
#
|
||||
# Call script that will poll the server waiting for it to be back online again
|
||||
--source include/wait_until_connected_again.inc
|
||||
#
|
||||
# Turn off reconnect again
|
||||
--disable_reconnect
|
||||
--echo
|
||||
|
||||
--echo #
|
||||
--echo # Select recovered data.
|
||||
--echo # Delete of row 1 was committed.
|
||||
--echo # Update of row 3 was committed.
|
||||
--echo # These should be included.
|
||||
--echo # All other changes should not be included.
|
||||
--echo # Delete of row 2 and insert of row 5 should be rolled back
|
||||
SELECT * FROM bug_53756;
|
||||
|
||||
--echo
|
||||
--echo # Clean up.
|
||||
DROP TABLE bug_53756;
|
||||
|
||||
--disable_query_log
|
||||
eval SET GLOBAL tx_isolation= '$global_isolation';
|
||||
eval SET SESSION tx_isolation= '$session_isolation';
|
||||
--enable_query_log
|
||||
|
|
@ -1,6 +1,8 @@
|
|||
-- source include/have_innodb_plugin.inc
|
||||
# embedded server ignores 'delayed', so skip this
|
||||
-- source include/not_embedded.inc
|
||||
# remove the next line after bug #55503 is fixed
|
||||
-- source include/not_valgrind.inc
|
||||
|
||||
let $innodb_file_format_check_orig=`select @@innodb_file_format_check`;
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
-- source include/have_innodb_plugin.inc
|
||||
# embedded server ignores 'delayed', so skip this
|
||||
-- source include/not_embedded.inc
|
||||
# remove the next line after bug #55503 is fixed
|
||||
-- source include/not_valgrind.inc
|
||||
|
||||
let $innodb_file_format_check_orig=`select @@innodb_file_format_check`;
|
||||
|
||||
|
|
57
mysql-test/suite/rpl/r/rpl_conditional_comments.result
Normal file
57
mysql-test/suite/rpl/r/rpl_conditional_comments.result
Normal file
|
@ -0,0 +1,57 @@
|
|||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
CREATE TABLE t1(c1 INT);
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query # # use `test`; CREATE TABLE t1(c1 INT)
|
||||
|
||||
# Case 1:
|
||||
# ------------------------------------------------------------------
|
||||
# In a statement, some CCs are applied while others are not. The CCs
|
||||
# which are not applied on master will be binlogged as common comments.
|
||||
/*!99999 --- */INSERT /*!INTO*/ /*!10000 t1 */ VALUES(10) /*!99999 ,(11)*/;
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query # # use `test`; /* 99999 --- */INSERT /*!INTO*/ /*!10000 t1 */ VALUES(10) /* 99999 ,(11)*/
|
||||
Comparing tables master:test.t1 and slave:test.t1
|
||||
|
||||
# Case 2:
|
||||
# -----------------------------------------------------------------
|
||||
# Verify whether it can be binlogged correctly when executing prepared
|
||||
# statement.
|
||||
PREPARE stmt FROM 'INSERT INTO /*!99999 blabla*/ t1 VALUES(60) /*!99999 ,(61)*/';
|
||||
EXECUTE stmt;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(c1 INT);
|
||||
EXECUTE stmt;
|
||||
Comparing tables master:test.t1 and slave:test.t1
|
||||
|
||||
SET @value=62;
|
||||
PREPARE stmt FROM 'INSERT INTO /*!99999 blabla */ t1 VALUES(?) /*!99999 ,(63)*/';
|
||||
EXECUTE stmt USING @value;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(c1 INT);
|
||||
EXECUTE stmt USING @value;
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO /* 99999 blabla*/ t1 VALUES(60) /* 99999 ,(61)*/
|
||||
master-bin.000001 # Query # # use `test`; DROP TABLE t1
|
||||
master-bin.000001 # Query # # use `test`; CREATE TABLE t1(c1 INT)
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO /* 99999 blabla*/ t1 VALUES(60) /* 99999 ,(61)*/
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO /* 99999 blabla */ t1 VALUES(62) /* 99999 ,(63)*/
|
||||
master-bin.000001 # Query # # use `test`; DROP TABLE t1
|
||||
master-bin.000001 # Query # # use `test`; CREATE TABLE t1(c1 INT)
|
||||
master-bin.000001 # Query # # use `test`; INSERT INTO /* 99999 blabla */ t1 VALUES(62) /* 99999 ,(63)*/
|
||||
Comparing tables master:test.t1 and slave:test.t1
|
||||
|
||||
# Case 3:
|
||||
# -----------------------------------------------------------------
|
||||
# Verify it can restore the '!', if the it is an uncomplete conditional
|
||||
# comments
|
||||
SELECT c1 FROM /*!99999 t1 WHEREN;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*!99999 t1 WHEREN' at line 1
|
||||
DROP TABLE t1;
|
|
@ -49,6 +49,14 @@ Slave_IO_Running = No (expect No)
|
|||
SELECT "Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master'" AS Last_IO_Error;
|
||||
Last_IO_Error
|
||||
Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master'
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
SET @max_allowed_packet_0= @@session.max_allowed_packet;
|
||||
SHOW BINLOG EVENTS;
|
||||
SET @max_allowed_packet_1= @@session.max_allowed_packet;
|
||||
SHOW BINLOG EVENTS;
|
||||
SET @max_allowed_packet_2= @@session.max_allowed_packet;
|
||||
==== clean up ====
|
||||
DROP TABLE t1;
|
||||
SET @@global.max_allowed_packet= 1024;
|
||||
|
|
74
mysql-test/suite/rpl/t/rpl_conditional_comments.test
Normal file
74
mysql-test/suite/rpl/t/rpl_conditional_comments.test
Normal file
|
@ -0,0 +1,74 @@
|
|||
###############################################################################
|
||||
# After the patch for BUG#49124:
|
||||
# - Use ' ' instead of '!' in the conditional comments which are not applied on
|
||||
# master. So they become common comments and will not be applied on slave.
|
||||
#
|
||||
# - Example:
|
||||
# 'INSERT INTO t1 VALUES (1) /*!10000, (2)*/ /*!99999 ,(3)*/
|
||||
# will be binlogged as
|
||||
# 'INSERT INTO t1 VALUES (1) /*!10000, (2)*/ /* 99999 ,(3)*/'.
|
||||
###############################################################################
|
||||
source include/master-slave.inc;
|
||||
source include/have_binlog_format_statement.inc;
|
||||
|
||||
CREATE TABLE t1(c1 INT);
|
||||
source include/show_binlog_events.inc;
|
||||
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
|
||||
|
||||
--echo
|
||||
--echo # Case 1:
|
||||
--echo # ------------------------------------------------------------------
|
||||
--echo # In a statement, some CCs are applied while others are not. The CCs
|
||||
--echo # which are not applied on master will be binlogged as common comments.
|
||||
|
||||
/*!99999 --- */INSERT /*!INTO*/ /*!10000 t1 */ VALUES(10) /*!99999 ,(11)*/;
|
||||
|
||||
source include/show_binlog_events.inc;
|
||||
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
|
||||
sync_slave_with_master;
|
||||
let $diff_table_1=master:test.t1;
|
||||
let $diff_table_2=slave:test.t1;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
--echo
|
||||
--echo # Case 2:
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # Verify whether it can be binlogged correctly when executing prepared
|
||||
--echo # statement.
|
||||
PREPARE stmt FROM 'INSERT INTO /*!99999 blabla*/ t1 VALUES(60) /*!99999 ,(61)*/';
|
||||
EXECUTE stmt;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(c1 INT);
|
||||
EXECUTE stmt;
|
||||
|
||||
sync_slave_with_master;
|
||||
let $diff_table_1=master:test.t1;
|
||||
let $diff_table_2=slave:test.t1;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
--echo
|
||||
SET @value=62;
|
||||
PREPARE stmt FROM 'INSERT INTO /*!99999 blabla */ t1 VALUES(?) /*!99999 ,(63)*/';
|
||||
EXECUTE stmt USING @value;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(c1 INT);
|
||||
EXECUTE stmt USING @value;
|
||||
|
||||
source include/show_binlog_events.inc;
|
||||
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
|
||||
|
||||
sync_slave_with_master;
|
||||
let $diff_table_1=master:test.t1;
|
||||
let $diff_table_2=slave:test.t1;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
--echo
|
||||
--echo # Case 3:
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # Verify it can restore the '!', if the it is an uncomplete conditional
|
||||
--echo # comments
|
||||
--error 1064
|
||||
SELECT c1 FROM /*!99999 t1 WHEREN;
|
||||
|
||||
DROP TABLE t1;
|
||||
source include/master-slave-end.inc;
|
|
@ -1,7 +1,12 @@
|
|||
# ==== Purpose ====
|
||||
#
|
||||
# Check replication protocol packet size handling
|
||||
# Bug#19402 SQL close to the size of the max_allowed_packet fails on slave
|
||||
#
|
||||
# ==== Related bugs ====
|
||||
# Bug#19402 SQL close to the size of the max_allowed_packet fails on slave
|
||||
# BUG#23755: Replicated event larger that max_allowed_packet infinitely re-transmits
|
||||
# BUG#42914: No LAST_IO_ERROR for max_allowed_packet errors
|
||||
# BUG#55322: SHOW BINLOG EVENTS increases @@SESSION.MAX_ALLOWED_PACKET
|
||||
|
||||
# max-out size db name
|
||||
source include/master-slave.inc;
|
||||
|
@ -119,6 +124,38 @@ let $slave_io_running= query_get_value(SHOW SLAVE STATUS, Slave_IO_Running, 1);
|
|||
let $last_io_error= query_get_value(SHOW SLAVE STATUS, Last_IO_Error, 1);
|
||||
eval SELECT "$last_io_error" AS Last_IO_Error;
|
||||
|
||||
# Remove the bad binlog and clear error status on slave.
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
--connection master
|
||||
RESET MASTER;
|
||||
|
||||
|
||||
#
|
||||
# BUG#55322: SHOW BINLOG EVENTS increases @@SESSION.MAX_ALLOWED_PACKET
|
||||
#
|
||||
# In BUG#55322, @@session.max_allowed_packet increased each time SHOW
|
||||
# BINLOG EVENTS was issued. To verify that this bug is fixed, we
|
||||
# execute SHOW BINLOG EVENTS twice and check that max_allowed_packet
|
||||
# never changes. We turn off the result log because we don't care
|
||||
# about the contents of the binlog.
|
||||
|
||||
--disable_result_log
|
||||
SET @max_allowed_packet_0= @@session.max_allowed_packet;
|
||||
SHOW BINLOG EVENTS;
|
||||
SET @max_allowed_packet_1= @@session.max_allowed_packet;
|
||||
SHOW BINLOG EVENTS;
|
||||
SET @max_allowed_packet_2= @@session.max_allowed_packet;
|
||||
--enable_result_log
|
||||
if (`SELECT NOT(@max_allowed_packet_0 = @max_allowed_packet_1 AND @max_allowed_packet_1 = @max_allowed_packet_2)`)
|
||||
{
|
||||
--echo ERROR: max_allowed_packet changed after executing SHOW BINLOG EVENTS
|
||||
--source include/show_rpl_debug_info.inc
|
||||
SELECT @max_allowed_packet_0, @max_allowed_packet_1, @max_allowed_packet_2;
|
||||
--die @max_allowed_packet changed after executing SHOW BINLOG EVENTS
|
||||
}
|
||||
|
||||
|
||||
--echo ==== clean up ====
|
||||
connection master;
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -1221,5 +1221,19 @@ DROP TABLE t1, t2;
|
|||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#55188: GROUP BY, GROUP_CONCAT and TEXT - inconsistent results
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a text, b varchar(10));
|
||||
INSERT INTO t1 VALUES (repeat('1', 1300),'one'), (repeat('1', 1300),'two');
|
||||
|
||||
query_vertical EXPLAIN
|
||||
SELECT SUBSTRING(a,1,10), LENGTH(a), GROUP_CONCAT(b) FROM t1 GROUP BY a;
|
||||
SELECT SUBSTRING(a,1,10), LENGTH(a), GROUP_CONCAT(b) FROM t1 GROUP BY a;
|
||||
query_vertical EXPLAIN
|
||||
SELECT SUBSTRING(a,1,10), LENGTH(a) FROM t1 GROUP BY a;
|
||||
SELECT SUBSTRING(a,1,10), LENGTH(a) FROM t1 GROUP BY a;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo # End of 5.1 tests
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
-- source include/not_embedded.inc
|
||||
|
||||
SET @old_general_log= @@global.general_log;
|
||||
SET @old_slow_query_log= @@global.slow_query_log;
|
||||
|
||||
# We run with different binaries for normal and --embedded-server
|
||||
#
|
||||
|
@ -17,3 +18,4 @@ SET @old_general_log= @@global.general_log;
|
|||
echo ok;
|
||||
|
||||
SET @@global.general_log= @old_general_log;
|
||||
SET @@global.slow_query_log= @old_slow_query_log;
|
||||
|
|
1
mysql-test/t/ssl_8k_key-master.opt
Normal file
1
mysql-test/t/ssl_8k_key-master.opt
Normal file
|
@ -0,0 +1 @@
|
|||
--loose-ssl-key=$MYSQL_TEST_DIR/std_data/server8k-key.pem --loose-ssl-cert=$MYSQL_TEST_DIR/std_data/server8k-cert.pem
|
|
@ -86,7 +86,9 @@ void my_print_stacktrace(uchar* stack_bottom __attribute__((unused)),
|
|||
|
||||
#if BACKTRACE_DEMANGLE
|
||||
|
||||
char __attribute__ ((weak)) *my_demangle(const char *mangled_name, int *status)
|
||||
char __attribute__ ((weak)) *
|
||||
my_demangle(const char *mangled_name __attribute__((unused)),
|
||||
int *status __attribute__((unused)))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -2740,6 +2740,7 @@ public:
|
|||
class Cached_item_str :public Cached_item
|
||||
{
|
||||
Item *item;
|
||||
uint32 value_max_length;
|
||||
String value,tmp_value;
|
||||
public:
|
||||
Cached_item_str(THD *thd, Item *arg);
|
||||
|
|
|
@ -58,7 +58,9 @@ Cached_item::~Cached_item() {}
|
|||
*/
|
||||
|
||||
Cached_item_str::Cached_item_str(THD *thd, Item *arg)
|
||||
:item(arg), value(min(arg->max_length, thd->variables.max_sort_length))
|
||||
:item(arg),
|
||||
value_max_length(min(arg->max_length, thd->variables.max_sort_length)),
|
||||
value(value_max_length)
|
||||
{}
|
||||
|
||||
bool Cached_item_str::cmp(void)
|
||||
|
@ -67,7 +69,7 @@ bool Cached_item_str::cmp(void)
|
|||
bool tmp;
|
||||
|
||||
if ((res=item->val_str(&tmp_value)))
|
||||
res->length(min(res->length(), value.alloced_length()));
|
||||
res->length(min(res->length(), value_max_length));
|
||||
if (null_value != item->null_value)
|
||||
{
|
||||
if ((null_value= item->null_value))
|
||||
|
|
|
@ -1024,7 +1024,7 @@ bool mysql_opt_change_db(THD *thd,
|
|||
bool force_switch,
|
||||
bool *cur_db_changed);
|
||||
|
||||
void mysql_parse(THD *thd, const char *inBuf, uint length,
|
||||
void mysql_parse(THD *thd, char *rawbuf, uint length,
|
||||
const char ** semicolon);
|
||||
|
||||
bool mysql_test_parse_for_slave(THD *thd,char *inBuf,uint length);
|
||||
|
|
|
@ -534,7 +534,11 @@ void Protocol::end_partial_result_set(THD *thd_arg)
|
|||
bool Protocol::flush()
|
||||
{
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
return net_flush(&thd->net);
|
||||
bool error;
|
||||
thd->main_da.can_overwrite_status= TRUE;
|
||||
error= net_flush(&thd->net);
|
||||
thd->main_da.can_overwrite_status= FALSE;
|
||||
return error;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
|
@ -574,7 +578,8 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
|
|||
if (flags & SEND_NUM_ROWS)
|
||||
{ // Packet with number of elements
|
||||
uchar *pos= net_store_length(buff, list->elements);
|
||||
(void) my_net_write(&thd->net, buff, (size_t) (pos-buff));
|
||||
if (my_net_write(&thd->net, buff, (size_t) (pos-buff)))
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
|
@ -698,7 +703,7 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
|
|||
if (flags & SEND_DEFAULTS)
|
||||
item->send(&prot, &tmp); // Send default value
|
||||
if (prot.write())
|
||||
break; /* purecov: inspected */
|
||||
DBUG_RETURN(1);
|
||||
#ifndef DBUG_OFF
|
||||
field_types[count++]= field.type;
|
||||
#endif
|
||||
|
@ -711,7 +716,9 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
|
|||
to show that there is no cursor.
|
||||
Send no warning information, as it will be sent at statement end.
|
||||
*/
|
||||
write_eof_packet(thd, &thd->net, thd->server_status, thd->total_warn_count);
|
||||
if (write_eof_packet(thd, &thd->net, thd->server_status,
|
||||
thd->total_warn_count))
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
DBUG_RETURN(prepare_for_send(list));
|
||||
|
||||
|
|
|
@ -1653,7 +1653,8 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
|
|||
|
||||
thd->limit_found_rows = query->found_rows();
|
||||
thd->status_var.last_query_cost= 0.0;
|
||||
thd->main_da.disable_status();
|
||||
if (!thd->main_da.is_set())
|
||||
thd->main_da.disable_status();
|
||||
|
||||
BLOCK_UNLOCK_RD(query_block);
|
||||
DBUG_RETURN(1); // Result sent to client
|
||||
|
|
|
@ -3391,9 +3391,13 @@ bool xid_cache_insert(XID *xid, enum xa_states xa_state)
|
|||
bool xid_cache_insert(XID_STATE *xid_state)
|
||||
{
|
||||
pthread_mutex_lock(&LOCK_xid_cache);
|
||||
DBUG_ASSERT(hash_search(&xid_cache, xid_state->xid.key(),
|
||||
xid_state->xid.key_length())==0);
|
||||
my_bool res=my_hash_insert(&xid_cache, (uchar*)xid_state);
|
||||
if (hash_search(&xid_cache, xid_state->xid.key(), xid_state->xid.key_length()))
|
||||
{
|
||||
pthread_mutex_unlock(&LOCK_xid_cache);
|
||||
my_error(ER_XAER_DUPID, MYF(0));
|
||||
return TRUE;
|
||||
}
|
||||
my_bool res= my_hash_insert(&xid_cache, (uchar*)xid_state);
|
||||
pthread_mutex_unlock(&LOCK_xid_cache);
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -658,7 +658,12 @@ void Materialized_cursor::fetch(ulong num_rows)
|
|||
if ((res= table->file->rnd_next(table->record[0])))
|
||||
break;
|
||||
/* Send data only if the read was successful. */
|
||||
result->send_data(item_list);
|
||||
/*
|
||||
If network write failed (i.e. due to a closed socked),
|
||||
the error has already been set. Just return.
|
||||
*/
|
||||
if (result->send_data(item_list))
|
||||
return;
|
||||
}
|
||||
|
||||
switch (res) {
|
||||
|
|
|
@ -111,7 +111,7 @@ st_parsing_options::reset()
|
|||
}
|
||||
|
||||
|
||||
bool Lex_input_stream::init(THD *thd, const char *buff, unsigned int length)
|
||||
bool Lex_input_stream::init(THD *thd, char *buff, unsigned int length)
|
||||
{
|
||||
DBUG_EXECUTE_IF("bug42064_simulate_oom",
|
||||
DBUG_SET("+d,simulate_out_of_memory"););
|
||||
|
@ -1292,11 +1292,10 @@ int MYSQLlex(void *arg, void *yythd)
|
|||
ulong version;
|
||||
version=strtol(version_str, NULL, 10);
|
||||
|
||||
/* Accept 'M' 'm' 'm' 'd' 'd' */
|
||||
lip->yySkipn(5);
|
||||
|
||||
if (version <= MYSQL_VERSION_ID)
|
||||
{
|
||||
/* Accept 'M' 'm' 'm' 'd' 'd' */
|
||||
lip->yySkipn(5);
|
||||
/* Expand the content of the special comment as real code */
|
||||
lip->set_echo(TRUE);
|
||||
state=MY_LEX_START;
|
||||
|
@ -1304,7 +1303,16 @@ int MYSQLlex(void *arg, void *yythd)
|
|||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Patch and skip the conditional comment to avoid it
|
||||
being propagated infinitely (eg. to a slave).
|
||||
*/
|
||||
char *pcom= lip->yyUnput(' ');
|
||||
comment_closed= ! consume_comment(lip, 1);
|
||||
if (! comment_closed)
|
||||
{
|
||||
*pcom= '!';
|
||||
}
|
||||
/* version allowed to have one level of comment inside. */
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1180,7 +1180,7 @@ public:
|
|||
@retval FALSE OK
|
||||
@retval TRUE Error
|
||||
*/
|
||||
bool init(THD *thd, const char *buff, unsigned int length);
|
||||
bool init(THD *thd, char *buff, unsigned int length);
|
||||
/**
|
||||
Set the echo mode.
|
||||
|
||||
|
@ -1294,6 +1294,20 @@ public:
|
|||
m_ptr += n;
|
||||
}
|
||||
|
||||
/**
|
||||
Puts a character back into the stream, canceling
|
||||
the effect of the last yyGet() or yySkip().
|
||||
Note that the echo mode should not change between calls
|
||||
to unput, get, or skip from the stream.
|
||||
*/
|
||||
char *yyUnput(char ch)
|
||||
{
|
||||
*--m_ptr= ch;
|
||||
if (m_echo)
|
||||
m_cpp_ptr--;
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
/**
|
||||
End of file indicator for the query text to parse.
|
||||
@return true if there are no more characters to parse
|
||||
|
@ -1440,7 +1454,7 @@ public:
|
|||
|
||||
private:
|
||||
/** Pointer to the current position in the raw input stream. */
|
||||
const char *m_ptr;
|
||||
char *m_ptr;
|
||||
|
||||
/** Starting position of the last token parsed, in the raw buffer. */
|
||||
const char *m_tok_start;
|
||||
|
@ -1972,7 +1986,7 @@ public:
|
|||
@retval FALSE OK
|
||||
@retval TRUE Error
|
||||
*/
|
||||
bool init(THD *thd, const char *buff, unsigned int length)
|
||||
bool init(THD *thd, char *buff, unsigned int length)
|
||||
{
|
||||
return m_lip.init(thd, buff, length);
|
||||
}
|
||||
|
|
|
@ -4735,7 +4735,7 @@ create_sp_error:
|
|||
my_error(ER_XAER_NOTA, MYF(0));
|
||||
break;
|
||||
}
|
||||
thd->transaction.xid_state.xa_state=XA_ACTIVE;
|
||||
thd->transaction.xid_state.xa_state= XA_ACTIVE;
|
||||
my_ok(thd);
|
||||
break;
|
||||
}
|
||||
|
@ -4755,16 +4755,16 @@ create_sp_error:
|
|||
my_error(ER_XAER_OUTSIDE, MYF(0));
|
||||
break;
|
||||
}
|
||||
if (xid_cache_search(thd->lex->xid))
|
||||
{
|
||||
my_error(ER_XAER_DUPID, MYF(0));
|
||||
break;
|
||||
}
|
||||
DBUG_ASSERT(thd->transaction.xid_state.xid.is_null());
|
||||
thd->transaction.xid_state.xa_state=XA_ACTIVE;
|
||||
thd->transaction.xid_state.xa_state= XA_ACTIVE;
|
||||
thd->transaction.xid_state.rm_error= 0;
|
||||
thd->transaction.xid_state.xid.set(thd->lex->xid);
|
||||
xid_cache_insert(&thd->transaction.xid_state);
|
||||
if (xid_cache_insert(&thd->transaction.xid_state))
|
||||
{
|
||||
thd->transaction.xid_state.xa_state= XA_NOTR;
|
||||
thd->transaction.xid_state.xid.null();
|
||||
break;
|
||||
}
|
||||
thd->transaction.all.modified_non_trans_table= FALSE;
|
||||
thd->options= ((thd->options & ~(OPTION_KEEP_LOG)) | OPTION_BEGIN);
|
||||
thd->server_status|= SERVER_STATUS_IN_TRANS;
|
||||
|
@ -4818,6 +4818,16 @@ create_sp_error:
|
|||
case SQLCOM_XA_COMMIT:
|
||||
if (!thd->transaction.xid_state.xid.eq(thd->lex->xid))
|
||||
{
|
||||
/*
|
||||
xid_state.in_thd is always true beside of xa recovery
|
||||
procedure. Note, that there is no race condition here
|
||||
between xid_cache_search and xid_cache_delete, since we're always
|
||||
deleting our own XID (thd->lex->xid == thd->transaction.xid_state.xid).
|
||||
The only case when thd->lex->xid != thd->transaction.xid_state.xid
|
||||
and xid_state->in_thd == 0 is in ha_recover() functionality,
|
||||
which is called before starting client connections, and thus is
|
||||
always single-threaded.
|
||||
*/
|
||||
XID_STATE *xs=xid_cache_search(thd->lex->xid);
|
||||
if (!xs || xs->in_thd)
|
||||
my_error(ER_XAER_NOTA, MYF(0));
|
||||
|
@ -5936,13 +5946,13 @@ void mysql_init_multi_delete(LEX *lex)
|
|||
Parse a query.
|
||||
|
||||
@param thd Current thread
|
||||
@param inBuf Begining of the query text
|
||||
@param rawbuf Begining of the query text
|
||||
@param length Length of the query text
|
||||
@param[out] found_semicolon For multi queries, position of the character of
|
||||
the next query in the query text.
|
||||
*/
|
||||
|
||||
void mysql_parse(THD *thd, const char *inBuf, uint length,
|
||||
void mysql_parse(THD *thd, char *rawbuf, uint length,
|
||||
const char ** found_semicolon)
|
||||
{
|
||||
DBUG_ENTER("mysql_parse");
|
||||
|
@ -5968,7 +5978,7 @@ void mysql_parse(THD *thd, const char *inBuf, uint length,
|
|||
lex_start(thd);
|
||||
mysql_reset_thd_for_next_command(thd);
|
||||
|
||||
if (query_cache_send_result_to_client(thd, (char*) inBuf, length) <= 0)
|
||||
if (query_cache_send_result_to_client(thd, rawbuf, length) <= 0)
|
||||
{
|
||||
LEX *lex= thd->lex;
|
||||
|
||||
|
@ -5977,7 +5987,7 @@ void mysql_parse(THD *thd, const char *inBuf, uint length,
|
|||
|
||||
Parser_state parser_state;
|
||||
bool err;
|
||||
if (!(err= parser_state.init(thd, inBuf, length)))
|
||||
if (!(err= parser_state.init(thd, rawbuf, length)))
|
||||
{
|
||||
err= parse_sql(thd, & parser_state, NULL);
|
||||
*found_semicolon= parser_state.m_lip.found_semicolon;
|
||||
|
@ -6063,14 +6073,14 @@ void mysql_parse(THD *thd, const char *inBuf, uint length,
|
|||
1 can be ignored
|
||||
*/
|
||||
|
||||
bool mysql_test_parse_for_slave(THD *thd, char *inBuf, uint length)
|
||||
bool mysql_test_parse_for_slave(THD *thd, char *rawbuf, uint length)
|
||||
{
|
||||
LEX *lex= thd->lex;
|
||||
bool error= 0;
|
||||
DBUG_ENTER("mysql_test_parse_for_slave");
|
||||
|
||||
Parser_state parser_state;
|
||||
if (!(error= parser_state.init(thd, inBuf, length)))
|
||||
if (!(error= parser_state.init(thd, rawbuf, length)))
|
||||
{
|
||||
lex_start(thd);
|
||||
mysql_reset_thd_for_next_command(thd);
|
||||
|
|
|
@ -3876,7 +3876,7 @@ void get_partition_set(const TABLE *table, uchar *buf, const uint index,
|
|||
*/
|
||||
|
||||
bool mysql_unpack_partition(THD *thd,
|
||||
const char *part_buf, uint part_info_len,
|
||||
char *part_buf, uint part_info_len,
|
||||
const char *part_state, uint part_state_len,
|
||||
TABLE* table, bool is_create_table_ind,
|
||||
handlerton *default_db_type,
|
||||
|
|
|
@ -78,7 +78,7 @@ void get_full_part_id_from_key(const TABLE *table, uchar *buf,
|
|||
KEY *key_info,
|
||||
const key_range *key_spec,
|
||||
part_id_range *part_spec);
|
||||
bool mysql_unpack_partition(THD *thd, const char *part_buf,
|
||||
bool mysql_unpack_partition(THD *thd, char *part_buf,
|
||||
uint part_info_len,
|
||||
const char *part_state, uint part_state_len,
|
||||
TABLE *table, bool is_create_table_ind,
|
||||
|
|
|
@ -263,8 +263,11 @@ static bool send_prep_stmt(Prepared_statement *stmt, uint columns)
|
|||
&stmt->lex->param_list,
|
||||
Protocol::SEND_EOF);
|
||||
}
|
||||
/* Flag that a response has already been sent */
|
||||
thd->main_da.disable_status();
|
||||
|
||||
if (!error)
|
||||
/* Flag that a response has already been sent */
|
||||
thd->main_da.disable_status();
|
||||
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
#else
|
||||
|
@ -790,7 +793,7 @@ static bool insert_params_with_log(Prepared_statement *stmt, uchar *null_array,
|
|||
type (the types are supplied at execute). Check that the
|
||||
supplied type of placeholder can accept a data stream.
|
||||
*/
|
||||
else if (!is_param_long_data_type(param))
|
||||
else if (! is_param_long_data_type(param))
|
||||
DBUG_RETURN(1);
|
||||
res= param->query_val_str(&str);
|
||||
if (param->convert_str_value(thd))
|
||||
|
@ -836,7 +839,7 @@ static bool insert_params(Prepared_statement *stmt, uchar *null_array,
|
|||
type (the types are supplied at execute). Check that the
|
||||
supplied type of placeholder can accept a data stream.
|
||||
*/
|
||||
else if (is_param_long_data_type(param))
|
||||
else if (! is_param_long_data_type(param))
|
||||
DBUG_RETURN(1);
|
||||
if (param->convert_str_value(stmt->thd))
|
||||
DBUG_RETURN(1); /* out of memory */
|
||||
|
|
|
@ -356,6 +356,7 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos,
|
|||
#ifndef DBUG_OFF
|
||||
int left_events = max_binlog_dump_events;
|
||||
#endif
|
||||
int old_max_allowed_packet= thd->variables.max_allowed_packet;
|
||||
DBUG_ENTER("mysql_binlog_send");
|
||||
DBUG_PRINT("enter",("log_ident: '%s' pos: %ld", log_ident, (long) pos));
|
||||
|
||||
|
@ -761,6 +762,7 @@ end:
|
|||
pthread_mutex_lock(&LOCK_thread_count);
|
||||
thd->current_linfo = 0;
|
||||
pthread_mutex_unlock(&LOCK_thread_count);
|
||||
thd->variables.max_allowed_packet= old_max_allowed_packet;
|
||||
DBUG_VOID_RETURN;
|
||||
|
||||
err:
|
||||
|
@ -778,6 +780,7 @@ err:
|
|||
pthread_mutex_unlock(&LOCK_thread_count);
|
||||
if (file >= 0)
|
||||
(void) my_close(file, MYF(MY_WME));
|
||||
thd->variables.max_allowed_packet= old_max_allowed_packet;
|
||||
|
||||
my_message(my_errno, errmsg, MYF(0));
|
||||
DBUG_VOID_RETURN;
|
||||
|
@ -1418,6 +1421,7 @@ bool mysql_show_binlog_events(THD* thd)
|
|||
bool ret = TRUE;
|
||||
IO_CACHE log;
|
||||
File file = -1;
|
||||
int old_max_allowed_packet= thd->variables.max_allowed_packet;
|
||||
DBUG_ENTER("mysql_show_binlog_events");
|
||||
|
||||
Log_event::init_show_field_list(&field_list);
|
||||
|
@ -1556,6 +1560,7 @@ err:
|
|||
pthread_mutex_lock(&LOCK_thread_count);
|
||||
thd->current_linfo = 0;
|
||||
pthread_mutex_unlock(&LOCK_thread_count);
|
||||
thd->variables.max_allowed_packet= old_max_allowed_packet;
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
|
||||
/* Copyright 2000, 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
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
|
||||
|
@ -9,9 +9,9 @@
|
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
|
||||
|
||||
|
||||
/* Function with list databases, tables or fields */
|
||||
|
@ -2997,7 +2997,7 @@ make_table_name_list(THD *thd, List<LEX_STRING> *table_names, LEX *lex,
|
|||
*/
|
||||
if (res == FIND_FILES_DIR)
|
||||
{
|
||||
if (lex->sql_command != SQLCOM_SELECT)
|
||||
if (sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND)
|
||||
return 1;
|
||||
thd->clear_error();
|
||||
return 2;
|
||||
|
|
|
@ -441,7 +441,7 @@ typedef struct st_table_share
|
|||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
/** @todo: Move into *ha_data for partitioning */
|
||||
bool auto_partitioned;
|
||||
const char *partition_info;
|
||||
char *partition_info;
|
||||
uint partition_info_len;
|
||||
uint partition_info_buffer_size;
|
||||
const char *part_state;
|
||||
|
|
|
@ -927,6 +927,8 @@ dict_load_table_on_id(
|
|||
|
||||
ut_ad(mutex_own(&(dict_sys->mutex)));
|
||||
|
||||
table = NULL;
|
||||
|
||||
/* NOTE that the operation of this function is protected by
|
||||
the dictionary mutex, and therefore no deadlocks can occur
|
||||
with other dictionary operations. */
|
||||
|
@ -953,15 +955,17 @@ dict_load_table_on_id(
|
|||
BTR_SEARCH_LEAF, &pcur, &mtr);
|
||||
rec = btr_pcur_get_rec(&pcur);
|
||||
|
||||
if (!btr_pcur_is_on_user_rec(&pcur, &mtr)
|
||||
|| rec_get_deleted_flag(rec, 0)) {
|
||||
if (!btr_pcur_is_on_user_rec(&pcur, &mtr)) {
|
||||
/* Not found */
|
||||
goto func_exit;
|
||||
}
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
mem_heap_free(heap);
|
||||
|
||||
return(NULL);
|
||||
/* Find the first record that is not delete marked */
|
||||
while (rec_get_deleted_flag(rec, 0)) {
|
||||
if (!btr_pcur_move_to_next_user_rec(&pcur, &mtr)) {
|
||||
goto func_exit;
|
||||
}
|
||||
rec = btr_pcur_get_rec(&pcur);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------*/
|
||||
|
@ -974,19 +978,14 @@ dict_load_table_on_id(
|
|||
|
||||
/* Check if the table id in record is the one searched for */
|
||||
if (ut_dulint_cmp(table_id, mach_read_from_8(field)) != 0) {
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
mem_heap_free(heap);
|
||||
|
||||
return(NULL);
|
||||
goto func_exit;
|
||||
}
|
||||
|
||||
/* Now we get the table name from the record */
|
||||
field = rec_get_nth_field_old(rec, 1, &len);
|
||||
/* Load the table definition to memory */
|
||||
table = dict_load_table(mem_heap_strdupl(heap, (char*) field, len));
|
||||
|
||||
func_exit:
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
mem_heap_free(heap);
|
||||
|
|
|
@ -1,3 +1,27 @@
|
|||
2010-07-27 The InnoDB Team
|
||||
|
||||
* include/mem0pool.h, mem/mem0mem.c, mem/mem0pool.c, srv/srv0start.c:
|
||||
Fix Bug#55581 shutdown with innodb-use-sys-malloc=0: assert
|
||||
mutex->magic_n == MUTEX_MAGIC_N.
|
||||
|
||||
2010-06-30 The InnoDB Team
|
||||
|
||||
* btr/btr0sea.c, ha/ha0ha.c, handler/ha_innodb.cc, include/btr0sea.h:
|
||||
Fix Bug#54311 Crash on CHECK PARTITION after concurrent LOAD DATA
|
||||
and adaptive_hash_index=OFF
|
||||
|
||||
2010-06-29 The InnoDB Team
|
||||
* row/row0row.c, row/row0undo.c, row/row0upd.c:
|
||||
Fix Bug#54408 txn rollback after recovery: row0umod.c:673
|
||||
dict_table_get_format(index->table)
|
||||
|
||||
2010-06-29 The InnoDB Team
|
||||
|
||||
* btr/btr0cur.c, include/btr0cur.h,
|
||||
include/row0mysql.h, row/row0merge.c, row/row0sel.c:
|
||||
Fix Bug#54358 READ UNCOMMITTED access failure of off-page DYNAMIC
|
||||
or COMPRESSED columns
|
||||
|
||||
2010-06-24 The InnoDB Team
|
||||
|
||||
* handler/ha_innodb.cc:
|
||||
|
|
|
@ -4814,7 +4814,7 @@ btr_copy_externally_stored_field(
|
|||
|
||||
/*******************************************************************//**
|
||||
Copies an externally stored field of a record to mem heap.
|
||||
@return the field copied to heap */
|
||||
@return the field copied to heap, or NULL if the field is incomplete */
|
||||
UNIV_INTERN
|
||||
byte*
|
||||
btr_rec_copy_externally_stored_field(
|
||||
|
@ -4844,6 +4844,18 @@ btr_rec_copy_externally_stored_field(
|
|||
|
||||
data = rec_get_nth_field(rec, offsets, no, &local_len);
|
||||
|
||||
ut_a(local_len >= BTR_EXTERN_FIELD_REF_SIZE);
|
||||
|
||||
if (UNIV_UNLIKELY
|
||||
(!memcmp(data + local_len - BTR_EXTERN_FIELD_REF_SIZE,
|
||||
field_ref_zero, BTR_EXTERN_FIELD_REF_SIZE))) {
|
||||
/* The externally stored field was not written yet.
|
||||
This record should only be seen by
|
||||
recv_recovery_rollback_active() or any
|
||||
TRX_ISO_READ_UNCOMMITTED transactions. */
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
return(btr_copy_externally_stored_field(len, data,
|
||||
zip_size, local_len, heap));
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ Created 2/17/1996 Heikki Tuuri
|
|||
/** Flag: has the search system been enabled?
|
||||
Protected by btr_search_latch and btr_search_enabled_mutex. */
|
||||
UNIV_INTERN char btr_search_enabled = TRUE;
|
||||
UNIV_INTERN ibool btr_search_fully_disabled = FALSE;
|
||||
|
||||
/** Mutex protecting btr_search_enabled */
|
||||
static mutex_t btr_search_enabled_mutex;
|
||||
|
@ -201,12 +202,19 @@ btr_search_disable(void)
|
|||
mutex_enter(&btr_search_enabled_mutex);
|
||||
rw_lock_x_lock(&btr_search_latch);
|
||||
|
||||
/* Disable access to hash index, also tell ha_insert_for_fold()
|
||||
stop adding new nodes to hash index, but still allow updating
|
||||
existing nodes */
|
||||
btr_search_enabled = FALSE;
|
||||
|
||||
/* Clear all block->is_hashed flags and remove all entries
|
||||
from btr_search_sys->hash_index. */
|
||||
buf_pool_drop_hash_index();
|
||||
|
||||
/* hash index has been cleaned up, disallow any operation to
|
||||
the hash index */
|
||||
btr_search_fully_disabled = TRUE;
|
||||
|
||||
/* btr_search_enabled_mutex should guarantee this. */
|
||||
ut_ad(!btr_search_enabled);
|
||||
|
||||
|
@ -225,6 +233,7 @@ btr_search_enable(void)
|
|||
rw_lock_x_lock(&btr_search_latch);
|
||||
|
||||
btr_search_enabled = TRUE;
|
||||
btr_search_fully_disabled = FALSE;
|
||||
|
||||
rw_lock_x_unlock(&btr_search_latch);
|
||||
mutex_exit(&btr_search_enabled_mutex);
|
||||
|
@ -1363,7 +1372,7 @@ btr_search_build_page_hash_index(
|
|||
|
||||
rw_lock_x_lock(&btr_search_latch);
|
||||
|
||||
if (UNIV_UNLIKELY(!btr_search_enabled)) {
|
||||
if (UNIV_UNLIKELY(btr_search_fully_disabled)) {
|
||||
goto exit_func;
|
||||
}
|
||||
|
||||
|
|
|
@ -31,9 +31,7 @@ Created 8/22/1994 Heikki Tuuri
|
|||
#ifdef UNIV_DEBUG
|
||||
# include "buf0buf.h"
|
||||
#endif /* UNIV_DEBUG */
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
# include "btr0sea.h"
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
#include "btr0sea.h"
|
||||
#include "page0page.h"
|
||||
|
||||
/*************************************************************//**
|
||||
|
@ -127,7 +125,8 @@ ha_clear(
|
|||
/*************************************************************//**
|
||||
Inserts an entry into a hash table. If an entry with the same fold number
|
||||
is found, its node is updated to point to the new data, and no new node
|
||||
is inserted.
|
||||
is inserted. If btr_search_enabled is set to FALSE, we will only allow
|
||||
updating existing nodes, but no new node is allowed to be added.
|
||||
@return TRUE if succeed, FALSE if no more memory could be allocated */
|
||||
UNIV_INTERN
|
||||
ibool
|
||||
|
@ -174,6 +173,7 @@ ha_insert_for_fold_func(
|
|||
prev_block->n_pointers--;
|
||||
block->n_pointers++;
|
||||
}
|
||||
ut_ad(!btr_search_fully_disabled);
|
||||
# endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
prev_node->block = block;
|
||||
|
@ -186,6 +186,13 @@ ha_insert_for_fold_func(
|
|||
prev_node = prev_node->next;
|
||||
}
|
||||
|
||||
/* We are in the process of disabling hash index, do not add
|
||||
new chain node */
|
||||
if (!btr_search_enabled) {
|
||||
ut_ad(!btr_search_fully_disabled);
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
/* We have to allocate a new chain node */
|
||||
|
||||
node = mem_heap_alloc(hash_get_heap(table, fold), sizeof(ha_node_t));
|
||||
|
|
|
@ -2270,6 +2270,7 @@ innobase_change_buffering_inited_ok:
|
|||
/* Get the current high water mark format. */
|
||||
innobase_file_format_check = (char*) trx_sys_file_format_max_get();
|
||||
|
||||
btr_search_fully_disabled = (!btr_search_enabled);
|
||||
DBUG_RETURN(FALSE);
|
||||
error:
|
||||
DBUG_RETURN(TRUE);
|
||||
|
|
|
@ -570,7 +570,7 @@ btr_copy_externally_stored_field_prefix(
|
|||
ulint local_len);/*!< in: length of data, in bytes */
|
||||
/*******************************************************************//**
|
||||
Copies an externally stored field of a record to mem heap.
|
||||
@return the field copied to heap */
|
||||
@return the field copied to heap, or NULL if the field is incomplete */
|
||||
UNIV_INTERN
|
||||
byte*
|
||||
btr_rec_copy_externally_stored_field(
|
||||
|
|
|
@ -190,7 +190,13 @@ btr_search_validate(void);
|
|||
|
||||
/** Flag: has the search system been enabled?
|
||||
Protected by btr_search_latch and btr_search_enabled_mutex. */
|
||||
extern char btr_search_enabled;
|
||||
extern char btr_search_enabled;
|
||||
|
||||
/** Flag: whether the search system has completed its disabling process,
|
||||
It is set to TRUE right after buf_pool_drop_hash_index() in
|
||||
btr_search_disable(), indicating hash index entries are cleaned up.
|
||||
Protected by btr_search_latch and btr_search_enabled_mutex. */
|
||||
extern ibool btr_search_fully_disabled;
|
||||
|
||||
/** The search info struct in an index */
|
||||
struct btr_search_struct{
|
||||
|
|
|
@ -100,18 +100,6 @@ mem_pool_get_reserved(
|
|||
/*==================*/
|
||||
mem_pool_t* pool); /*!< in: memory pool */
|
||||
/********************************************************************//**
|
||||
Reserves the mem pool mutex. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
mem_pool_mutex_enter(void);
|
||||
/*======================*/
|
||||
/********************************************************************//**
|
||||
Releases the mem pool mutex. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
mem_pool_mutex_exit(void);
|
||||
/*=====================*/
|
||||
/********************************************************************//**
|
||||
Validates a memory pool.
|
||||
@return TRUE if ok */
|
||||
UNIV_INTERN
|
||||
|
|
|
@ -622,7 +622,11 @@ struct row_prebuilt_struct {
|
|||
the secondary index, then this is
|
||||
set to TRUE */
|
||||
unsigned templ_contains_blob:1;/*!< TRUE if the template contains
|
||||
BLOB column(s) */
|
||||
a column with DATA_BLOB ==
|
||||
get_innobase_type_from_mysql_type();
|
||||
not to be confused with InnoDB
|
||||
externally stored columns
|
||||
(VARCHAR can be off-page too) */
|
||||
mysql_row_templ_t* mysql_template;/*!< template used to transform
|
||||
rows fast between MySQL and Innobase
|
||||
formats; memory for this template
|
||||
|
|
|
@ -46,7 +46,7 @@ Created 1/20/1994 Heikki Tuuri
|
|||
|
||||
#define INNODB_VERSION_MAJOR 1
|
||||
#define INNODB_VERSION_MINOR 0
|
||||
#define INNODB_VERSION_BUGFIX 10
|
||||
#define INNODB_VERSION_BUGFIX 11
|
||||
|
||||
/* The following is the InnoDB version as shown in
|
||||
SELECT plugin_version FROM information_schema.plugins;
|
||||
|
|
|
@ -367,7 +367,7 @@ mem_heap_create_block(
|
|||
block->line = line;
|
||||
|
||||
#ifdef MEM_PERIODIC_CHECK
|
||||
mem_pool_mutex_enter();
|
||||
mutex_enter(&(mem_comm_pool->mutex));
|
||||
|
||||
if (!mem_block_list_inited) {
|
||||
mem_block_list_inited = TRUE;
|
||||
|
@ -376,7 +376,7 @@ mem_heap_create_block(
|
|||
|
||||
UT_LIST_ADD_LAST(mem_block_list, mem_block_list, block);
|
||||
|
||||
mem_pool_mutex_exit();
|
||||
mutex_exit(&(mem_comm_pool->mutex));
|
||||
#endif
|
||||
mem_block_set_len(block, len);
|
||||
mem_block_set_type(block, type);
|
||||
|
@ -479,11 +479,11 @@ mem_heap_block_free(
|
|||
UT_LIST_REMOVE(list, heap->base, block);
|
||||
|
||||
#ifdef MEM_PERIODIC_CHECK
|
||||
mem_pool_mutex_enter();
|
||||
mutex_enter(&(mem_comm_pool->mutex));
|
||||
|
||||
UT_LIST_REMOVE(mem_block_list, mem_block_list, block);
|
||||
|
||||
mem_pool_mutex_exit();
|
||||
mutex_exit(&(mem_comm_pool->mutex));
|
||||
#endif
|
||||
|
||||
ut_ad(heap->total_size >= block->len);
|
||||
|
@ -556,7 +556,7 @@ mem_validate_all_blocks(void)
|
|||
{
|
||||
mem_block_t* block;
|
||||
|
||||
mem_pool_mutex_enter();
|
||||
mutex_enter(&(mem_comm_pool->mutex));
|
||||
|
||||
block = UT_LIST_GET_FIRST(mem_block_list);
|
||||
|
||||
|
@ -568,6 +568,6 @@ mem_validate_all_blocks(void)
|
|||
block = UT_LIST_GET_NEXT(mem_block_list, block);
|
||||
}
|
||||
|
||||
mem_pool_mutex_exit();
|
||||
mutex_exit(&(mem_comm_pool->mutex));
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -34,6 +34,7 @@ Created 5/12/1997 Heikki Tuuri
|
|||
#include "ut0lst.h"
|
||||
#include "ut0byte.h"
|
||||
#include "mem0mem.h"
|
||||
#include "srv0start.h"
|
||||
|
||||
/* We would like to use also the buffer frames to allocate memory. This
|
||||
would be desirable, because then the memory consumption of the database
|
||||
|
@ -121,23 +122,33 @@ mysql@lists.mysql.com */
|
|||
UNIV_INTERN ulint mem_n_threads_inside = 0;
|
||||
|
||||
/********************************************************************//**
|
||||
Reserves the mem pool mutex. */
|
||||
UNIV_INTERN
|
||||
Reserves the mem pool mutex if we are not in server shutdown. Use
|
||||
this function only in memory free functions, since only memory
|
||||
free functions are used during server shutdown. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
mem_pool_mutex_enter(void)
|
||||
/*======================*/
|
||||
mem_pool_mutex_enter(
|
||||
/*=================*/
|
||||
mem_pool_t* pool) /*!< in: memory pool */
|
||||
{
|
||||
mutex_enter(&(mem_comm_pool->mutex));
|
||||
if (srv_shutdown_state < SRV_SHUTDOWN_EXIT_THREADS) {
|
||||
mutex_enter(&(pool->mutex));
|
||||
}
|
||||
}
|
||||
|
||||
/********************************************************************//**
|
||||
Releases the mem pool mutex. */
|
||||
UNIV_INTERN
|
||||
Releases the mem pool mutex if we are not in server shutdown. As
|
||||
its corresponding mem_pool_mutex_enter() function, use it only
|
||||
in memory free functions */
|
||||
UNIV_INLINE
|
||||
void
|
||||
mem_pool_mutex_exit(void)
|
||||
/*=====================*/
|
||||
mem_pool_mutex_exit(
|
||||
/*================*/
|
||||
mem_pool_t* pool) /*!< in: memory pool */
|
||||
{
|
||||
mutex_exit(&(mem_comm_pool->mutex));
|
||||
if (srv_shutdown_state < SRV_SHUTDOWN_EXIT_THREADS) {
|
||||
mutex_exit(&(pool->mutex));
|
||||
}
|
||||
}
|
||||
|
||||
/********************************************************************//**
|
||||
|
@ -567,7 +578,7 @@ mem_area_free(
|
|||
|
||||
n = ut_2_log(size);
|
||||
|
||||
mutex_enter(&(pool->mutex));
|
||||
mem_pool_mutex_enter(pool);
|
||||
mem_n_threads_inside++;
|
||||
|
||||
ut_a(mem_n_threads_inside == 1);
|
||||
|
@ -595,7 +606,7 @@ mem_area_free(
|
|||
pool->reserved += ut_2_exp(n);
|
||||
|
||||
mem_n_threads_inside--;
|
||||
mutex_exit(&(pool->mutex));
|
||||
mem_pool_mutex_exit(pool);
|
||||
|
||||
mem_area_free(new_ptr, pool);
|
||||
|
||||
|
@ -611,7 +622,7 @@ mem_area_free(
|
|||
}
|
||||
|
||||
mem_n_threads_inside--;
|
||||
mutex_exit(&(pool->mutex));
|
||||
mem_pool_mutex_exit(pool);
|
||||
|
||||
ut_ad(mem_pool_validate(pool));
|
||||
}
|
||||
|
@ -630,7 +641,7 @@ mem_pool_validate(
|
|||
ulint free;
|
||||
ulint i;
|
||||
|
||||
mutex_enter(&(pool->mutex));
|
||||
mem_pool_mutex_enter(pool);
|
||||
|
||||
free = 0;
|
||||
|
||||
|
@ -658,7 +669,7 @@ mem_pool_validate(
|
|||
|
||||
ut_a(free + pool->reserved == pool->size);
|
||||
|
||||
mutex_exit(&(pool->mutex));
|
||||
mem_pool_mutex_exit(pool);
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
|
|
@ -1780,6 +1780,11 @@ row_merge_copy_blobs(
|
|||
(below). */
|
||||
data = btr_rec_copy_externally_stored_field(
|
||||
mrec, offsets, zip_size, i, &len, heap);
|
||||
/* Because we have locked the table, any records
|
||||
written by incomplete transactions must have been
|
||||
rolled back already. There must not be any incomplete
|
||||
BLOB columns. */
|
||||
ut_a(data);
|
||||
|
||||
dfield_set_data(field, data, len);
|
||||
}
|
||||
|
|
|
@ -294,7 +294,13 @@ row_build(
|
|||
|
||||
ut_ad(dtuple_check_typed(row));
|
||||
|
||||
if (j) {
|
||||
if (!ext) {
|
||||
/* REDUNDANT and COMPACT formats store a local
|
||||
768-byte prefix of each externally stored
|
||||
column. No cache is needed. */
|
||||
ut_ad(dict_table_get_format(index->table)
|
||||
< DICT_TF_FORMAT_ZIP);
|
||||
} else if (j) {
|
||||
*ext = row_ext_create(j, ext_cols, row,
|
||||
dict_table_zip_size(index->table),
|
||||
heap);
|
||||
|
|
|
@ -416,7 +416,7 @@ row_sel_fetch_columns(
|
|||
field_no))) {
|
||||
|
||||
/* Copy an externally stored field to the
|
||||
temporary heap */
|
||||
temporary heap, if possible. */
|
||||
|
||||
heap = mem_heap_create(1);
|
||||
|
||||
|
@ -425,6 +425,17 @@ row_sel_fetch_columns(
|
|||
dict_table_zip_size(index->table),
|
||||
field_no, &len, heap);
|
||||
|
||||
/* data == NULL means that the
|
||||
externally stored field was not
|
||||
written yet. This record
|
||||
should only be seen by
|
||||
recv_recovery_rollback_active() or any
|
||||
TRX_ISO_READ_UNCOMMITTED
|
||||
transactions. The InnoDB SQL parser
|
||||
(the sole caller of this function)
|
||||
does not implement READ UNCOMMITTED,
|
||||
and it is not involved during rollback. */
|
||||
ut_a(data);
|
||||
ut_a(len != UNIV_SQL_NULL);
|
||||
|
||||
needs_copy = TRUE;
|
||||
|
@ -926,6 +937,7 @@ row_sel_get_clust_rec(
|
|||
when plan->clust_pcur was positioned. The latch will not be
|
||||
released until mtr_commit(mtr). */
|
||||
|
||||
ut_ad(!rec_get_deleted_flag(clust_rec, rec_offs_comp(offsets)));
|
||||
row_sel_fetch_columns(index, clust_rec, offsets,
|
||||
UT_LIST_GET_FIRST(plan->columns));
|
||||
*out_rec = clust_rec;
|
||||
|
@ -1628,6 +1640,13 @@ skip_lock:
|
|||
}
|
||||
|
||||
if (old_vers == NULL) {
|
||||
/* The record does not exist
|
||||
in our read view. Skip it, but
|
||||
first attempt to determine
|
||||
whether the index segment we
|
||||
are searching through has been
|
||||
exhausted. */
|
||||
|
||||
offsets = rec_get_offsets(
|
||||
rec, index, offsets,
|
||||
ULINT_UNDEFINED, &heap);
|
||||
|
@ -2647,9 +2666,8 @@ Convert a row in the Innobase format to a row in the MySQL format.
|
|||
Note that the template in prebuilt may advise us to copy only a few
|
||||
columns to mysql_rec, other columns are left blank. All columns may not
|
||||
be needed in the query.
|
||||
@return TRUE if success, FALSE if could not allocate memory for a BLOB
|
||||
(though we may also assert in that case) */
|
||||
static
|
||||
@return TRUE on success, FALSE if not all columns could be retrieved */
|
||||
static __attribute__((warn_unused_result))
|
||||
ibool
|
||||
row_sel_store_mysql_rec(
|
||||
/*====================*/
|
||||
|
@ -2672,6 +2690,7 @@ row_sel_store_mysql_rec(
|
|||
ut_ad(prebuilt->mysql_template);
|
||||
ut_ad(prebuilt->default_rec);
|
||||
ut_ad(rec_offs_validate(rec, NULL, offsets));
|
||||
ut_ad(!rec_get_deleted_flag(rec, rec_offs_comp(offsets)));
|
||||
|
||||
if (UNIV_LIKELY_NULL(prebuilt->blob_heap)) {
|
||||
mem_heap_free(prebuilt->blob_heap);
|
||||
|
@ -2719,6 +2738,21 @@ row_sel_store_mysql_rec(
|
|||
dict_table_zip_size(prebuilt->table),
|
||||
templ->rec_field_no, &len, heap);
|
||||
|
||||
if (UNIV_UNLIKELY(!data)) {
|
||||
/* The externally stored field
|
||||
was not written yet. This
|
||||
record should only be seen by
|
||||
recv_recovery_rollback_active()
|
||||
or any TRX_ISO_READ_UNCOMMITTED
|
||||
transactions. */
|
||||
|
||||
if (extern_field_heap) {
|
||||
mem_heap_free(extern_field_heap);
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
ut_a(len != UNIV_SQL_NULL);
|
||||
} else {
|
||||
/* Field is stored in the row. */
|
||||
|
@ -3136,9 +3170,10 @@ row_sel_pop_cached_row_for_mysql(
|
|||
}
|
||||
|
||||
/********************************************************************//**
|
||||
Pushes a row for MySQL to the fetch cache. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
Pushes a row for MySQL to the fetch cache.
|
||||
@return TRUE on success, FALSE if the record contains incomplete BLOBs */
|
||||
UNIV_INLINE __attribute__((warn_unused_result))
|
||||
ibool
|
||||
row_sel_push_cache_row_for_mysql(
|
||||
/*=============================*/
|
||||
row_prebuilt_t* prebuilt, /*!< in: prebuilt struct */
|
||||
|
@ -3180,10 +3215,11 @@ row_sel_push_cache_row_for_mysql(
|
|||
prebuilt->fetch_cache[
|
||||
prebuilt->n_fetch_cached],
|
||||
prebuilt, rec, offsets))) {
|
||||
ut_error;
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
prebuilt->n_fetch_cached++;
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
|
@ -3578,11 +3614,21 @@ row_search_for_mysql(
|
|||
|
||||
if (!row_sel_store_mysql_rec(buf, prebuilt,
|
||||
rec, offsets)) {
|
||||
err = DB_TOO_BIG_RECORD;
|
||||
/* Only fresh inserts may contain
|
||||
incomplete externally stored
|
||||
columns. Pretend that such
|
||||
records do not exist. Such
|
||||
records may only be accessed
|
||||
at the READ UNCOMMITTED
|
||||
isolation level or when
|
||||
rolling back a recovered
|
||||
transaction. Rollback happens
|
||||
at a lower level, not here. */
|
||||
ut_a(trx->isolation_level
|
||||
== TRX_ISO_READ_UNCOMMITTED);
|
||||
|
||||
/* We let the main loop to do the
|
||||
error handling */
|
||||
goto shortcut_fails_too_big_rec;
|
||||
/* Proceed as in case SEL_RETRY. */
|
||||
break;
|
||||
}
|
||||
|
||||
mtr_commit(&mtr);
|
||||
|
@ -3622,7 +3668,7 @@ release_search_latch_if_needed:
|
|||
default:
|
||||
ut_ad(0);
|
||||
}
|
||||
shortcut_fails_too_big_rec:
|
||||
|
||||
mtr_commit(&mtr);
|
||||
mtr_start(&mtr);
|
||||
}
|
||||
|
@ -4357,9 +4403,18 @@ requires_clust_rec:
|
|||
not cache rows because there the cursor is a scrollable
|
||||
cursor. */
|
||||
|
||||
row_sel_push_cache_row_for_mysql(prebuilt, result_rec,
|
||||
offsets);
|
||||
if (prebuilt->n_fetch_cached == MYSQL_FETCH_CACHE_SIZE) {
|
||||
if (!row_sel_push_cache_row_for_mysql(prebuilt, result_rec,
|
||||
offsets)) {
|
||||
/* Only fresh inserts may contain incomplete
|
||||
externally stored columns. Pretend that such
|
||||
records do not exist. Such records may only be
|
||||
accessed at the READ UNCOMMITTED isolation
|
||||
level or when rolling back a recovered
|
||||
transaction. Rollback happens at a lower
|
||||
level, not here. */
|
||||
ut_a(trx->isolation_level == TRX_ISO_READ_UNCOMMITTED);
|
||||
} else if (prebuilt->n_fetch_cached
|
||||
== MYSQL_FETCH_CACHE_SIZE) {
|
||||
|
||||
goto got_row;
|
||||
}
|
||||
|
@ -4375,9 +4430,17 @@ requires_clust_rec:
|
|||
} else {
|
||||
if (!row_sel_store_mysql_rec(buf, prebuilt,
|
||||
result_rec, offsets)) {
|
||||
err = DB_TOO_BIG_RECORD;
|
||||
|
||||
goto lock_wait_or_error;
|
||||
/* Only fresh inserts may contain
|
||||
incomplete externally stored
|
||||
columns. Pretend that such records do
|
||||
not exist. Such records may only be
|
||||
accessed at the READ UNCOMMITTED
|
||||
isolation level or when rolling back a
|
||||
recovered transaction. Rollback
|
||||
happens at a lower level, not here. */
|
||||
ut_a(trx->isolation_level
|
||||
== TRX_ISO_READ_UNCOMMITTED);
|
||||
goto next_rec;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -199,8 +199,24 @@ row_undo_search_clust_to_pcur(
|
|||
|
||||
ret = FALSE;
|
||||
} else {
|
||||
row_ext_t** ext;
|
||||
|
||||
if (dict_table_get_format(node->table) >= DICT_TF_FORMAT_ZIP) {
|
||||
/* In DYNAMIC or COMPRESSED format, there is
|
||||
no prefix of externally stored columns in the
|
||||
clustered index record. Build a cache of
|
||||
column prefixes. */
|
||||
ext = &node->ext;
|
||||
} else {
|
||||
/* REDUNDANT and COMPACT formats store a local
|
||||
768-byte prefix of each externally stored
|
||||
column. No cache is needed. */
|
||||
ext = NULL;
|
||||
node->ext = NULL;
|
||||
}
|
||||
|
||||
node->row = row_build(ROW_COPY_DATA, clust_index, rec,
|
||||
offsets, NULL, &node->ext, node->heap);
|
||||
offsets, NULL, ext, node->heap);
|
||||
if (node->update) {
|
||||
node->undo_row = dtuple_copy(node->row, node->heap);
|
||||
row_upd_replace(node->undo_row, &node->undo_ext,
|
||||
|
|
|
@ -1398,6 +1398,7 @@ row_upd_store_row(
|
|||
dict_index_t* clust_index;
|
||||
rec_t* rec;
|
||||
mem_heap_t* heap = NULL;
|
||||
row_ext_t** ext;
|
||||
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
const ulint* offsets;
|
||||
rec_offs_init(offsets_);
|
||||
|
@ -1414,8 +1415,22 @@ row_upd_store_row(
|
|||
|
||||
offsets = rec_get_offsets(rec, clust_index, offsets_,
|
||||
ULINT_UNDEFINED, &heap);
|
||||
|
||||
if (dict_table_get_format(node->table) >= DICT_TF_FORMAT_ZIP) {
|
||||
/* In DYNAMIC or COMPRESSED format, there is no prefix
|
||||
of externally stored columns in the clustered index
|
||||
record. Build a cache of column prefixes. */
|
||||
ext = &node->ext;
|
||||
} else {
|
||||
/* REDUNDANT and COMPACT formats store a local
|
||||
768-byte prefix of each externally stored column.
|
||||
No cache is needed. */
|
||||
ext = NULL;
|
||||
node->ext = NULL;
|
||||
}
|
||||
|
||||
node->row = row_build(ROW_COPY_DATA, clust_index, rec, offsets,
|
||||
NULL, &node->ext, node->heap);
|
||||
NULL, ext, node->heap);
|
||||
if (node->is_delete) {
|
||||
node->upd_row = NULL;
|
||||
node->upd_ext = NULL;
|
||||
|
|
|
@ -2018,9 +2018,13 @@ innobase_shutdown_for_mysql(void)
|
|||
pars_lexer_close();
|
||||
log_mem_free();
|
||||
buf_pool_free();
|
||||
ut_free_all_mem();
|
||||
mem_close();
|
||||
|
||||
/* ut_free_all_mem() frees all allocated memory not freed yet
|
||||
in shutdown, and it will also free the ut_list_mutex, so it
|
||||
should be the last one for all operation */
|
||||
ut_free_all_mem();
|
||||
|
||||
if (os_thread_count != 0
|
||||
|| os_event_count != 0
|
||||
|| os_mutex_count != 0
|
||||
|
|
|
@ -377,86 +377,6 @@ static int my_strxfrm_big5(uchar *dest, const uchar *src, int len)
|
|||
#endif
|
||||
|
||||
|
||||
/*
|
||||
** Calculate min_str and max_str that ranges a LIKE string.
|
||||
** Arguments:
|
||||
** ptr Pointer to LIKE string.
|
||||
** ptr_length Length of LIKE string.
|
||||
** escape Escape character in LIKE. (Normally '\').
|
||||
** All escape characters should be removed from min_str and max_str
|
||||
** res_length Length of min_str and max_str.
|
||||
** min_str Smallest case sensitive string that ranges LIKE.
|
||||
** Should be space padded to res_length.
|
||||
** max_str Largest case sensitive string that ranges LIKE.
|
||||
** Normally padded with the biggest character sort value.
|
||||
**
|
||||
** The function should return 0 if ok and 1 if the LIKE string can't be
|
||||
** optimized !
|
||||
*/
|
||||
|
||||
#define max_sort_char ((char) 255)
|
||||
|
||||
static my_bool my_like_range_big5(CHARSET_INFO *cs __attribute__((unused)),
|
||||
const char *ptr,size_t ptr_length,
|
||||
pbool escape, pbool w_one, pbool w_many,
|
||||
size_t res_length,
|
||||
char *min_str, char *max_str,
|
||||
size_t *min_length, size_t *max_length)
|
||||
{
|
||||
const char *end= ptr + ptr_length;
|
||||
char *min_org=min_str;
|
||||
char *min_end=min_str+res_length;
|
||||
size_t charlen= res_length / cs->mbmaxlen;
|
||||
|
||||
for (; ptr != end && min_str != min_end && charlen > 0; ptr++, charlen--)
|
||||
{
|
||||
if (ptr+1 != end && isbig5code(ptr[0],ptr[1]))
|
||||
{
|
||||
*min_str++= *max_str++ = *ptr++;
|
||||
*min_str++= *max_str++ = *ptr;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == escape && ptr+1 != end)
|
||||
{
|
||||
ptr++; /* Skip escape */
|
||||
if (isbig5code(ptr[0], ptr[1]))
|
||||
*min_str++= *max_str++ = *ptr++;
|
||||
if (min_str < min_end)
|
||||
*min_str++= *max_str++= *ptr;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == w_one) /* '_' in SQL */
|
||||
{
|
||||
*min_str++='\0'; /* This should be min char */
|
||||
*max_str++=max_sort_char;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == w_many) /* '%' in SQL */
|
||||
{
|
||||
/*
|
||||
Calculate length of keys:
|
||||
'a\0\0... is the smallest possible string when we have space expand
|
||||
a\ff\ff... is the biggest possible string
|
||||
*/
|
||||
*min_length= ((cs->state & MY_CS_BINSORT) ? (size_t) (min_str - min_org) :
|
||||
res_length);
|
||||
*max_length= res_length;
|
||||
do {
|
||||
*min_str++ = 0;
|
||||
*max_str++ = max_sort_char;
|
||||
} while (min_str != min_end);
|
||||
return 0;
|
||||
}
|
||||
*min_str++= *max_str++ = *ptr;
|
||||
}
|
||||
|
||||
*min_length= *max_length= (size_t) (min_str-min_org);
|
||||
while (min_str != min_end)
|
||||
*min_str++= *max_str++= ' ';
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static uint ismbchar_big5(CHARSET_INFO *cs __attribute__((unused)),
|
||||
const char* p, const char *e)
|
||||
{
|
||||
|
@ -6338,7 +6258,7 @@ static MY_COLLATION_HANDLER my_collation_big5_chinese_ci_handler =
|
|||
my_strnncollsp_big5,
|
||||
my_strnxfrm_big5,
|
||||
my_strnxfrmlen_simple,
|
||||
my_like_range_big5,
|
||||
my_like_range_mb,
|
||||
my_wildcmp_mb,
|
||||
my_strcasecmp_mb,
|
||||
my_instr_mb,
|
||||
|
@ -6402,7 +6322,7 @@ CHARSET_INFO my_charset_big5_chinese_ci=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xF9D5, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
1, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_big5_handler,
|
||||
|
@ -6435,7 +6355,7 @@ CHARSET_INFO my_charset_big5_bin=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xF9FE, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
1, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_big5_handler,
|
||||
|
|
|
@ -306,76 +306,6 @@ static size_t my_strnxfrm_cp932(CHARSET_INFO *cs __attribute__((unused)),
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
** Calculate min_str and max_str that ranges a LIKE string.
|
||||
** Arguments:
|
||||
** ptr Pointer to LIKE string.
|
||||
** ptr_length Length of LIKE string.
|
||||
** escape Escape character in LIKE. (Normally '\').
|
||||
** All escape characters should be removed from min_str and max_str
|
||||
** res_length Length of min_str and max_str.
|
||||
** min_str Smallest case sensitive string that ranges LIKE.
|
||||
** Should be space padded to res_length.
|
||||
** max_str Largest case sensitive string that ranges LIKE.
|
||||
** Normally padded with the biggest character sort value.
|
||||
**
|
||||
** The function should return 0 if ok and 1 if the LIKE string can't be
|
||||
** optimized !
|
||||
*/
|
||||
|
||||
#define max_sort_char ((char) 255)
|
||||
|
||||
static my_bool my_like_range_cp932(CHARSET_INFO *cs __attribute__((unused)),
|
||||
const char *ptr,size_t ptr_length,
|
||||
pbool escape, pbool w_one, pbool w_many,
|
||||
size_t res_length,
|
||||
char *min_str,char *max_str,
|
||||
size_t *min_length, size_t *max_length)
|
||||
{
|
||||
const char *end=ptr+ptr_length;
|
||||
char *min_org=min_str;
|
||||
char *min_end=min_str+res_length;
|
||||
|
||||
while (ptr < end && min_str < min_end) {
|
||||
if (ismbchar_cp932(cs, ptr, end)) {
|
||||
*min_str++ = *max_str++ = *ptr++;
|
||||
if (min_str < min_end)
|
||||
*min_str++ = *max_str++ = *ptr++;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == escape && ptr+1 < end) {
|
||||
ptr++; /* Skip escape */
|
||||
if (ismbchar_cp932(cs, ptr, end))
|
||||
*min_str++ = *max_str++ = *ptr++;
|
||||
if (min_str < min_end)
|
||||
*min_str++ = *max_str++ = *ptr++;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == w_one) { /* '_' in SQL */
|
||||
*min_str++ = '\0'; /* This should be min char */
|
||||
*max_str++ = max_sort_char;
|
||||
ptr++;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == w_many)
|
||||
{ /* '%' in SQL */
|
||||
*min_length = (size_t)(min_str - min_org);
|
||||
*max_length = res_length;
|
||||
do
|
||||
{
|
||||
*min_str++= 0;
|
||||
*max_str++= max_sort_char;
|
||||
} while (min_str < min_end);
|
||||
return 0;
|
||||
}
|
||||
*min_str++ = *max_str++ = *ptr++;
|
||||
}
|
||||
*min_length = *max_length = (size_t) (min_str - min_org);
|
||||
while (min_str < min_end)
|
||||
*min_str++ = *max_str++ = ' '; /* Because if key compression */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* page 0 0x00A1-0x00DF */
|
||||
static uint16 tab_cp932_uni0[]={
|
||||
0xFF61,0xFF62,0xFF63,0xFF64,0xFF65,0xFF66,0xFF67,0xFF68,
|
||||
|
@ -5467,7 +5397,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler =
|
|||
my_strnncollsp_cp932,
|
||||
my_strnxfrm_cp932,
|
||||
my_strnxfrmlen_simple,
|
||||
my_like_range_cp932,
|
||||
my_like_range_mb,
|
||||
my_wildcmp_mb, /* wildcmp */
|
||||
my_strcasecmp_8bit,
|
||||
my_instr_mb,
|
||||
|
@ -5533,7 +5463,7 @@ CHARSET_INFO my_charset_cp932_japanese_ci=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFCFC, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
1, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
@ -5565,7 +5495,7 @@ CHARSET_INFO my_charset_cp932_bin=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFCFC, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
1, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
|
|
@ -8762,7 +8762,7 @@ CHARSET_INFO my_charset_euckr_korean_ci=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFEFE, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
0, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
@ -8795,7 +8795,7 @@ CHARSET_INFO my_charset_euckr_bin=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFEFE, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
0, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
|
|
@ -8710,7 +8710,7 @@ CHARSET_INFO my_charset_eucjpms_japanese_ci=
|
|||
1, /* mbminlen */
|
||||
3, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFEFE, /* max_sort_char */
|
||||
' ', /* pad_char */
|
||||
0, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
@ -8743,7 +8743,7 @@ CHARSET_INFO my_charset_eucjpms_bin=
|
|||
1, /* mbminlen */
|
||||
3, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFEFE, /* max_sort_char */
|
||||
' ', /* pad_char */
|
||||
0, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
|
|
@ -5790,7 +5790,7 @@ CHARSET_INFO my_charset_gb2312_chinese_ci=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xF7FE, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
0, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
@ -5822,7 +5822,7 @@ CHARSET_INFO my_charset_gb2312_bin=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xF7FE, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
0, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
|
|
@ -2690,86 +2690,6 @@ static size_t my_strnxfrm_gbk(CHARSET_INFO *cs __attribute__((unused)),
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
** Calculate min_str and max_str that ranges a LIKE string.
|
||||
** Arguments:
|
||||
** ptr Pointer to LIKE string.
|
||||
** ptr_length Length of LIKE string.
|
||||
** escape Escape character in LIKE. (Normally '\').
|
||||
** All escape characters should be removed from min_str and max_str
|
||||
** res_length Length of min_str and max_str.
|
||||
** min_str Smallest case sensitive string that ranges LIKE.
|
||||
** Should be space padded to res_length.
|
||||
** max_str Largest case sensitive string that ranges LIKE.
|
||||
** Normally padded with the biggest character sort value.
|
||||
**
|
||||
** The function should return 0 if ok and 1 if the LIKE string can't be
|
||||
** optimized !
|
||||
*/
|
||||
|
||||
#define max_sort_char ((uchar) 255)
|
||||
|
||||
static my_bool my_like_range_gbk(CHARSET_INFO *cs __attribute__((unused)),
|
||||
const char *ptr,size_t ptr_length,
|
||||
pbool escape, pbool w_one, pbool w_many,
|
||||
size_t res_length,
|
||||
char *min_str,char *max_str,
|
||||
size_t *min_length,size_t *max_length)
|
||||
{
|
||||
const char *end= ptr + ptr_length;
|
||||
char *min_org=min_str;
|
||||
char *min_end=min_str+res_length;
|
||||
size_t charlen= res_length / cs->mbmaxlen;
|
||||
|
||||
for (; ptr != end && min_str != min_end && charlen > 0; ptr++, charlen--)
|
||||
{
|
||||
if (ptr+1 != end && isgbkcode(ptr[0],ptr[1]))
|
||||
{
|
||||
*min_str++= *max_str++ = *ptr++;
|
||||
*min_str++= *max_str++ = *ptr;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == escape && ptr+1 != end)
|
||||
{
|
||||
ptr++; /* Skip escape */
|
||||
if (isgbkcode(ptr[0], ptr[1]))
|
||||
*min_str++= *max_str++ = *ptr;
|
||||
if (min_str < min_end)
|
||||
*min_str++= *max_str++= *ptr;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == w_one) /* '_' in SQL */
|
||||
{
|
||||
*min_str++='\0'; /* This should be min char */
|
||||
*max_str++=max_sort_char;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == w_many) /* '%' in SQL */
|
||||
{
|
||||
/*
|
||||
Calculate length of keys:
|
||||
'a\0\0... is the smallest possible string when we have space expand
|
||||
a\ff\ff... is the biggest possible string
|
||||
*/
|
||||
*min_length= ((cs->state & MY_CS_BINSORT) ? (size_t) (min_str - min_org) :
|
||||
res_length);
|
||||
*max_length= res_length;
|
||||
do {
|
||||
*min_str++= 0;
|
||||
*max_str++= max_sort_char;
|
||||
} while (min_str != min_end);
|
||||
return 0;
|
||||
}
|
||||
*min_str++= *max_str++ = *ptr;
|
||||
}
|
||||
|
||||
*min_length= *max_length = (size_t) (min_str - min_org);
|
||||
while (min_str != min_end)
|
||||
*min_str++= *max_str++= ' '; /* Because if key compression */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static uint ismbchar_gbk(CHARSET_INFO *cs __attribute__((unused)),
|
||||
const char* p, const char *e)
|
||||
{
|
||||
|
@ -9983,7 +9903,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler =
|
|||
my_strnncollsp_gbk,
|
||||
my_strnxfrm_gbk,
|
||||
my_strnxfrmlen_simple,
|
||||
my_like_range_gbk,
|
||||
my_like_range_mb,
|
||||
my_wildcmp_mb,
|
||||
my_strcasecmp_mb,
|
||||
my_instr_mb,
|
||||
|
@ -10048,7 +9968,7 @@ CHARSET_INFO my_charset_gbk_chinese_ci=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xA967, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
1, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
@ -10080,7 +10000,7 @@ CHARSET_INFO my_charset_gbk_bin=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFEFE, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
1, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
|
|
@ -498,7 +498,9 @@ static void my_hash_sort_mb_bin(CHARSET_INFO *cs __attribute__((unused)),
|
|||
DESCRIPTION
|
||||
Write max key:
|
||||
- for non-Unicode character sets:
|
||||
just set to 255.
|
||||
just bfill using max_sort_char if max_sort_char is one byte.
|
||||
In case when max_sort_char is two bytes, fill with double-byte pairs
|
||||
and optionally pad with a single space character.
|
||||
- for Unicode character set (utf-8):
|
||||
create a buffer with multibyte representation of the max_sort_char
|
||||
character, and copy it into max_str in a loop.
|
||||
|
@ -510,12 +512,20 @@ static void pad_max_char(CHARSET_INFO *cs, char *str, char *end)
|
|||
|
||||
if (!(cs->state & MY_CS_UNICODE))
|
||||
{
|
||||
bfill(str, end - str, 255);
|
||||
return;
|
||||
if (cs->max_sort_char <= 255)
|
||||
{
|
||||
bfill(str, end - str, cs->max_sort_char);
|
||||
return;
|
||||
}
|
||||
buf[0]= cs->max_sort_char >> 8;
|
||||
buf[1]= cs->max_sort_char & 0xFF;
|
||||
buflen= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
buflen= cs->cset->wc_mb(cs, cs->max_sort_char, (uchar*) buf,
|
||||
(uchar*) buf + sizeof(buf));
|
||||
}
|
||||
|
||||
buflen= cs->cset->wc_mb(cs, cs->max_sort_char, (uchar*) buf,
|
||||
(uchar*) buf + sizeof(buf));
|
||||
|
||||
DBUG_ASSERT(buflen > 0);
|
||||
do
|
||||
|
|
|
@ -304,85 +304,6 @@ static size_t my_strnxfrm_sjis(CHARSET_INFO *cs __attribute__((unused)),
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
** Calculate min_str and max_str that ranges a LIKE string.
|
||||
** Arguments:
|
||||
** ptr Pointer to LIKE string.
|
||||
** ptr_length Length of LIKE string.
|
||||
** escape Escape character in LIKE. (Normally '\').
|
||||
** All escape characters should be removed from min_str and max_str
|
||||
** res_length Length of min_str and max_str.
|
||||
** min_str Smallest case sensitive string that ranges LIKE.
|
||||
** Should be space padded to res_length.
|
||||
** max_str Largest case sensitive string that ranges LIKE.
|
||||
** Normally padded with the biggest character sort value.
|
||||
**
|
||||
** The function should return 0 if ok and 1 if the LIKE string can't be
|
||||
** optimized !
|
||||
*/
|
||||
|
||||
#define max_sort_char ((char) 255)
|
||||
|
||||
static my_bool my_like_range_sjis(CHARSET_INFO *cs __attribute__((unused)),
|
||||
const char *ptr,size_t ptr_length,
|
||||
pbool escape, pbool w_one, pbool w_many,
|
||||
size_t res_length,
|
||||
char *min_str,char *max_str,
|
||||
size_t *min_length,size_t *max_length)
|
||||
{
|
||||
const char *end= ptr + ptr_length;
|
||||
char *min_org=min_str;
|
||||
char *min_end=min_str+res_length;
|
||||
size_t charlen= res_length / cs->mbmaxlen;
|
||||
|
||||
for ( ; ptr < end && min_str < min_end && charlen > 0 ; charlen--)
|
||||
{
|
||||
if (ismbchar_sjis(cs, ptr, end)) {
|
||||
*min_str++ = *max_str++ = *ptr++;
|
||||
if (min_str < min_end)
|
||||
*min_str++ = *max_str++ = *ptr++;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == escape && ptr+1 < end) {
|
||||
ptr++; /* Skip escape */
|
||||
if (ismbchar_sjis(cs, ptr, end))
|
||||
*min_str++ = *max_str++ = *ptr++;
|
||||
if (min_str < min_end)
|
||||
*min_str++ = *max_str++ = *ptr++;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == w_one) { /* '_' in SQL */
|
||||
*min_str++ = '\0'; /* This should be min char */
|
||||
*max_str++ = max_sort_char;
|
||||
ptr++;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == w_many)
|
||||
{ /* '%' in SQL */
|
||||
/*
|
||||
Calculate length of keys:
|
||||
'a\0\0... is the smallest possible string when we have space expand
|
||||
a\ff\ff... is the biggest possible string
|
||||
*/
|
||||
*min_length= ((cs->state & MY_CS_BINSORT) ? (size_t) (min_str - min_org) :
|
||||
res_length);
|
||||
*max_length= res_length;
|
||||
do
|
||||
{
|
||||
*min_str++= 0;
|
||||
*max_str++= max_sort_char;
|
||||
} while (min_str < min_end);
|
||||
return 0;
|
||||
}
|
||||
*min_str++ = *max_str++ = *ptr++;
|
||||
}
|
||||
|
||||
*min_length= *max_length= (size_t) (min_str - min_org);
|
||||
while (min_str != min_end)
|
||||
*min_str++= *max_str++= ' '; /* Because if key compression */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* page 0 0x00A1-0x00DF */
|
||||
static uint16 tab_sjis_uni0[]={
|
||||
0xFF61,0xFF62,0xFF63,0xFF64,0xFF65,0xFF66,0xFF67,0xFF68,
|
||||
|
@ -4628,7 +4549,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler =
|
|||
my_strnncollsp_sjis,
|
||||
my_strnxfrm_sjis,
|
||||
my_strnxfrmlen_simple,
|
||||
my_like_range_sjis,
|
||||
my_like_range_mb,
|
||||
my_wildcmp_mb, /* wildcmp */
|
||||
my_strcasecmp_8bit,
|
||||
my_instr_mb,
|
||||
|
@ -4694,7 +4615,7 @@ CHARSET_INFO my_charset_sjis_japanese_ci=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFCFC, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
1, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
@ -4726,7 +4647,7 @@ CHARSET_INFO my_charset_sjis_bin=
|
|||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFCFC, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
1, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
|
|
@ -8567,7 +8567,7 @@ CHARSET_INFO my_charset_ujis_japanese_ci=
|
|||
1, /* mbminlen */
|
||||
3, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFEFE, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
0, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
@ -8600,7 +8600,7 @@ CHARSET_INFO my_charset_ujis_bin=
|
|||
1, /* mbminlen */
|
||||
3, /* mbmaxlen */
|
||||
0, /* min_sort_char */
|
||||
255, /* max_sort_char */
|
||||
0xFEFE, /* max_sort_char */
|
||||
' ', /* pad char */
|
||||
0, /* escape_with_backslash_is_dangerous */
|
||||
&my_charset_handler,
|
||||
|
|
|
@ -13246,37 +13246,52 @@ static void test_bug15518()
|
|||
}
|
||||
|
||||
|
||||
static void disable_general_log()
|
||||
static void disable_query_logs()
|
||||
{
|
||||
int rc;
|
||||
rc= mysql_query(mysql, "set @@global.general_log=off");
|
||||
myquery(rc);
|
||||
rc= mysql_query(mysql, "set @@global.slow_query_log=off");
|
||||
myquery(rc);
|
||||
}
|
||||
|
||||
|
||||
static void enable_general_log(int truncate)
|
||||
static void enable_query_logs(int truncate)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc= mysql_query(mysql, "set @save_global_general_log=@@global.general_log");
|
||||
myquery(rc);
|
||||
|
||||
rc= mysql_query(mysql, "set @save_global_slow_query_log=@@global.slow_query_log");
|
||||
myquery(rc);
|
||||
|
||||
rc= mysql_query(mysql, "set @@global.general_log=on");
|
||||
myquery(rc);
|
||||
|
||||
rc= mysql_query(mysql, "set @@global.slow_query_log=on");
|
||||
myquery(rc);
|
||||
|
||||
|
||||
if (truncate)
|
||||
{
|
||||
rc= mysql_query(mysql, "truncate mysql.general_log");
|
||||
myquery(rc);
|
||||
|
||||
rc= mysql_query(mysql, "truncate mysql.slow_log");
|
||||
myquery(rc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void restore_general_log()
|
||||
static void restore_query_logs()
|
||||
{
|
||||
int rc;
|
||||
rc= mysql_query(mysql, "set @@global.general_log=@save_global_general_log");
|
||||
myquery(rc);
|
||||
|
||||
rc= mysql_query(mysql, "set @@global.slow_query_log=@save_global_slow_query_log");
|
||||
myquery(rc);
|
||||
}
|
||||
|
||||
|
||||
|
@ -15447,7 +15462,7 @@ static void test_bug17667()
|
|||
return;
|
||||
}
|
||||
|
||||
enable_general_log(1);
|
||||
enable_query_logs(1);
|
||||
|
||||
for (statement_cursor= statements; statement_cursor->buffer != NULL;
|
||||
statement_cursor++)
|
||||
|
@ -15527,7 +15542,7 @@ static void test_bug17667()
|
|||
statement_cursor->buffer);
|
||||
}
|
||||
|
||||
restore_general_log();
|
||||
restore_query_logs();
|
||||
|
||||
if (!opt_silent)
|
||||
printf("success. All queries found intact in the log.\n");
|
||||
|
@ -17390,7 +17405,7 @@ static void test_bug28386()
|
|||
}
|
||||
mysql_free_result(result);
|
||||
|
||||
enable_general_log(1);
|
||||
enable_query_logs(1);
|
||||
|
||||
stmt= mysql_simple_prepare(mysql, "SELECT ?");
|
||||
check_stmt(stmt);
|
||||
|
@ -17429,7 +17444,7 @@ static void test_bug28386()
|
|||
|
||||
mysql_free_result(result);
|
||||
|
||||
restore_general_log();
|
||||
restore_query_logs();
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
@ -18215,7 +18230,7 @@ static void test_bug42373()
|
|||
Bug#54041: MySQL 5.0.92 fails when tests from Connector/C suite run
|
||||
*/
|
||||
|
||||
static void test_bug54041()
|
||||
static void test_bug54041_impl()
|
||||
{
|
||||
int rc;
|
||||
MYSQL_STMT *stmt;
|
||||
|
@ -18230,7 +18245,7 @@ static void test_bug54041()
|
|||
rc= mysql_query(mysql, "CREATE TABLE t1 (a INT)");
|
||||
myquery(rc);
|
||||
|
||||
stmt= mysql_simple_prepare(mysql, "INSERT INTO t1 (a) VALUES (?)");
|
||||
stmt= mysql_simple_prepare(mysql, "SELECT a FROM t1 WHERE a > ?");
|
||||
check_stmt(stmt);
|
||||
verify_param_count(stmt, 1);
|
||||
|
||||
|
@ -18268,6 +18283,20 @@ static void test_bug54041()
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
Bug#54041: MySQL 5.0.92 fails when tests from Connector/C suite run
|
||||
*/
|
||||
|
||||
static void test_bug54041()
|
||||
{
|
||||
enable_query_logs(0);
|
||||
test_bug54041_impl();
|
||||
disable_query_logs();
|
||||
test_bug54041_impl();
|
||||
restore_query_logs();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Read and parse arguments and MySQL options from my.cnf
|
||||
*/
|
||||
|
@ -18348,7 +18377,7 @@ and you are welcome to modify and redistribute it under the GPL license\n");
|
|||
|
||||
|
||||
static struct my_tests_st my_tests[]= {
|
||||
{ "disable_general_log", disable_general_log },
|
||||
{ "disable_query_logs", disable_query_logs },
|
||||
{ "test_view_sp_list_fields", test_view_sp_list_fields },
|
||||
{ "client_query", client_query },
|
||||
{ "test_prepare_insert_update", test_prepare_insert_update},
|
||||
|
|
|
@ -13,12 +13,12 @@
|
|||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
SUBDIRS = mytap . mysys examples
|
||||
SUBDIRS = mytap . mysys examples strings
|
||||
|
||||
EXTRA_DIST = unit.pl
|
||||
CLEANFILES = unit
|
||||
|
||||
unittests = mytap mysys @mysql_se_unittest_dirs@ @mysql_pg_unittest_dirs@
|
||||
unittests = mytap mysys strings @mysql_se_unittest_dirs@ @mysql_pg_unittest_dirs@
|
||||
|
||||
test:
|
||||
perl unit.pl run $(unittests)
|
||||
|
|
27
unittest/strings/Makefile.am
Normal file
27
unittest/strings/Makefile.am
Normal file
|
@ -0,0 +1,27 @@
|
|||
# Copyright 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
AM_CPPFLAGS = @ZLIB_INCLUDES@ -I$(top_builddir)/include
|
||||
AM_CPPFLAGS += -I$(top_srcdir)/include -I$(top_srcdir)/unittest/mytap
|
||||
|
||||
LDADD = $(top_builddir)/unittest/mytap/libmytap.a \
|
||||
$(top_builddir)/mysys/libmysys.a \
|
||||
$(top_builddir)/dbug/libdbug.a \
|
||||
$(top_builddir)/strings/libmystrings.a
|
||||
|
||||
noinst_PROGRAMS = strings-t
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
114
unittest/strings/strings-t.c
Normal file
114
unittest/strings/strings-t.c
Normal file
|
@ -0,0 +1,114 @@
|
|||
/* Copyright 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
||||
|
||||
#include <tap.h>
|
||||
#include <my_global.h>
|
||||
#include <my_sys.h>
|
||||
|
||||
|
||||
/*
|
||||
Test that like_range() returns well-formed results.
|
||||
*/
|
||||
static int
|
||||
test_like_range_for_charset(CHARSET_INFO *cs, const char *src, size_t src_len)
|
||||
{
|
||||
char min_str[32], max_str[32];
|
||||
size_t min_len, max_len, min_well_formed_len, max_well_formed_len;
|
||||
int error= 0;
|
||||
|
||||
cs->coll->like_range(cs, src, src_len, '\\', '_', '%',
|
||||
sizeof(min_str), min_str, max_str, &min_len, &max_len);
|
||||
diag("min_len=%d\tmax_len=%d\t%s", (int) min_len, (int) max_len, cs->name);
|
||||
min_well_formed_len= cs->cset->well_formed_len(cs,
|
||||
min_str, min_str + min_len,
|
||||
10000, &error);
|
||||
max_well_formed_len= cs->cset->well_formed_len(cs,
|
||||
max_str, max_str + max_len,
|
||||
10000, &error);
|
||||
if (min_len != min_well_formed_len)
|
||||
diag("Bad min_str: min_well_formed_len=%d min_str[%d]=0x%02X",
|
||||
(int) min_well_formed_len, (int) min_well_formed_len,
|
||||
(uchar) min_str[min_well_formed_len]);
|
||||
if (max_len != max_well_formed_len)
|
||||
diag("Bad max_str: max_well_formed_len=%d max_str[%d]=0x%02X",
|
||||
(int) max_well_formed_len, (int) max_well_formed_len,
|
||||
(uchar) max_str[max_well_formed_len]);
|
||||
return
|
||||
min_len == min_well_formed_len &&
|
||||
max_len == max_well_formed_len ? 0 : 1;
|
||||
}
|
||||
|
||||
|
||||
static CHARSET_INFO *charset_list[]=
|
||||
{
|
||||
#ifdef HAVE_CHARSET_big5
|
||||
&my_charset_big5_chinese_ci,
|
||||
&my_charset_big5_bin,
|
||||
#endif
|
||||
#ifdef HAVE_CHARSET_euckr
|
||||
&my_charset_euckr_korean_ci,
|
||||
&my_charset_euckr_bin,
|
||||
#endif
|
||||
#ifdef HAVE_CHARSET_gb2312
|
||||
&my_charset_gb2312_chinese_ci,
|
||||
&my_charset_gb2312_bin,
|
||||
#endif
|
||||
#ifdef HAVE_CHARSET_gbk
|
||||
&my_charset_gbk_chinese_ci,
|
||||
&my_charset_gbk_bin,
|
||||
#endif
|
||||
#ifdef HAVE_CHARSET_latin1
|
||||
&my_charset_latin1,
|
||||
&my_charset_latin1_bin,
|
||||
#endif
|
||||
#ifdef HAVE_CHARSET_sjis
|
||||
&my_charset_sjis_japanese_ci,
|
||||
&my_charset_sjis_bin,
|
||||
#endif
|
||||
#ifdef HAVE_CHARSET_tis620
|
||||
&my_charset_tis620_thai_ci,
|
||||
&my_charset_tis620_bin,
|
||||
#endif
|
||||
#ifdef HAVE_CHARSET_ujis
|
||||
&my_charset_ujis_japanese_ci,
|
||||
&my_charset_ujis_bin,
|
||||
#endif
|
||||
#ifdef HAVE_CHARSET_utf8
|
||||
&my_charset_utf8_general_ci,
|
||||
&my_charset_utf8_unicode_ci,
|
||||
&my_charset_utf8_bin,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
size_t i, failed= 0;
|
||||
|
||||
plan(1);
|
||||
diag("Testing my_like_range_xxx() functions");
|
||||
|
||||
for (i= 0; i < array_elements(charset_list); i++)
|
||||
{
|
||||
CHARSET_INFO *cs= charset_list[i];
|
||||
if (test_like_range_for_charset(cs, "abc%", 4))
|
||||
{
|
||||
++failed;
|
||||
diag("Failed for %s", cs->name);
|
||||
}
|
||||
}
|
||||
ok(failed == 0, "Testing my_like_range_xxx() functions");
|
||||
return exit_status();
|
||||
}
|
Loading…
Reference in a new issue