mirror of
https://github.com/MariaDB/server.git
synced 2026-04-30 12:15:32 +02:00
merge mysql-5.1-bugteam into mysql-5.1-security
This commit is contained in:
commit
4f738e9b7c
69 changed files with 1267 additions and 698 deletions
|
|
@ -2880,7 +2880,8 @@ fi
|
||||||
|
|
||||||
AC_CONFIG_FILES(Makefile extra/Makefile mysys/Makefile dnl
|
AC_CONFIG_FILES(Makefile extra/Makefile mysys/Makefile dnl
|
||||||
unittest/Makefile unittest/mytap/Makefile unittest/mytap/t/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
|
strings/Makefile regex/Makefile storage/Makefile dnl
|
||||||
man/Makefile BUILD/Makefile vio/Makefile dnl
|
man/Makefile BUILD/Makefile vio/Makefile dnl
|
||||||
libmysql/Makefile libmysql_r/Makefile client/Makefile dnl
|
libmysql/Makefile libmysql_r/Makefile client/Makefile dnl
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,7 @@ void Base64Decoder::Decode()
|
||||||
{
|
{
|
||||||
word32 bytes = coded_.size();
|
word32 bytes = coded_.size();
|
||||||
word32 plainSz = bytes - ((bytes + (pemLineSz - 1)) / pemLineSz);
|
word32 plainSz = bytes - ((bytes + (pemLineSz - 1)) / pemLineSz);
|
||||||
plainSz = (plainSz * 3 + 3) / 4;
|
plainSz = ((plainSz * 3) / 4) + 3;
|
||||||
decoded_.New(plainSz);
|
decoded_.New(plainSz);
|
||||||
|
|
||||||
word32 i = 0;
|
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/rpl_ndb suite/rpl_ndb/t suite/rpl_ndb/r \
|
||||||
suite/parts suite/parts/t suite/parts/r suite/parts/inc \
|
suite/parts suite/parts/t suite/parts/r suite/parts/inc \
|
||||||
suite/innodb suite/innodb/t suite/innodb/r suite/innodb/include \
|
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 suite/engines/funcs suite/engines/iuds suite/engines/rr_trx \
|
||||||
suite/engines/funcs/r suite/engines/funcs/t suite/engines/iuds/r \
|
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 \
|
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;
|
disable_query_log;
|
||||||
--require r/true.require
|
--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';
|
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
|
2
|
||||||
DROP TABLE t1, t2;
|
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
|
# End of 5.1 tests
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
SET @old_general_log= @@global.general_log;
|
SET @old_general_log= @@global.general_log;
|
||||||
|
SET @old_slow_query_log= @@global.slow_query_log;
|
||||||
ok
|
ok
|
||||||
SET @@global.general_log= @old_general_log;
|
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-----
|
-----BEGIN CERTIFICATE-----
|
||||||
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
|
||||||
sc0RHAEZmcIiQvdBrrS4Gg==
|
UsZdIB0n2+KA0xwEdGPdkGCfNPBtOg557DkcyEvsIZ9ELp4Pp2XzWRhyFGasJZc4
|
||||||
|
YwgD/3K2rpOPZoMkBKeKqV19j41OfLKGBVyuaqzitbu9+KT4RU1ibr2a+UuFCwdT
|
||||||
|
oqyN7bfWXjcjXOMkxCsOmLfKmqQxs7TEOVrYPTdYjamDxLy/e5g5FgoCxGY8iil0
|
||||||
|
+YFLZyH6eEx/Os9DlG/M3O1MeRD9U97CdsphbDVZIDyWw5xeX8qQHJe0KSprAgiG
|
||||||
|
TLhTZHeyrKujQCQS1oFFmNy4gSqXt0j1/6/9T80j6HeyjiiYEaEQK9YLTAjRoA7W
|
||||||
|
VN8wtHI5F3RlNOVQEJks/bjdlpLL3VhaWtfewGh/mXRGcow84cgcsejMexmhreHm
|
||||||
|
JfTUl9+X1IFFxGq2/606A9ROQ7kN/s4rXu7/TiMODXI/kZijoWd2SCc7Z0YWoNo7
|
||||||
|
IRKkmZtrsflJbObEuK2Jk59uqzSxyQOBId8qtbPo8qJJyHGV5GCp34g4x67BxJBo
|
||||||
|
h1iyVMamBAS5Ip1ejghuROrB8Hit8NhAZApXju62btJeXLX+mQayXb/wC/IXNJJD
|
||||||
|
83tXiLfZgs6GzLAq7+KW/64sZSvj87CPiNtxkvjchAvyr+fhbBXCrf4rlOjJE6SH
|
||||||
|
Je2/Jon7uqijncARGLBeYUT0Aa6k1slpXuSKxDNt7EIkP21kDZ5/OJ0Y1u587KVB
|
||||||
|
dEhuDgNf2/8ij7gAQBwBoZMe1DrwddrxgLLBlyHpAZetNYFZNT+Cs/OlpqI0Jm59
|
||||||
|
kK9pX0BY4AGOd23XM3K/uLawdmf67kkftim7aVaqXFHPiWsJVtlzmidKvNSmbmZe
|
||||||
|
dOmMXp6PBoqcdusFVUS7vjd3KAes5wUX/CaTyOOPRu0LMSnpwEnaL76IC9x4Jd6d
|
||||||
|
7QqY/OFTjpPH8nP57LwouiT6MgSUCWGaOkPuBJ9w9sENSbbINpgJJ42iAe2kE+R7
|
||||||
|
qEIvf/2ETCTseeQUqm2nWiSPLkNagEh6kojmEoKrGyrv3YjrSXSOY1a70tDVy43+
|
||||||
|
ueQDQzNZm3Q7inpke2ZKvWyY0LQmLzP2te+tnNBcdLyKJx7emPRTuMUlEdK7cLbt
|
||||||
|
V3Sy9IKtyAXqqd66fPFj4NhJygyncj8M6CSqhG5L0GhDbkA8UJ8yK/gfKm3h5xe2
|
||||||
|
utULK5VMtAhQt6cVahO59A9t/OI17y45bmlIgdlEQISzVFe9ZbIUJW44zBfPx74k
|
||||||
|
/w8pMRr8gEuRqpL2WdJiKGG6lhMHLVFo
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
|
||||||
|
|
@ -1,99 +1,99 @@
|
||||||
-----BEGIN RSA PRIVATE KEY-----
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
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
|
||||||
-----END RSA PRIVATE KEY-----
|
-----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
|
-- source include/have_innodb_plugin.inc
|
||||||
# embedded server ignores 'delayed', so skip this
|
# embedded server ignores 'delayed', so skip this
|
||||||
-- source include/not_embedded.inc
|
-- 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`;
|
let $innodb_file_format_check_orig=`select @@innodb_file_format_check`;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
-- source include/have_innodb_plugin.inc
|
-- source include/have_innodb_plugin.inc
|
||||||
# embedded server ignores 'delayed', so skip this
|
# embedded server ignores 'delayed', so skip this
|
||||||
-- source include/not_embedded.inc
|
-- 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`;
|
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;
|
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
|
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'
|
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 ====
|
==== clean up ====
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET @@global.max_allowed_packet= 1024;
|
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
|
# 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
|
# max-out size db name
|
||||||
source include/master-slave.inc;
|
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);
|
let $last_io_error= query_get_value(SHOW SLAVE STATUS, Last_IO_Error, 1);
|
||||||
eval SELECT "$last_io_error" AS Last_IO_Error;
|
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 ====
|
--echo ==== clean up ====
|
||||||
connection master;
|
connection master;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
|
||||||
|
|
@ -1221,5 +1221,19 @@ DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--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
|
--echo # End of 5.1 tests
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
-- source include/not_embedded.inc
|
-- source include/not_embedded.inc
|
||||||
|
|
||||||
SET @old_general_log= @@global.general_log;
|
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
|
# We run with different binaries for normal and --embedded-server
|
||||||
#
|
#
|
||||||
|
|
@ -17,3 +18,4 @@ SET @old_general_log= @@global.general_log;
|
||||||
echo ok;
|
echo ok;
|
||||||
|
|
||||||
SET @@global.general_log= @old_general_log;
|
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
|
#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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2740,6 +2740,7 @@ public:
|
||||||
class Cached_item_str :public Cached_item
|
class Cached_item_str :public Cached_item
|
||||||
{
|
{
|
||||||
Item *item;
|
Item *item;
|
||||||
|
uint32 value_max_length;
|
||||||
String value,tmp_value;
|
String value,tmp_value;
|
||||||
public:
|
public:
|
||||||
Cached_item_str(THD *thd, Item *arg);
|
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)
|
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)
|
bool Cached_item_str::cmp(void)
|
||||||
|
|
@ -67,7 +69,7 @@ bool Cached_item_str::cmp(void)
|
||||||
bool tmp;
|
bool tmp;
|
||||||
|
|
||||||
if ((res=item->val_str(&tmp_value)))
|
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)
|
||||||
{
|
{
|
||||||
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 force_switch,
|
||||||
bool *cur_db_changed);
|
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);
|
const char ** semicolon);
|
||||||
|
|
||||||
bool mysql_test_parse_for_slave(THD *thd,char *inBuf,uint length);
|
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()
|
bool Protocol::flush()
|
||||||
{
|
{
|
||||||
#ifndef EMBEDDED_LIBRARY
|
#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
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -574,7 +578,8 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
|
||||||
if (flags & SEND_NUM_ROWS)
|
if (flags & SEND_NUM_ROWS)
|
||||||
{ // Packet with number of elements
|
{ // Packet with number of elements
|
||||||
uchar *pos= net_store_length(buff, list->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
|
#ifndef DBUG_OFF
|
||||||
|
|
@ -698,7 +703,7 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
|
||||||
if (flags & SEND_DEFAULTS)
|
if (flags & SEND_DEFAULTS)
|
||||||
item->send(&prot, &tmp); // Send default value
|
item->send(&prot, &tmp); // Send default value
|
||||||
if (prot.write())
|
if (prot.write())
|
||||||
break; /* purecov: inspected */
|
DBUG_RETURN(1);
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
field_types[count++]= field.type;
|
field_types[count++]= field.type;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -711,7 +716,9 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
|
||||||
to show that there is no cursor.
|
to show that there is no cursor.
|
||||||
Send no warning information, as it will be sent at statement end.
|
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));
|
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->limit_found_rows = query->found_rows();
|
||||||
thd->status_var.last_query_cost= 0.0;
|
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);
|
BLOCK_UNLOCK_RD(query_block);
|
||||||
DBUG_RETURN(1); // Result sent to client
|
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)
|
bool xid_cache_insert(XID_STATE *xid_state)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&LOCK_xid_cache);
|
pthread_mutex_lock(&LOCK_xid_cache);
|
||||||
DBUG_ASSERT(hash_search(&xid_cache, xid_state->xid.key(),
|
if (hash_search(&xid_cache, xid_state->xid.key(), xid_state->xid.key_length()))
|
||||||
xid_state->xid.key_length())==0);
|
{
|
||||||
my_bool res=my_hash_insert(&xid_cache, (uchar*)xid_state);
|
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);
|
pthread_mutex_unlock(&LOCK_xid_cache);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -658,7 +658,12 @@ void Materialized_cursor::fetch(ulong num_rows)
|
||||||
if ((res= table->file->rnd_next(table->record[0])))
|
if ((res= table->file->rnd_next(table->record[0])))
|
||||||
break;
|
break;
|
||||||
/* Send data only if the read was successful. */
|
/* 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) {
|
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_EXECUTE_IF("bug42064_simulate_oom",
|
||||||
DBUG_SET("+d,simulate_out_of_memory"););
|
DBUG_SET("+d,simulate_out_of_memory"););
|
||||||
|
|
@ -1292,11 +1292,10 @@ int MYSQLlex(void *arg, void *yythd)
|
||||||
ulong version;
|
ulong version;
|
||||||
version=strtol(version_str, NULL, 10);
|
version=strtol(version_str, NULL, 10);
|
||||||
|
|
||||||
/* Accept 'M' 'm' 'm' 'd' 'd' */
|
|
||||||
lip->yySkipn(5);
|
|
||||||
|
|
||||||
if (version <= MYSQL_VERSION_ID)
|
if (version <= MYSQL_VERSION_ID)
|
||||||
{
|
{
|
||||||
|
/* Accept 'M' 'm' 'm' 'd' 'd' */
|
||||||
|
lip->yySkipn(5);
|
||||||
/* Expand the content of the special comment as real code */
|
/* Expand the content of the special comment as real code */
|
||||||
lip->set_echo(TRUE);
|
lip->set_echo(TRUE);
|
||||||
state=MY_LEX_START;
|
state=MY_LEX_START;
|
||||||
|
|
@ -1304,7 +1303,16 @@ int MYSQLlex(void *arg, void *yythd)
|
||||||
}
|
}
|
||||||
else
|
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);
|
comment_closed= ! consume_comment(lip, 1);
|
||||||
|
if (! comment_closed)
|
||||||
|
{
|
||||||
|
*pcom= '!';
|
||||||
|
}
|
||||||
/* version allowed to have one level of comment inside. */
|
/* version allowed to have one level of comment inside. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1180,7 +1180,7 @@ public:
|
||||||
@retval FALSE OK
|
@retval FALSE OK
|
||||||
@retval TRUE Error
|
@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.
|
Set the echo mode.
|
||||||
|
|
||||||
|
|
@ -1294,6 +1294,20 @@ public:
|
||||||
m_ptr += n;
|
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.
|
End of file indicator for the query text to parse.
|
||||||
@return true if there are no more characters to parse
|
@return true if there are no more characters to parse
|
||||||
|
|
@ -1440,7 +1454,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** Pointer to the current position in the raw input stream. */
|
/** 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. */
|
/** Starting position of the last token parsed, in the raw buffer. */
|
||||||
const char *m_tok_start;
|
const char *m_tok_start;
|
||||||
|
|
@ -1972,7 +1986,7 @@ public:
|
||||||
@retval FALSE OK
|
@retval FALSE OK
|
||||||
@retval TRUE Error
|
@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);
|
return m_lip.init(thd, buff, length);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4735,7 +4735,7 @@ create_sp_error:
|
||||||
my_error(ER_XAER_NOTA, MYF(0));
|
my_error(ER_XAER_NOTA, MYF(0));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
thd->transaction.xid_state.xa_state=XA_ACTIVE;
|
thd->transaction.xid_state.xa_state= XA_ACTIVE;
|
||||||
my_ok(thd);
|
my_ok(thd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -4755,16 +4755,16 @@ create_sp_error:
|
||||||
my_error(ER_XAER_OUTSIDE, MYF(0));
|
my_error(ER_XAER_OUTSIDE, MYF(0));
|
||||||
break;
|
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());
|
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.rm_error= 0;
|
||||||
thd->transaction.xid_state.xid.set(thd->lex->xid);
|
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->transaction.all.modified_non_trans_table= FALSE;
|
||||||
thd->options= ((thd->options & ~(OPTION_KEEP_LOG)) | OPTION_BEGIN);
|
thd->options= ((thd->options & ~(OPTION_KEEP_LOG)) | OPTION_BEGIN);
|
||||||
thd->server_status|= SERVER_STATUS_IN_TRANS;
|
thd->server_status|= SERVER_STATUS_IN_TRANS;
|
||||||
|
|
@ -4818,6 +4818,16 @@ create_sp_error:
|
||||||
case SQLCOM_XA_COMMIT:
|
case SQLCOM_XA_COMMIT:
|
||||||
if (!thd->transaction.xid_state.xid.eq(thd->lex->xid))
|
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);
|
XID_STATE *xs=xid_cache_search(thd->lex->xid);
|
||||||
if (!xs || xs->in_thd)
|
if (!xs || xs->in_thd)
|
||||||
my_error(ER_XAER_NOTA, MYF(0));
|
my_error(ER_XAER_NOTA, MYF(0));
|
||||||
|
|
@ -5936,13 +5946,13 @@ void mysql_init_multi_delete(LEX *lex)
|
||||||
Parse a query.
|
Parse a query.
|
||||||
|
|
||||||
@param thd Current thread
|
@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 length Length of the query text
|
||||||
@param[out] found_semicolon For multi queries, position of the character of
|
@param[out] found_semicolon For multi queries, position of the character of
|
||||||
the next query in the query text.
|
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)
|
const char ** found_semicolon)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("mysql_parse");
|
DBUG_ENTER("mysql_parse");
|
||||||
|
|
@ -5968,7 +5978,7 @@ void mysql_parse(THD *thd, const char *inBuf, uint length,
|
||||||
lex_start(thd);
|
lex_start(thd);
|
||||||
mysql_reset_thd_for_next_command(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;
|
LEX *lex= thd->lex;
|
||||||
|
|
||||||
|
|
@ -5977,7 +5987,7 @@ void mysql_parse(THD *thd, const char *inBuf, uint length,
|
||||||
|
|
||||||
Parser_state parser_state;
|
Parser_state parser_state;
|
||||||
bool err;
|
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);
|
err= parse_sql(thd, & parser_state, NULL);
|
||||||
*found_semicolon= parser_state.m_lip.found_semicolon;
|
*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
|
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;
|
LEX *lex= thd->lex;
|
||||||
bool error= 0;
|
bool error= 0;
|
||||||
DBUG_ENTER("mysql_test_parse_for_slave");
|
DBUG_ENTER("mysql_test_parse_for_slave");
|
||||||
|
|
||||||
Parser_state parser_state;
|
Parser_state parser_state;
|
||||||
if (!(error= parser_state.init(thd, inBuf, length)))
|
if (!(error= parser_state.init(thd, rawbuf, length)))
|
||||||
{
|
{
|
||||||
lex_start(thd);
|
lex_start(thd);
|
||||||
mysql_reset_thd_for_next_command(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,
|
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,
|
const char *part_state, uint part_state_len,
|
||||||
TABLE* table, bool is_create_table_ind,
|
TABLE* table, bool is_create_table_ind,
|
||||||
handlerton *default_db_type,
|
handlerton *default_db_type,
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ void get_full_part_id_from_key(const TABLE *table, uchar *buf,
|
||||||
KEY *key_info,
|
KEY *key_info,
|
||||||
const key_range *key_spec,
|
const key_range *key_spec,
|
||||||
part_id_range *part_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,
|
uint part_info_len,
|
||||||
const char *part_state, uint part_state_len,
|
const char *part_state, uint part_state_len,
|
||||||
TABLE *table, bool is_create_table_ind,
|
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,
|
&stmt->lex->param_list,
|
||||||
Protocol::SEND_EOF);
|
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);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
#else
|
#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
|
type (the types are supplied at execute). Check that the
|
||||||
supplied type of placeholder can accept a data stream.
|
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);
|
DBUG_RETURN(1);
|
||||||
res= param->query_val_str(&str);
|
res= param->query_val_str(&str);
|
||||||
if (param->convert_str_value(thd))
|
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
|
type (the types are supplied at execute). Check that the
|
||||||
supplied type of placeholder can accept a data stream.
|
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);
|
DBUG_RETURN(1);
|
||||||
if (param->convert_str_value(stmt->thd))
|
if (param->convert_str_value(stmt->thd))
|
||||||
DBUG_RETURN(1); /* out of memory */
|
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
|
#ifndef DBUG_OFF
|
||||||
int left_events = max_binlog_dump_events;
|
int left_events = max_binlog_dump_events;
|
||||||
#endif
|
#endif
|
||||||
|
int old_max_allowed_packet= thd->variables.max_allowed_packet;
|
||||||
DBUG_ENTER("mysql_binlog_send");
|
DBUG_ENTER("mysql_binlog_send");
|
||||||
DBUG_PRINT("enter",("log_ident: '%s' pos: %ld", log_ident, (long) pos));
|
DBUG_PRINT("enter",("log_ident: '%s' pos: %ld", log_ident, (long) pos));
|
||||||
|
|
||||||
|
|
@ -761,6 +762,7 @@ end:
|
||||||
pthread_mutex_lock(&LOCK_thread_count);
|
pthread_mutex_lock(&LOCK_thread_count);
|
||||||
thd->current_linfo = 0;
|
thd->current_linfo = 0;
|
||||||
pthread_mutex_unlock(&LOCK_thread_count);
|
pthread_mutex_unlock(&LOCK_thread_count);
|
||||||
|
thd->variables.max_allowed_packet= old_max_allowed_packet;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
|
@ -778,6 +780,7 @@ err:
|
||||||
pthread_mutex_unlock(&LOCK_thread_count);
|
pthread_mutex_unlock(&LOCK_thread_count);
|
||||||
if (file >= 0)
|
if (file >= 0)
|
||||||
(void) my_close(file, MYF(MY_WME));
|
(void) my_close(file, MYF(MY_WME));
|
||||||
|
thd->variables.max_allowed_packet= old_max_allowed_packet;
|
||||||
|
|
||||||
my_message(my_errno, errmsg, MYF(0));
|
my_message(my_errno, errmsg, MYF(0));
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
|
@ -1418,6 +1421,7 @@ bool mysql_show_binlog_events(THD* thd)
|
||||||
bool ret = TRUE;
|
bool ret = TRUE;
|
||||||
IO_CACHE log;
|
IO_CACHE log;
|
||||||
File file = -1;
|
File file = -1;
|
||||||
|
int old_max_allowed_packet= thd->variables.max_allowed_packet;
|
||||||
DBUG_ENTER("mysql_show_binlog_events");
|
DBUG_ENTER("mysql_show_binlog_events");
|
||||||
|
|
||||||
Log_event::init_show_field_list(&field_list);
|
Log_event::init_show_field_list(&field_list);
|
||||||
|
|
@ -1556,6 +1560,7 @@ err:
|
||||||
pthread_mutex_lock(&LOCK_thread_count);
|
pthread_mutex_lock(&LOCK_thread_count);
|
||||||
thd->current_linfo = 0;
|
thd->current_linfo = 0;
|
||||||
pthread_mutex_unlock(&LOCK_thread_count);
|
pthread_mutex_unlock(&LOCK_thread_count);
|
||||||
|
thd->variables.max_allowed_packet= old_max_allowed_packet;
|
||||||
DBUG_RETURN(ret);
|
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
|
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
|
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
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License along
|
||||||
along with this program; if not, write to the Free Software
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
|
||||||
|
|
||||||
|
|
||||||
/* Function with list databases, tables or fields */
|
/* 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 (res == FIND_FILES_DIR)
|
||||||
{
|
{
|
||||||
if (lex->sql_command != SQLCOM_SELECT)
|
if (sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND)
|
||||||
return 1;
|
return 1;
|
||||||
thd->clear_error();
|
thd->clear_error();
|
||||||
return 2;
|
return 2;
|
||||||
|
|
|
||||||
|
|
@ -441,7 +441,7 @@ typedef struct st_table_share
|
||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
/** @todo: Move into *ha_data for partitioning */
|
/** @todo: Move into *ha_data for partitioning */
|
||||||
bool auto_partitioned;
|
bool auto_partitioned;
|
||||||
const char *partition_info;
|
char *partition_info;
|
||||||
uint partition_info_len;
|
uint partition_info_len;
|
||||||
uint partition_info_buffer_size;
|
uint partition_info_buffer_size;
|
||||||
const char *part_state;
|
const char *part_state;
|
||||||
|
|
|
||||||
|
|
@ -927,6 +927,8 @@ dict_load_table_on_id(
|
||||||
|
|
||||||
ut_ad(mutex_own(&(dict_sys->mutex)));
|
ut_ad(mutex_own(&(dict_sys->mutex)));
|
||||||
|
|
||||||
|
table = NULL;
|
||||||
|
|
||||||
/* NOTE that the operation of this function is protected by
|
/* NOTE that the operation of this function is protected by
|
||||||
the dictionary mutex, and therefore no deadlocks can occur
|
the dictionary mutex, and therefore no deadlocks can occur
|
||||||
with other dictionary operations. */
|
with other dictionary operations. */
|
||||||
|
|
@ -953,15 +955,17 @@ dict_load_table_on_id(
|
||||||
BTR_SEARCH_LEAF, &pcur, &mtr);
|
BTR_SEARCH_LEAF, &pcur, &mtr);
|
||||||
rec = btr_pcur_get_rec(&pcur);
|
rec = btr_pcur_get_rec(&pcur);
|
||||||
|
|
||||||
if (!btr_pcur_is_on_user_rec(&pcur, &mtr)
|
if (!btr_pcur_is_on_user_rec(&pcur, &mtr)) {
|
||||||
|| rec_get_deleted_flag(rec, 0)) {
|
|
||||||
/* Not found */
|
/* Not found */
|
||||||
|
goto func_exit;
|
||||||
|
}
|
||||||
|
|
||||||
btr_pcur_close(&pcur);
|
/* Find the first record that is not delete marked */
|
||||||
mtr_commit(&mtr);
|
while (rec_get_deleted_flag(rec, 0)) {
|
||||||
mem_heap_free(heap);
|
if (!btr_pcur_move_to_next_user_rec(&pcur, &mtr)) {
|
||||||
|
goto func_exit;
|
||||||
return(NULL);
|
}
|
||||||
|
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 */
|
/* Check if the table id in record is the one searched for */
|
||||||
if (ut_dulint_cmp(table_id, mach_read_from_8(field)) != 0) {
|
if (ut_dulint_cmp(table_id, mach_read_from_8(field)) != 0) {
|
||||||
|
goto func_exit;
|
||||||
btr_pcur_close(&pcur);
|
|
||||||
mtr_commit(&mtr);
|
|
||||||
mem_heap_free(heap);
|
|
||||||
|
|
||||||
return(NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now we get the table name from the record */
|
/* Now we get the table name from the record */
|
||||||
field = rec_get_nth_field_old(rec, 1, &len);
|
field = rec_get_nth_field_old(rec, 1, &len);
|
||||||
/* Load the table definition to memory */
|
/* Load the table definition to memory */
|
||||||
table = dict_load_table(mem_heap_strdupl(heap, (char*) field, len));
|
table = dict_load_table(mem_heap_strdupl(heap, (char*) field, len));
|
||||||
|
func_exit:
|
||||||
btr_pcur_close(&pcur);
|
btr_pcur_close(&pcur);
|
||||||
mtr_commit(&mtr);
|
mtr_commit(&mtr);
|
||||||
mem_heap_free(heap);
|
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
|
2010-06-24 The InnoDB Team
|
||||||
|
|
||||||
* handler/ha_innodb.cc:
|
* handler/ha_innodb.cc:
|
||||||
|
|
|
||||||
|
|
@ -4814,7 +4814,7 @@ btr_copy_externally_stored_field(
|
||||||
|
|
||||||
/*******************************************************************//**
|
/*******************************************************************//**
|
||||||
Copies an externally stored field of a record to mem heap.
|
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
|
UNIV_INTERN
|
||||||
byte*
|
byte*
|
||||||
btr_rec_copy_externally_stored_field(
|
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);
|
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,
|
return(btr_copy_externally_stored_field(len, data,
|
||||||
zip_size, local_len, heap));
|
zip_size, local_len, heap));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ Created 2/17/1996 Heikki Tuuri
|
||||||
/** Flag: has the search system been enabled?
|
/** Flag: has the search system been enabled?
|
||||||
Protected by btr_search_latch and btr_search_enabled_mutex. */
|
Protected by btr_search_latch and btr_search_enabled_mutex. */
|
||||||
UNIV_INTERN char btr_search_enabled = TRUE;
|
UNIV_INTERN char btr_search_enabled = TRUE;
|
||||||
|
UNIV_INTERN ibool btr_search_fully_disabled = FALSE;
|
||||||
|
|
||||||
/** Mutex protecting btr_search_enabled */
|
/** Mutex protecting btr_search_enabled */
|
||||||
static mutex_t btr_search_enabled_mutex;
|
static mutex_t btr_search_enabled_mutex;
|
||||||
|
|
@ -201,12 +202,19 @@ btr_search_disable(void)
|
||||||
mutex_enter(&btr_search_enabled_mutex);
|
mutex_enter(&btr_search_enabled_mutex);
|
||||||
rw_lock_x_lock(&btr_search_latch);
|
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;
|
btr_search_enabled = FALSE;
|
||||||
|
|
||||||
/* Clear all block->is_hashed flags and remove all entries
|
/* Clear all block->is_hashed flags and remove all entries
|
||||||
from btr_search_sys->hash_index. */
|
from btr_search_sys->hash_index. */
|
||||||
buf_pool_drop_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. */
|
/* btr_search_enabled_mutex should guarantee this. */
|
||||||
ut_ad(!btr_search_enabled);
|
ut_ad(!btr_search_enabled);
|
||||||
|
|
||||||
|
|
@ -225,6 +233,7 @@ btr_search_enable(void)
|
||||||
rw_lock_x_lock(&btr_search_latch);
|
rw_lock_x_lock(&btr_search_latch);
|
||||||
|
|
||||||
btr_search_enabled = TRUE;
|
btr_search_enabled = TRUE;
|
||||||
|
btr_search_fully_disabled = FALSE;
|
||||||
|
|
||||||
rw_lock_x_unlock(&btr_search_latch);
|
rw_lock_x_unlock(&btr_search_latch);
|
||||||
mutex_exit(&btr_search_enabled_mutex);
|
mutex_exit(&btr_search_enabled_mutex);
|
||||||
|
|
@ -1363,7 +1372,7 @@ btr_search_build_page_hash_index(
|
||||||
|
|
||||||
rw_lock_x_lock(&btr_search_latch);
|
rw_lock_x_lock(&btr_search_latch);
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(!btr_search_enabled)) {
|
if (UNIV_UNLIKELY(btr_search_fully_disabled)) {
|
||||||
goto exit_func;
|
goto exit_func;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,9 +31,7 @@ Created 8/22/1994 Heikki Tuuri
|
||||||
#ifdef UNIV_DEBUG
|
#ifdef UNIV_DEBUG
|
||||||
# include "buf0buf.h"
|
# include "buf0buf.h"
|
||||||
#endif /* UNIV_DEBUG */
|
#endif /* UNIV_DEBUG */
|
||||||
#ifdef UNIV_SYNC_DEBUG
|
#include "btr0sea.h"
|
||||||
# include "btr0sea.h"
|
|
||||||
#endif /* UNIV_SYNC_DEBUG */
|
|
||||||
#include "page0page.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
|
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 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 */
|
@return TRUE if succeed, FALSE if no more memory could be allocated */
|
||||||
UNIV_INTERN
|
UNIV_INTERN
|
||||||
ibool
|
ibool
|
||||||
|
|
@ -174,6 +173,7 @@ ha_insert_for_fold_func(
|
||||||
prev_block->n_pointers--;
|
prev_block->n_pointers--;
|
||||||
block->n_pointers++;
|
block->n_pointers++;
|
||||||
}
|
}
|
||||||
|
ut_ad(!btr_search_fully_disabled);
|
||||||
# endif /* !UNIV_HOTBACKUP */
|
# endif /* !UNIV_HOTBACKUP */
|
||||||
|
|
||||||
prev_node->block = block;
|
prev_node->block = block;
|
||||||
|
|
@ -186,6 +186,13 @@ ha_insert_for_fold_func(
|
||||||
prev_node = prev_node->next;
|
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 */
|
/* We have to allocate a new chain node */
|
||||||
|
|
||||||
node = mem_heap_alloc(hash_get_heap(table, fold), sizeof(ha_node_t));
|
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. */
|
/* Get the current high water mark format. */
|
||||||
innobase_file_format_check = (char*) trx_sys_file_format_max_get();
|
innobase_file_format_check = (char*) trx_sys_file_format_max_get();
|
||||||
|
|
||||||
|
btr_search_fully_disabled = (!btr_search_enabled);
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
error:
|
error:
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
|
|
||||||
|
|
@ -570,7 +570,7 @@ btr_copy_externally_stored_field_prefix(
|
||||||
ulint local_len);/*!< in: length of data, in bytes */
|
ulint local_len);/*!< in: length of data, in bytes */
|
||||||
/*******************************************************************//**
|
/*******************************************************************//**
|
||||||
Copies an externally stored field of a record to mem heap.
|
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
|
UNIV_INTERN
|
||||||
byte*
|
byte*
|
||||||
btr_rec_copy_externally_stored_field(
|
btr_rec_copy_externally_stored_field(
|
||||||
|
|
|
||||||
|
|
@ -190,7 +190,13 @@ btr_search_validate(void);
|
||||||
|
|
||||||
/** Flag: has the search system been enabled?
|
/** Flag: has the search system been enabled?
|
||||||
Protected by btr_search_latch and btr_search_enabled_mutex. */
|
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 */
|
/** The search info struct in an index */
|
||||||
struct btr_search_struct{
|
struct btr_search_struct{
|
||||||
|
|
|
||||||
|
|
@ -100,18 +100,6 @@ mem_pool_get_reserved(
|
||||||
/*==================*/
|
/*==================*/
|
||||||
mem_pool_t* pool); /*!< in: memory pool */
|
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.
|
Validates a memory pool.
|
||||||
@return TRUE if ok */
|
@return TRUE if ok */
|
||||||
UNIV_INTERN
|
UNIV_INTERN
|
||||||
|
|
|
||||||
|
|
@ -622,7 +622,11 @@ struct row_prebuilt_struct {
|
||||||
the secondary index, then this is
|
the secondary index, then this is
|
||||||
set to TRUE */
|
set to TRUE */
|
||||||
unsigned templ_contains_blob:1;/*!< TRUE if the template contains
|
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
|
mysql_row_templ_t* mysql_template;/*!< template used to transform
|
||||||
rows fast between MySQL and Innobase
|
rows fast between MySQL and Innobase
|
||||||
formats; memory for this template
|
formats; memory for this template
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ Created 1/20/1994 Heikki Tuuri
|
||||||
|
|
||||||
#define INNODB_VERSION_MAJOR 1
|
#define INNODB_VERSION_MAJOR 1
|
||||||
#define INNODB_VERSION_MINOR 0
|
#define INNODB_VERSION_MINOR 0
|
||||||
#define INNODB_VERSION_BUGFIX 10
|
#define INNODB_VERSION_BUGFIX 11
|
||||||
|
|
||||||
/* The following is the InnoDB version as shown in
|
/* The following is the InnoDB version as shown in
|
||||||
SELECT plugin_version FROM information_schema.plugins;
|
SELECT plugin_version FROM information_schema.plugins;
|
||||||
|
|
|
||||||
|
|
@ -367,7 +367,7 @@ mem_heap_create_block(
|
||||||
block->line = line;
|
block->line = line;
|
||||||
|
|
||||||
#ifdef MEM_PERIODIC_CHECK
|
#ifdef MEM_PERIODIC_CHECK
|
||||||
mem_pool_mutex_enter();
|
mutex_enter(&(mem_comm_pool->mutex));
|
||||||
|
|
||||||
if (!mem_block_list_inited) {
|
if (!mem_block_list_inited) {
|
||||||
mem_block_list_inited = TRUE;
|
mem_block_list_inited = TRUE;
|
||||||
|
|
@ -376,7 +376,7 @@ mem_heap_create_block(
|
||||||
|
|
||||||
UT_LIST_ADD_LAST(mem_block_list, mem_block_list, block);
|
UT_LIST_ADD_LAST(mem_block_list, mem_block_list, block);
|
||||||
|
|
||||||
mem_pool_mutex_exit();
|
mutex_exit(&(mem_comm_pool->mutex));
|
||||||
#endif
|
#endif
|
||||||
mem_block_set_len(block, len);
|
mem_block_set_len(block, len);
|
||||||
mem_block_set_type(block, type);
|
mem_block_set_type(block, type);
|
||||||
|
|
@ -479,11 +479,11 @@ mem_heap_block_free(
|
||||||
UT_LIST_REMOVE(list, heap->base, block);
|
UT_LIST_REMOVE(list, heap->base, block);
|
||||||
|
|
||||||
#ifdef MEM_PERIODIC_CHECK
|
#ifdef MEM_PERIODIC_CHECK
|
||||||
mem_pool_mutex_enter();
|
mutex_enter(&(mem_comm_pool->mutex));
|
||||||
|
|
||||||
UT_LIST_REMOVE(mem_block_list, mem_block_list, block);
|
UT_LIST_REMOVE(mem_block_list, mem_block_list, block);
|
||||||
|
|
||||||
mem_pool_mutex_exit();
|
mutex_exit(&(mem_comm_pool->mutex));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ut_ad(heap->total_size >= block->len);
|
ut_ad(heap->total_size >= block->len);
|
||||||
|
|
@ -556,7 +556,7 @@ mem_validate_all_blocks(void)
|
||||||
{
|
{
|
||||||
mem_block_t* block;
|
mem_block_t* block;
|
||||||
|
|
||||||
mem_pool_mutex_enter();
|
mutex_enter(&(mem_comm_pool->mutex));
|
||||||
|
|
||||||
block = UT_LIST_GET_FIRST(mem_block_list);
|
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);
|
block = UT_LIST_GET_NEXT(mem_block_list, block);
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_pool_mutex_exit();
|
mutex_exit(&(mem_comm_pool->mutex));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ Created 5/12/1997 Heikki Tuuri
|
||||||
#include "ut0lst.h"
|
#include "ut0lst.h"
|
||||||
#include "ut0byte.h"
|
#include "ut0byte.h"
|
||||||
#include "mem0mem.h"
|
#include "mem0mem.h"
|
||||||
|
#include "srv0start.h"
|
||||||
|
|
||||||
/* We would like to use also the buffer frames to allocate memory. This
|
/* We would like to use also the buffer frames to allocate memory. This
|
||||||
would be desirable, because then the memory consumption of the database
|
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;
|
UNIV_INTERN ulint mem_n_threads_inside = 0;
|
||||||
|
|
||||||
/********************************************************************//**
|
/********************************************************************//**
|
||||||
Reserves the mem pool mutex. */
|
Reserves the mem pool mutex if we are not in server shutdown. Use
|
||||||
UNIV_INTERN
|
this function only in memory free functions, since only memory
|
||||||
|
free functions are used during server shutdown. */
|
||||||
|
UNIV_INLINE
|
||||||
void
|
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. */
|
Releases the mem pool mutex if we are not in server shutdown. As
|
||||||
UNIV_INTERN
|
its corresponding mem_pool_mutex_enter() function, use it only
|
||||||
|
in memory free functions */
|
||||||
|
UNIV_INLINE
|
||||||
void
|
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);
|
n = ut_2_log(size);
|
||||||
|
|
||||||
mutex_enter(&(pool->mutex));
|
mem_pool_mutex_enter(pool);
|
||||||
mem_n_threads_inside++;
|
mem_n_threads_inside++;
|
||||||
|
|
||||||
ut_a(mem_n_threads_inside == 1);
|
ut_a(mem_n_threads_inside == 1);
|
||||||
|
|
@ -595,7 +606,7 @@ mem_area_free(
|
||||||
pool->reserved += ut_2_exp(n);
|
pool->reserved += ut_2_exp(n);
|
||||||
|
|
||||||
mem_n_threads_inside--;
|
mem_n_threads_inside--;
|
||||||
mutex_exit(&(pool->mutex));
|
mem_pool_mutex_exit(pool);
|
||||||
|
|
||||||
mem_area_free(new_ptr, pool);
|
mem_area_free(new_ptr, pool);
|
||||||
|
|
||||||
|
|
@ -611,7 +622,7 @@ mem_area_free(
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_n_threads_inside--;
|
mem_n_threads_inside--;
|
||||||
mutex_exit(&(pool->mutex));
|
mem_pool_mutex_exit(pool);
|
||||||
|
|
||||||
ut_ad(mem_pool_validate(pool));
|
ut_ad(mem_pool_validate(pool));
|
||||||
}
|
}
|
||||||
|
|
@ -630,7 +641,7 @@ mem_pool_validate(
|
||||||
ulint free;
|
ulint free;
|
||||||
ulint i;
|
ulint i;
|
||||||
|
|
||||||
mutex_enter(&(pool->mutex));
|
mem_pool_mutex_enter(pool);
|
||||||
|
|
||||||
free = 0;
|
free = 0;
|
||||||
|
|
||||||
|
|
@ -658,7 +669,7 @@ mem_pool_validate(
|
||||||
|
|
||||||
ut_a(free + pool->reserved == pool->size);
|
ut_a(free + pool->reserved == pool->size);
|
||||||
|
|
||||||
mutex_exit(&(pool->mutex));
|
mem_pool_mutex_exit(pool);
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1780,6 +1780,11 @@ row_merge_copy_blobs(
|
||||||
(below). */
|
(below). */
|
||||||
data = btr_rec_copy_externally_stored_field(
|
data = btr_rec_copy_externally_stored_field(
|
||||||
mrec, offsets, zip_size, i, &len, heap);
|
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);
|
dfield_set_data(field, data, len);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -294,7 +294,13 @@ row_build(
|
||||||
|
|
||||||
ut_ad(dtuple_check_typed(row));
|
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,
|
*ext = row_ext_create(j, ext_cols, row,
|
||||||
dict_table_zip_size(index->table),
|
dict_table_zip_size(index->table),
|
||||||
heap);
|
heap);
|
||||||
|
|
|
||||||
|
|
@ -416,7 +416,7 @@ row_sel_fetch_columns(
|
||||||
field_no))) {
|
field_no))) {
|
||||||
|
|
||||||
/* Copy an externally stored field to the
|
/* Copy an externally stored field to the
|
||||||
temporary heap */
|
temporary heap, if possible. */
|
||||||
|
|
||||||
heap = mem_heap_create(1);
|
heap = mem_heap_create(1);
|
||||||
|
|
||||||
|
|
@ -425,6 +425,17 @@ row_sel_fetch_columns(
|
||||||
dict_table_zip_size(index->table),
|
dict_table_zip_size(index->table),
|
||||||
field_no, &len, heap);
|
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);
|
ut_a(len != UNIV_SQL_NULL);
|
||||||
|
|
||||||
needs_copy = TRUE;
|
needs_copy = TRUE;
|
||||||
|
|
@ -926,6 +937,7 @@ row_sel_get_clust_rec(
|
||||||
when plan->clust_pcur was positioned. The latch will not be
|
when plan->clust_pcur was positioned. The latch will not be
|
||||||
released until mtr_commit(mtr). */
|
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,
|
row_sel_fetch_columns(index, clust_rec, offsets,
|
||||||
UT_LIST_GET_FIRST(plan->columns));
|
UT_LIST_GET_FIRST(plan->columns));
|
||||||
*out_rec = clust_rec;
|
*out_rec = clust_rec;
|
||||||
|
|
@ -1628,6 +1640,13 @@ skip_lock:
|
||||||
}
|
}
|
||||||
|
|
||||||
if (old_vers == NULL) {
|
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(
|
offsets = rec_get_offsets(
|
||||||
rec, index, offsets,
|
rec, index, offsets,
|
||||||
ULINT_UNDEFINED, &heap);
|
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
|
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
|
columns to mysql_rec, other columns are left blank. All columns may not
|
||||||
be needed in the query.
|
be needed in the query.
|
||||||
@return TRUE if success, FALSE if could not allocate memory for a BLOB
|
@return TRUE on success, FALSE if not all columns could be retrieved */
|
||||||
(though we may also assert in that case) */
|
static __attribute__((warn_unused_result))
|
||||||
static
|
|
||||||
ibool
|
ibool
|
||||||
row_sel_store_mysql_rec(
|
row_sel_store_mysql_rec(
|
||||||
/*====================*/
|
/*====================*/
|
||||||
|
|
@ -2672,6 +2690,7 @@ row_sel_store_mysql_rec(
|
||||||
ut_ad(prebuilt->mysql_template);
|
ut_ad(prebuilt->mysql_template);
|
||||||
ut_ad(prebuilt->default_rec);
|
ut_ad(prebuilt->default_rec);
|
||||||
ut_ad(rec_offs_validate(rec, NULL, offsets));
|
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)) {
|
if (UNIV_LIKELY_NULL(prebuilt->blob_heap)) {
|
||||||
mem_heap_free(prebuilt->blob_heap);
|
mem_heap_free(prebuilt->blob_heap);
|
||||||
|
|
@ -2719,6 +2738,21 @@ row_sel_store_mysql_rec(
|
||||||
dict_table_zip_size(prebuilt->table),
|
dict_table_zip_size(prebuilt->table),
|
||||||
templ->rec_field_no, &len, heap);
|
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);
|
ut_a(len != UNIV_SQL_NULL);
|
||||||
} else {
|
} else {
|
||||||
/* Field is stored in the row. */
|
/* 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. */
|
Pushes a row for MySQL to the fetch cache.
|
||||||
UNIV_INLINE
|
@return TRUE on success, FALSE if the record contains incomplete BLOBs */
|
||||||
void
|
UNIV_INLINE __attribute__((warn_unused_result))
|
||||||
|
ibool
|
||||||
row_sel_push_cache_row_for_mysql(
|
row_sel_push_cache_row_for_mysql(
|
||||||
/*=============================*/
|
/*=============================*/
|
||||||
row_prebuilt_t* prebuilt, /*!< in: prebuilt struct */
|
row_prebuilt_t* prebuilt, /*!< in: prebuilt struct */
|
||||||
|
|
@ -3180,10 +3215,11 @@ row_sel_push_cache_row_for_mysql(
|
||||||
prebuilt->fetch_cache[
|
prebuilt->fetch_cache[
|
||||||
prebuilt->n_fetch_cached],
|
prebuilt->n_fetch_cached],
|
||||||
prebuilt, rec, offsets))) {
|
prebuilt, rec, offsets))) {
|
||||||
ut_error;
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
prebuilt->n_fetch_cached++;
|
prebuilt->n_fetch_cached++;
|
||||||
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************//**
|
/*********************************************************************//**
|
||||||
|
|
@ -3578,11 +3614,21 @@ row_search_for_mysql(
|
||||||
|
|
||||||
if (!row_sel_store_mysql_rec(buf, prebuilt,
|
if (!row_sel_store_mysql_rec(buf, prebuilt,
|
||||||
rec, offsets)) {
|
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
|
/* Proceed as in case SEL_RETRY. */
|
||||||
error handling */
|
break;
|
||||||
goto shortcut_fails_too_big_rec;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mtr_commit(&mtr);
|
mtr_commit(&mtr);
|
||||||
|
|
@ -3622,7 +3668,7 @@ release_search_latch_if_needed:
|
||||||
default:
|
default:
|
||||||
ut_ad(0);
|
ut_ad(0);
|
||||||
}
|
}
|
||||||
shortcut_fails_too_big_rec:
|
|
||||||
mtr_commit(&mtr);
|
mtr_commit(&mtr);
|
||||||
mtr_start(&mtr);
|
mtr_start(&mtr);
|
||||||
}
|
}
|
||||||
|
|
@ -4357,9 +4403,18 @@ requires_clust_rec:
|
||||||
not cache rows because there the cursor is a scrollable
|
not cache rows because there the cursor is a scrollable
|
||||||
cursor. */
|
cursor. */
|
||||||
|
|
||||||
row_sel_push_cache_row_for_mysql(prebuilt, result_rec,
|
if (!row_sel_push_cache_row_for_mysql(prebuilt, result_rec,
|
||||||
offsets);
|
offsets)) {
|
||||||
if (prebuilt->n_fetch_cached == MYSQL_FETCH_CACHE_SIZE) {
|
/* 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;
|
goto got_row;
|
||||||
}
|
}
|
||||||
|
|
@ -4375,9 +4430,17 @@ requires_clust_rec:
|
||||||
} else {
|
} else {
|
||||||
if (!row_sel_store_mysql_rec(buf, prebuilt,
|
if (!row_sel_store_mysql_rec(buf, prebuilt,
|
||||||
result_rec, offsets)) {
|
result_rec, offsets)) {
|
||||||
err = DB_TOO_BIG_RECORD;
|
/* Only fresh inserts may contain
|
||||||
|
incomplete externally stored
|
||||||
goto lock_wait_or_error;
|
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;
|
ret = FALSE;
|
||||||
} else {
|
} 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,
|
node->row = row_build(ROW_COPY_DATA, clust_index, rec,
|
||||||
offsets, NULL, &node->ext, node->heap);
|
offsets, NULL, ext, node->heap);
|
||||||
if (node->update) {
|
if (node->update) {
|
||||||
node->undo_row = dtuple_copy(node->row, node->heap);
|
node->undo_row = dtuple_copy(node->row, node->heap);
|
||||||
row_upd_replace(node->undo_row, &node->undo_ext,
|
row_upd_replace(node->undo_row, &node->undo_ext,
|
||||||
|
|
|
||||||
|
|
@ -1398,6 +1398,7 @@ row_upd_store_row(
|
||||||
dict_index_t* clust_index;
|
dict_index_t* clust_index;
|
||||||
rec_t* rec;
|
rec_t* rec;
|
||||||
mem_heap_t* heap = NULL;
|
mem_heap_t* heap = NULL;
|
||||||
|
row_ext_t** ext;
|
||||||
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
||||||
const ulint* offsets;
|
const ulint* offsets;
|
||||||
rec_offs_init(offsets_);
|
rec_offs_init(offsets_);
|
||||||
|
|
@ -1414,8 +1415,22 @@ row_upd_store_row(
|
||||||
|
|
||||||
offsets = rec_get_offsets(rec, clust_index, offsets_,
|
offsets = rec_get_offsets(rec, clust_index, offsets_,
|
||||||
ULINT_UNDEFINED, &heap);
|
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,
|
node->row = row_build(ROW_COPY_DATA, clust_index, rec, offsets,
|
||||||
NULL, &node->ext, node->heap);
|
NULL, ext, node->heap);
|
||||||
if (node->is_delete) {
|
if (node->is_delete) {
|
||||||
node->upd_row = NULL;
|
node->upd_row = NULL;
|
||||||
node->upd_ext = NULL;
|
node->upd_ext = NULL;
|
||||||
|
|
|
||||||
|
|
@ -2018,9 +2018,13 @@ innobase_shutdown_for_mysql(void)
|
||||||
pars_lexer_close();
|
pars_lexer_close();
|
||||||
log_mem_free();
|
log_mem_free();
|
||||||
buf_pool_free();
|
buf_pool_free();
|
||||||
ut_free_all_mem();
|
|
||||||
mem_close();
|
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
|
if (os_thread_count != 0
|
||||||
|| os_event_count != 0
|
|| os_event_count != 0
|
||||||
|| os_mutex_count != 0
|
|| os_mutex_count != 0
|
||||||
|
|
|
||||||
|
|
@ -377,86 +377,6 @@ static int my_strxfrm_big5(uchar *dest, const uchar *src, int len)
|
||||||
#endif
|
#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)),
|
static uint ismbchar_big5(CHARSET_INFO *cs __attribute__((unused)),
|
||||||
const char* p, const char *e)
|
const char* p, const char *e)
|
||||||
{
|
{
|
||||||
|
|
@ -6338,7 +6258,7 @@ static MY_COLLATION_HANDLER my_collation_big5_chinese_ci_handler =
|
||||||
my_strnncollsp_big5,
|
my_strnncollsp_big5,
|
||||||
my_strnxfrm_big5,
|
my_strnxfrm_big5,
|
||||||
my_strnxfrmlen_simple,
|
my_strnxfrmlen_simple,
|
||||||
my_like_range_big5,
|
my_like_range_mb,
|
||||||
my_wildcmp_mb,
|
my_wildcmp_mb,
|
||||||
my_strcasecmp_mb,
|
my_strcasecmp_mb,
|
||||||
my_instr_mb,
|
my_instr_mb,
|
||||||
|
|
@ -6402,7 +6322,7 @@ CHARSET_INFO my_charset_big5_chinese_ci=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xF9D5, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
1, /* escape_with_backslash_is_dangerous */
|
1, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_big5_handler,
|
&my_charset_big5_handler,
|
||||||
|
|
@ -6435,7 +6355,7 @@ CHARSET_INFO my_charset_big5_bin=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xF9FE, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
1, /* escape_with_backslash_is_dangerous */
|
1, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_big5_handler,
|
&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 */
|
/* page 0 0x00A1-0x00DF */
|
||||||
static uint16 tab_cp932_uni0[]={
|
static uint16 tab_cp932_uni0[]={
|
||||||
0xFF61,0xFF62,0xFF63,0xFF64,0xFF65,0xFF66,0xFF67,0xFF68,
|
0xFF61,0xFF62,0xFF63,0xFF64,0xFF65,0xFF66,0xFF67,0xFF68,
|
||||||
|
|
@ -5467,7 +5397,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler =
|
||||||
my_strnncollsp_cp932,
|
my_strnncollsp_cp932,
|
||||||
my_strnxfrm_cp932,
|
my_strnxfrm_cp932,
|
||||||
my_strnxfrmlen_simple,
|
my_strnxfrmlen_simple,
|
||||||
my_like_range_cp932,
|
my_like_range_mb,
|
||||||
my_wildcmp_mb, /* wildcmp */
|
my_wildcmp_mb, /* wildcmp */
|
||||||
my_strcasecmp_8bit,
|
my_strcasecmp_8bit,
|
||||||
my_instr_mb,
|
my_instr_mb,
|
||||||
|
|
@ -5533,7 +5463,7 @@ CHARSET_INFO my_charset_cp932_japanese_ci=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFCFC, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
1, /* escape_with_backslash_is_dangerous */
|
1, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
@ -5565,7 +5495,7 @@ CHARSET_INFO my_charset_cp932_bin=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFCFC, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
1, /* escape_with_backslash_is_dangerous */
|
1, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
|
||||||
|
|
@ -8762,7 +8762,7 @@ CHARSET_INFO my_charset_euckr_korean_ci=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFEFE, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
0, /* escape_with_backslash_is_dangerous */
|
0, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
@ -8795,7 +8795,7 @@ CHARSET_INFO my_charset_euckr_bin=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFEFE, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
0, /* escape_with_backslash_is_dangerous */
|
0, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
|
||||||
|
|
@ -8710,7 +8710,7 @@ CHARSET_INFO my_charset_eucjpms_japanese_ci=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFEFE, /* max_sort_char */
|
||||||
' ', /* pad_char */
|
' ', /* pad_char */
|
||||||
0, /* escape_with_backslash_is_dangerous */
|
0, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
@ -8743,7 +8743,7 @@ CHARSET_INFO my_charset_eucjpms_bin=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFEFE, /* max_sort_char */
|
||||||
' ', /* pad_char */
|
' ', /* pad_char */
|
||||||
0, /* escape_with_backslash_is_dangerous */
|
0, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
|
||||||
|
|
@ -5790,7 +5790,7 @@ CHARSET_INFO my_charset_gb2312_chinese_ci=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xF7FE, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
0, /* escape_with_backslash_is_dangerous */
|
0, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
@ -5822,7 +5822,7 @@ CHARSET_INFO my_charset_gb2312_bin=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xF7FE, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
0, /* escape_with_backslash_is_dangerous */
|
0, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&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)),
|
static uint ismbchar_gbk(CHARSET_INFO *cs __attribute__((unused)),
|
||||||
const char* p, const char *e)
|
const char* p, const char *e)
|
||||||
{
|
{
|
||||||
|
|
@ -9983,7 +9903,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler =
|
||||||
my_strnncollsp_gbk,
|
my_strnncollsp_gbk,
|
||||||
my_strnxfrm_gbk,
|
my_strnxfrm_gbk,
|
||||||
my_strnxfrmlen_simple,
|
my_strnxfrmlen_simple,
|
||||||
my_like_range_gbk,
|
my_like_range_mb,
|
||||||
my_wildcmp_mb,
|
my_wildcmp_mb,
|
||||||
my_strcasecmp_mb,
|
my_strcasecmp_mb,
|
||||||
my_instr_mb,
|
my_instr_mb,
|
||||||
|
|
@ -10048,7 +9968,7 @@ CHARSET_INFO my_charset_gbk_chinese_ci=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xA967, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
1, /* escape_with_backslash_is_dangerous */
|
1, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
@ -10080,7 +10000,7 @@ CHARSET_INFO my_charset_gbk_bin=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFEFE, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
1, /* escape_with_backslash_is_dangerous */
|
1, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
|
||||||
|
|
@ -498,7 +498,9 @@ static void my_hash_sort_mb_bin(CHARSET_INFO *cs __attribute__((unused)),
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Write max key:
|
Write max key:
|
||||||
- for non-Unicode character sets:
|
- 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):
|
- for Unicode character set (utf-8):
|
||||||
create a buffer with multibyte representation of the max_sort_char
|
create a buffer with multibyte representation of the max_sort_char
|
||||||
character, and copy it into max_str in a loop.
|
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))
|
if (!(cs->state & MY_CS_UNICODE))
|
||||||
{
|
{
|
||||||
bfill(str, end - str, 255);
|
if (cs->max_sort_char <= 255)
|
||||||
return;
|
{
|
||||||
|
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);
|
DBUG_ASSERT(buflen > 0);
|
||||||
do
|
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 */
|
/* page 0 0x00A1-0x00DF */
|
||||||
static uint16 tab_sjis_uni0[]={
|
static uint16 tab_sjis_uni0[]={
|
||||||
0xFF61,0xFF62,0xFF63,0xFF64,0xFF65,0xFF66,0xFF67,0xFF68,
|
0xFF61,0xFF62,0xFF63,0xFF64,0xFF65,0xFF66,0xFF67,0xFF68,
|
||||||
|
|
@ -4628,7 +4549,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler =
|
||||||
my_strnncollsp_sjis,
|
my_strnncollsp_sjis,
|
||||||
my_strnxfrm_sjis,
|
my_strnxfrm_sjis,
|
||||||
my_strnxfrmlen_simple,
|
my_strnxfrmlen_simple,
|
||||||
my_like_range_sjis,
|
my_like_range_mb,
|
||||||
my_wildcmp_mb, /* wildcmp */
|
my_wildcmp_mb, /* wildcmp */
|
||||||
my_strcasecmp_8bit,
|
my_strcasecmp_8bit,
|
||||||
my_instr_mb,
|
my_instr_mb,
|
||||||
|
|
@ -4694,7 +4615,7 @@ CHARSET_INFO my_charset_sjis_japanese_ci=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFCFC, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
1, /* escape_with_backslash_is_dangerous */
|
1, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
@ -4726,7 +4647,7 @@ CHARSET_INFO my_charset_sjis_bin=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFCFC, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
1, /* escape_with_backslash_is_dangerous */
|
1, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
|
||||||
|
|
@ -8567,7 +8567,7 @@ CHARSET_INFO my_charset_ujis_japanese_ci=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFEFE, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
0, /* escape_with_backslash_is_dangerous */
|
0, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
@ -8600,7 +8600,7 @@ CHARSET_INFO my_charset_ujis_bin=
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFEFE, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
0, /* escape_with_backslash_is_dangerous */
|
0, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_handler,
|
&my_charset_handler,
|
||||||
|
|
|
||||||
|
|
@ -13246,37 +13246,52 @@ static void test_bug15518()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void disable_general_log()
|
static void disable_query_logs()
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
rc= mysql_query(mysql, "set @@global.general_log=off");
|
rc= mysql_query(mysql, "set @@global.general_log=off");
|
||||||
myquery(rc);
|
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;
|
int rc;
|
||||||
|
|
||||||
rc= mysql_query(mysql, "set @save_global_general_log=@@global.general_log");
|
rc= mysql_query(mysql, "set @save_global_general_log=@@global.general_log");
|
||||||
myquery(rc);
|
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");
|
rc= mysql_query(mysql, "set @@global.general_log=on");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
|
rc= mysql_query(mysql, "set @@global.slow_query_log=on");
|
||||||
|
myquery(rc);
|
||||||
|
|
||||||
|
|
||||||
if (truncate)
|
if (truncate)
|
||||||
{
|
{
|
||||||
rc= mysql_query(mysql, "truncate mysql.general_log");
|
rc= mysql_query(mysql, "truncate mysql.general_log");
|
||||||
myquery(rc);
|
myquery(rc);
|
||||||
|
|
||||||
|
rc= mysql_query(mysql, "truncate mysql.slow_log");
|
||||||
|
myquery(rc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void restore_general_log()
|
static void restore_query_logs()
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
rc= mysql_query(mysql, "set @@global.general_log=@save_global_general_log");
|
rc= mysql_query(mysql, "set @@global.general_log=@save_global_general_log");
|
||||||
myquery(rc);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
enable_general_log(1);
|
enable_query_logs(1);
|
||||||
|
|
||||||
for (statement_cursor= statements; statement_cursor->buffer != NULL;
|
for (statement_cursor= statements; statement_cursor->buffer != NULL;
|
||||||
statement_cursor++)
|
statement_cursor++)
|
||||||
|
|
@ -15527,7 +15542,7 @@ static void test_bug17667()
|
||||||
statement_cursor->buffer);
|
statement_cursor->buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
restore_general_log();
|
restore_query_logs();
|
||||||
|
|
||||||
if (!opt_silent)
|
if (!opt_silent)
|
||||||
printf("success. All queries found intact in the log.\n");
|
printf("success. All queries found intact in the log.\n");
|
||||||
|
|
@ -17390,7 +17405,7 @@ static void test_bug28386()
|
||||||
}
|
}
|
||||||
mysql_free_result(result);
|
mysql_free_result(result);
|
||||||
|
|
||||||
enable_general_log(1);
|
enable_query_logs(1);
|
||||||
|
|
||||||
stmt= mysql_simple_prepare(mysql, "SELECT ?");
|
stmt= mysql_simple_prepare(mysql, "SELECT ?");
|
||||||
check_stmt(stmt);
|
check_stmt(stmt);
|
||||||
|
|
@ -17429,7 +17444,7 @@ static void test_bug28386()
|
||||||
|
|
||||||
mysql_free_result(result);
|
mysql_free_result(result);
|
||||||
|
|
||||||
restore_general_log();
|
restore_query_logs();
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
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
|
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;
|
int rc;
|
||||||
MYSQL_STMT *stmt;
|
MYSQL_STMT *stmt;
|
||||||
|
|
@ -18230,7 +18245,7 @@ static void test_bug54041()
|
||||||
rc= mysql_query(mysql, "CREATE TABLE t1 (a INT)");
|
rc= mysql_query(mysql, "CREATE TABLE t1 (a INT)");
|
||||||
myquery(rc);
|
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);
|
check_stmt(stmt);
|
||||||
verify_param_count(stmt, 1);
|
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
|
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[]= {
|
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 },
|
{ "test_view_sp_list_fields", test_view_sp_list_fields },
|
||||||
{ "client_query", client_query },
|
{ "client_query", client_query },
|
||||||
{ "test_prepare_insert_update", test_prepare_insert_update},
|
{ "test_prepare_insert_update", test_prepare_insert_update},
|
||||||
|
|
|
||||||
|
|
@ -13,12 +13,12 @@
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
# 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
|
EXTRA_DIST = unit.pl
|
||||||
CLEANFILES = unit
|
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:
|
test:
|
||||||
perl unit.pl run $(unittests)
|
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…
Add table
Add a link
Reference in a new issue