mirror of
https://github.com/MariaDB/server.git
synced 2025-01-28 09:44:17 +01:00
Merge mysql.com:/home/jimw/my/mysql-5.0-clean
into mysql.com:/home/jimw/my/mysql-5.1-clean include/my_pthread.h: Auto merged mysql-test/r/func_str.result: Auto merged mysql-test/r/join_outer.result: Auto merged mysql-test/r/subselect.result: Auto merged mysql-test/r/variables.result: Auto merged mysql-test/r/view.result: Auto merged mysql-test/t/rpl_temporary.test: Auto merged mysql-test/t/variables.test: Auto merged mysql-test/t/view.test: Auto merged sql/item.cc: Auto merged sql/item.h: Auto merged sql/item_cmpfunc.cc: Auto merged sql/item_func.cc: Auto merged sql/item_strfunc.h: Auto merged sql/item_subselect.cc: Auto merged sql/mysql_priv.h: Auto merged sql/mysqld.cc: Auto merged sql/set_var.h: Auto merged sql/sql_acl.cc: Auto merged storage/ndb/test/ndbapi/Makefile.am: Auto merged storage/ndb/test/ndbapi/testInterpreter.cpp: Auto merged sql/set_var.cc: Resolve conflict storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp: Resolve conflict
This commit is contained in:
commit
650fea23b1
29 changed files with 554 additions and 81 deletions
include
mysql-test
r
t
sql
item.ccitem.hitem_cmpfunc.ccitem_func.ccitem_strfunc.hitem_subselect.ccmysql_priv.hmysqld.ccset_var.ccset_var.hsql_acl.cc
storage/ndb
|
@ -226,12 +226,14 @@ int sigwait(sigset_t *setp, int *sigp); /* Use our implemention */
|
|||
we want to make sure that no such flags are set.
|
||||
*/
|
||||
#if defined(HAVE_SIGACTION) && !defined(my_sigset)
|
||||
#define my_sigset(A,B) do { struct sigaction s; sigset_t set; \
|
||||
#define my_sigset(A,B) do { struct sigaction s; sigset_t set; int rc; \
|
||||
DBUG_ASSERT((A) != 0); \
|
||||
sigemptyset(&set); \
|
||||
s.sa_handler = (B); \
|
||||
s.sa_mask = set; \
|
||||
s.sa_flags = 0; \
|
||||
sigaction((A), &s, (struct sigaction *) NULL); \
|
||||
rc= sigaction((A), &s, (struct sigaction *) NULL);\
|
||||
DBUG_ASSERT(rc == 0); \
|
||||
} while (0)
|
||||
#elif defined(HAVE_SIGSET) && !defined(my_sigset)
|
||||
#define my_sigset(A,B) sigset((A),(B))
|
||||
|
|
|
@ -20,12 +20,6 @@
|
|||
"Enable SSL for connection (automatically enabled with other flags). Disable with --skip-ssl.",
|
||||
(gptr*) &opt_use_ssl, (gptr*) &opt_use_ssl, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
||||
0, 0, 0},
|
||||
{"ssl-key", OPT_SSL_KEY, "X509 key in PEM format (implies --ssl).",
|
||||
(gptr*) &opt_ssl_key, (gptr*) &opt_ssl_key, 0, GET_STR, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"ssl-cert", OPT_SSL_CERT, "X509 cert in PEM format (implies --ssl).",
|
||||
(gptr*) &opt_ssl_cert, (gptr*) &opt_ssl_cert, 0, GET_STR, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"ssl-ca", OPT_SSL_CA,
|
||||
"CA file in PEM format (check OpenSSL docs, implies --ssl).",
|
||||
(gptr*) &opt_ssl_ca, (gptr*) &opt_ssl_ca, 0, GET_STR, REQUIRED_ARG,
|
||||
|
@ -34,9 +28,15 @@
|
|||
"CA directory (check OpenSSL docs, implies --ssl).",
|
||||
(gptr*) &opt_ssl_capath, (gptr*) &opt_ssl_capath, 0, GET_STR, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"ssl-cert", OPT_SSL_CERT, "X509 cert in PEM format (implies --ssl).",
|
||||
(gptr*) &opt_ssl_cert, (gptr*) &opt_ssl_cert, 0, GET_STR, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"ssl-cipher", OPT_SSL_CIPHER, "SSL cipher to use (implies --ssl).",
|
||||
(gptr*) &opt_ssl_cipher, (gptr*) &opt_ssl_cipher, 0, GET_STR, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"ssl-key", OPT_SSL_KEY, "X509 key in PEM format (implies --ssl).",
|
||||
(gptr*) &opt_ssl_key, (gptr*) &opt_ssl_key, 0, GET_STR, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
#ifdef MYSQL_CLIENT
|
||||
{"ssl-verify-server-cert", OPT_SSL_VERIFY_SERVER_CERT,
|
||||
"Verify server's \"Common Name\" in its cert against hostname used when connecting. This option is disabled by default.",
|
||||
|
|
|
@ -15,13 +15,18 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#ifdef HAVE_OPENSSL
|
||||
static my_bool opt_use_ssl = 0;
|
||||
static char *opt_ssl_key = 0;
|
||||
static char *opt_ssl_cert = 0;
|
||||
static char *opt_ssl_ca = 0;
|
||||
static char *opt_ssl_capath = 0;
|
||||
static char *opt_ssl_cipher = 0;
|
||||
#ifdef SSL_VARS_NOT_STATIC
|
||||
#define SSL_STATIC
|
||||
#else
|
||||
#define SSL_STATIC static
|
||||
#endif
|
||||
SSL_STATIC my_bool opt_use_ssl = 0;
|
||||
SSL_STATIC char *opt_ssl_ca = 0;
|
||||
SSL_STATIC char *opt_ssl_capath = 0;
|
||||
SSL_STATIC char *opt_ssl_cert = 0;
|
||||
SSL_STATIC char *opt_ssl_cipher = 0;
|
||||
SSL_STATIC char *opt_ssl_key = 0;
|
||||
#ifdef MYSQL_CLIENT
|
||||
static my_bool opt_ssl_verify_server_cert= 0;
|
||||
SSL_STATIC my_bool opt_ssl_verify_server_cert= 0;
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -1046,4 +1046,10 @@ cast(ltrim(' 20.06 ') as decimal(19,2))
|
|||
select cast(rtrim(ltrim(' 20.06 ')) as decimal(19,2));
|
||||
cast(rtrim(ltrim(' 20.06 ')) as decimal(19,2))
|
||||
20.06
|
||||
select conv("18383815659218730760",10,10) + 0;
|
||||
conv("18383815659218730760",10,10) + 0
|
||||
1.8383815659219e+19
|
||||
select "18383815659218730760" + 0;
|
||||
"18383815659218730760" + 0
|
||||
1.8383815659219e+19
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -12,7 +12,7 @@ explain extended select count(a) as b from t1 where a=0 having b >=0;
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
Warnings:
|
||||
Note 1003 select count(`test`.`t1`.`a`) AS `b` from `test`.`t1` where 0 having (count(`test`.`t1`.`a`) >= 0)
|
||||
Note 1003 select count(`test`.`t1`.`a`) AS `b` from `test`.`t1` where 0 having (`b` >= 0)
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
raw_id int(10) NOT NULL default '0',
|
||||
|
|
|
@ -1151,8 +1151,8 @@ EXPLAIN
|
|||
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
|
||||
WHERE t1.name LIKE 'A%' OR FALSE;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index PRIMARY,name name 23 NULL 3 Using where; Using index
|
||||
1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using where; Using index
|
||||
1 SIMPLE t2 index NULL fkey 5 NULL 5 Using index
|
||||
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.fkey 1 Using where
|
||||
DROP TABLE t1,t2;
|
||||
DROP VIEW IF EXISTS v1,v2;
|
||||
DROP TABLE IF EXISTS t1,t2;
|
||||
|
@ -1176,3 +1176,38 @@ a b
|
|||
3 3
|
||||
DROP VIEW v1,v2;
|
||||
DROP TABLE t1,t2;
|
||||
CREATE TABLE t1 (a int);
|
||||
CREATE TABLE t2 (b int);
|
||||
INSERT INTO t1 VALUES (1), (2), (3), (4);
|
||||
INSERT INTO t2 VALUES (2), (3);
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1=1);
|
||||
a b
|
||||
1 NULL
|
||||
2 2
|
||||
3 3
|
||||
4 NULL
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1 OR 1);
|
||||
a b
|
||||
1 NULL
|
||||
2 2
|
||||
3 3
|
||||
4 NULL
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (0 OR 1);
|
||||
a b
|
||||
1 NULL
|
||||
2 2
|
||||
3 3
|
||||
4 NULL
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1=1 OR 2=2);
|
||||
a b
|
||||
1 NULL
|
||||
2 2
|
||||
3 3
|
||||
4 NULL
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1=1 OR 1=0);
|
||||
a b
|
||||
1 NULL
|
||||
2 2
|
||||
3 3
|
||||
4 NULL
|
||||
DROP TABLE t1,t2;
|
||||
|
|
|
@ -3177,3 +3177,9 @@ ERROR 42S22: Unknown column 'no_such_column' in 'where clause'
|
|||
SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1);
|
||||
ERROR 42S22: Unknown column 'no_such_column' in 'IN/ALL/ANY subquery'
|
||||
DROP TABLE t1;
|
||||
create table t1 (i int, j bigint);
|
||||
insert into t1 values (1, 2), (2, 2), (3, 2);
|
||||
select * from (select min(i) from t1 where j=(select * from (select min(j) from t1) t2)) t3;
|
||||
min(i)
|
||||
1
|
||||
drop table t1;
|
||||
|
|
|
@ -639,6 +639,35 @@ select @@version, @@version_comment, @@version_compile_machine,
|
|||
@@version_compile_os;
|
||||
@@version @@version_comment @@version_compile_machine @@version_compile_os
|
||||
# # # #
|
||||
select @@basedir, @@datadir, @@tmpdir;
|
||||
@@basedir @@datadir @@tmpdir
|
||||
# # #
|
||||
show variables like 'basedir';
|
||||
Variable_name Value
|
||||
basedir #
|
||||
show variables like 'datadir';
|
||||
Variable_name Value
|
||||
datadir #
|
||||
show variables like 'tmpdir';
|
||||
Variable_name Value
|
||||
tmpdir #
|
||||
select @@ssl_ca, @@ssl_capath, @@ssl_cert, @@ssl_cipher, @@ssl_key;
|
||||
@@ssl_ca @@ssl_capath @@ssl_cert @@ssl_cipher @@ssl_key
|
||||
# # # # #
|
||||
show variables like 'ssl%';
|
||||
Variable_name Value
|
||||
ssl_ca #
|
||||
ssl_capath #
|
||||
ssl_cert #
|
||||
ssl_cipher #
|
||||
ssl_key #
|
||||
select @@log_queries_not_using_indexes;
|
||||
@@log_queries_not_using_indexes
|
||||
0
|
||||
show variables like 'log_queries_not_using_indexes';
|
||||
Variable_name Value
|
||||
log_queries_not_using_indexes OFF
|
||||
End of 5.0 tests
|
||||
set global binlog_cache_size =@my_binlog_cache_size;
|
||||
set global connect_timeout =@my_connect_timeout;
|
||||
set global delayed_insert_timeout =@my_delayed_insert_timeout;
|
||||
|
@ -666,4 +695,3 @@ set global server_id =@my_server_id;
|
|||
set global slow_launch_time =@my_slow_launch_time;
|
||||
set global storage_engine =@my_storage_engine;
|
||||
set global thread_cache_size =@my_thread_cache_size;
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -2660,3 +2660,37 @@ SELECT * FROM v1;
|
|||
id t COUNT(*)
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (i INT, j BIGINT);
|
||||
INSERT INTO t1 VALUES (1, 2), (2, 2), (3, 2);
|
||||
CREATE VIEW v1 AS SELECT MIN(j) AS j FROM t1;
|
||||
CREATE VIEW v2 AS SELECT MIN(i) FROM t1 WHERE j = ( SELECT * FROM v1 );
|
||||
SELECT * FROM v2;
|
||||
MIN(i)
|
||||
1
|
||||
DROP VIEW v2, v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(
|
||||
fName varchar(25) NOT NULL,
|
||||
lName varchar(25) NOT NULL,
|
||||
DOB date NOT NULL,
|
||||
uID int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
INSERT INTO t1(fName, lName, DOB) VALUES
|
||||
('Hank', 'Hill', '1964-09-29'),
|
||||
('Tom', 'Adams', '1908-02-14'),
|
||||
('Homer', 'Simpson', '1968-03-05');
|
||||
CREATE VIEW v1 AS
|
||||
SELECT (year(now())-year(DOB)) AS Age
|
||||
FROM t1 HAVING Age < 75;
|
||||
SHOW CREATE VIEW v1;
|
||||
View Create View
|
||||
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select sql_no_cache (year(now()) - year(`t1`.`DOB`)) AS `Age` from `t1` having (`Age` < 75)
|
||||
SELECT (year(now())-year(DOB)) AS Age FROM t1 HAVING Age < 75;
|
||||
Age
|
||||
42
|
||||
38
|
||||
SELECT * FROM v1;
|
||||
Age
|
||||
42
|
||||
38
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -698,4 +698,10 @@ select cast(rtrim(' 20.06 ') as decimal(19,2));
|
|||
select cast(ltrim(' 20.06 ') as decimal(19,2));
|
||||
select cast(rtrim(ltrim(' 20.06 ')) as decimal(19,2));
|
||||
|
||||
#
|
||||
# Bug #13975: "same string" + 0 has 2 different results
|
||||
#
|
||||
select conv("18383815659218730760",10,10) + 0;
|
||||
select "18383815659218730760" + 0;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
|
|
@ -805,3 +805,21 @@ SELECT v1.a, v2. b
|
|||
|
||||
DROP VIEW v1,v2;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
#
|
||||
# Bug 19816: LEFT OUTER JOIN with constant ORed predicates in WHERE clause
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a int);
|
||||
CREATE TABLE t2 (b int);
|
||||
INSERT INTO t1 VALUES (1), (2), (3), (4);
|
||||
INSERT INTO t2 VALUES (2), (3);
|
||||
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1=1);
|
||||
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1 OR 1);
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (0 OR 1);
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1=1 OR 2=2);
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON t1.a = t2.b WHERE (1=1 OR 1=0);
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
|
|
@ -194,7 +194,7 @@ drop table t1;
|
|||
#
|
||||
#14157: utf8 encoding in binlog without set character_set_client
|
||||
#
|
||||
--exec $MYSQL --character-sets-dir=../sql/share/charsets/ --default-character-set=koi8r test -e 'create table t1 (a int); set names koi8r; create temporary table `ÑÝÉË` (a int); insert into `ÑÝÉË` values (1); insert into t1 select * from `ÑÝÉË`'
|
||||
--exec $MYSQL --character-sets-dir=../sql/share/charsets/ --default-character-set=latin1 test -e 'create table t1 (a int); set names latin1; create temporary table `äöüÄÖÜ` (a int); insert into `äöüÄÖÜ` values (1); insert into t1 select * from `äöüÄÖÜ`'
|
||||
|
||||
sync_slave_with_master;
|
||||
#connection slave;
|
||||
|
|
|
@ -2100,3 +2100,12 @@ CREATE VIEW v2 AS SELECT * FROM t1 WHERE no_such_column = (SELECT 1);
|
|||
SELECT * FROM t1 WHERE no_such_column = ANY (SELECT 1);
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#19077: A nested materialized derived table is used before being populated.
|
||||
#
|
||||
create table t1 (i int, j bigint);
|
||||
insert into t1 values (1, 2), (2, 2), (3, 2);
|
||||
select * from (select min(i) from t1 where j=(select * from (select min(j) from t1) t2)) t3;
|
||||
drop table t1;
|
||||
|
||||
|
|
|
@ -540,7 +540,42 @@ select @@version, @@version_comment, @@version_compile_machine,
|
|||
@@version_compile_os;
|
||||
|
||||
#
|
||||
# Bug #19263: variables.test doesn't clean up after itself (II/II -- restore)
|
||||
# Bug #1039: make tmpdir and datadir available as @@variables (also included
|
||||
# basedir)
|
||||
#
|
||||
# Don't actually output, since it depends on the system
|
||||
--replace_column 1 # 2 # 3 #
|
||||
select @@basedir, @@datadir, @@tmpdir;
|
||||
--replace_column 2 #
|
||||
show variables like 'basedir';
|
||||
--replace_column 2 #
|
||||
show variables like 'datadir';
|
||||
--replace_column 2 #
|
||||
show variables like 'tmpdir';
|
||||
|
||||
#
|
||||
# Bug #19606: make ssl settings available via SHOW VARIABLES and @@variables
|
||||
#
|
||||
# Don't actually output, since it depends on the system
|
||||
--replace_column 1 # 2 # 3 # 4 # 5 #
|
||||
select @@ssl_ca, @@ssl_capath, @@ssl_cert, @@ssl_cipher, @@ssl_key;
|
||||
--replace_column 2 #
|
||||
show variables like 'ssl%';
|
||||
|
||||
#
|
||||
# Bug #19616: make log_queries_not_using_indexes available in SHOW VARIABLES
|
||||
# and as @@log_queries_not_using_indexes
|
||||
#
|
||||
select @@log_queries_not_using_indexes;
|
||||
show variables like 'log_queries_not_using_indexes';
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
# This is at the very after the versioned tests, since it involves doing
|
||||
# cleanup
|
||||
#
|
||||
# Bug #19263: variables.test doesn't clean up after itself (II/II --
|
||||
# restore)
|
||||
#
|
||||
set global binlog_cache_size =@my_binlog_cache_size;
|
||||
set global connect_timeout =@my_connect_timeout;
|
||||
|
@ -569,5 +604,3 @@ set global server_id =@my_server_id;
|
|||
set global slow_launch_time =@my_slow_launch_time;
|
||||
set global storage_engine =@my_storage_engine;
|
||||
set global thread_cache_size =@my_thread_cache_size;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
|
|
@ -2533,3 +2533,42 @@ SELECT * FROM v1;
|
|||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#19077: A nested materialized view is used before being populated.
|
||||
#
|
||||
CREATE TABLE t1 (i INT, j BIGINT);
|
||||
INSERT INTO t1 VALUES (1, 2), (2, 2), (3, 2);
|
||||
CREATE VIEW v1 AS SELECT MIN(j) AS j FROM t1;
|
||||
CREATE VIEW v2 AS SELECT MIN(i) FROM t1 WHERE j = ( SELECT * FROM v1 );
|
||||
SELECT * FROM v2;
|
||||
DROP VIEW v2, v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #19573: VIEW with HAVING that refers an alias name
|
||||
#
|
||||
|
||||
CREATE TABLE t1(
|
||||
fName varchar(25) NOT NULL,
|
||||
lName varchar(25) NOT NULL,
|
||||
DOB date NOT NULL,
|
||||
uID int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
|
||||
INSERT INTO t1(fName, lName, DOB) VALUES
|
||||
('Hank', 'Hill', '1964-09-29'),
|
||||
('Tom', 'Adams', '1908-02-14'),
|
||||
('Homer', 'Simpson', '1968-03-05');
|
||||
|
||||
CREATE VIEW v1 AS
|
||||
SELECT (year(now())-year(DOB)) AS Age
|
||||
FROM t1 HAVING Age < 75;
|
||||
SHOW CREATE VIEW v1;
|
||||
|
||||
SELECT (year(now())-year(DOB)) AS Age FROM t1 HAVING Age < 75;
|
||||
SELECT * FROM v1;
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
|
|
14
sql/item.cc
14
sql/item.cc
|
@ -304,6 +304,7 @@ Item::Item():
|
|||
marker= 0;
|
||||
maybe_null=null_value=with_sum_func=unsigned_flag=0;
|
||||
decimals= 0; max_length= 0;
|
||||
with_subselect= 0;
|
||||
|
||||
/* Put item in free list so that we can free all items at end */
|
||||
THD *thd= current_thd;
|
||||
|
@ -4881,7 +4882,16 @@ void Item_ref::cleanup()
|
|||
void Item_ref::print(String *str)
|
||||
{
|
||||
if (ref)
|
||||
(*ref)->print(str);
|
||||
{
|
||||
if ((*ref)->type() != Item::CACHE_ITEM && ref_type() != VIEW_REF &&
|
||||
name && alias_name_used)
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
append_identifier(thd, str, name, (uint) strlen(name));
|
||||
}
|
||||
else
|
||||
(*ref)->print(str);
|
||||
}
|
||||
else
|
||||
Item_ident::print(str);
|
||||
}
|
||||
|
@ -5413,7 +5423,7 @@ bool Item_trigger_field::eq(const Item *item, bool binary_cmp) const
|
|||
}
|
||||
|
||||
|
||||
void Item_trigger_field::set_required_privilege(const bool rw)
|
||||
void Item_trigger_field::set_required_privilege(bool rw)
|
||||
{
|
||||
/*
|
||||
Require SELECT and UPDATE privilege if this field will be read and
|
||||
|
|
|
@ -490,6 +490,9 @@ public:
|
|||
my_bool is_autogenerated_name; /* indicate was name of this Item
|
||||
autogenerated or set by user */
|
||||
DTCollation collation;
|
||||
my_bool with_subselect; /* If this item is a subselect or some
|
||||
of its arguments is or contains a
|
||||
subselect */
|
||||
|
||||
// alloc & destruct is done as start of select using sql_alloc
|
||||
Item();
|
||||
|
@ -2233,7 +2236,7 @@ public:
|
|||
void cleanup();
|
||||
|
||||
private:
|
||||
void set_required_privilege(const bool rw);
|
||||
void set_required_privilege(bool rw);
|
||||
bool set_value(THD *thd, sp_rcontext *ctx, Item **it);
|
||||
|
||||
public:
|
||||
|
|
|
@ -204,10 +204,28 @@ longlong Item_func_nop_all::val_int()
|
|||
|
||||
|
||||
/*
|
||||
Convert a constant expression or string to an integer.
|
||||
This is done when comparing DATE's of different formats and
|
||||
also when comparing bigint to strings (in which case the string
|
||||
is converted once to a bigint).
|
||||
Convert a constant item to an int and replace the original item
|
||||
|
||||
SYNOPSIS
|
||||
convert_constant_item()
|
||||
thd thread handle
|
||||
field item will be converted using the type of this field
|
||||
item [in/out] reference to the item to convert
|
||||
|
||||
DESCRIPTION
|
||||
The function converts a constant expression or string to an integer.
|
||||
On successful conversion the original item is substituted for the
|
||||
result of the item evaluation.
|
||||
This is done when comparing DATE/TIME of different formats and
|
||||
also when comparing bigint to strings (in which case strings
|
||||
are converted to bigints).
|
||||
|
||||
NOTES
|
||||
This function is called only at prepare stage.
|
||||
As all derived tables are filled only after all derived tables
|
||||
are prepared we do not evaluate items with subselects here because
|
||||
they can contain derived tables and thus we may attempt to use a
|
||||
table that has not been populated yet.
|
||||
|
||||
RESULT VALUES
|
||||
0 Can't convert item
|
||||
|
@ -216,7 +234,7 @@ longlong Item_func_nop_all::val_int()
|
|||
|
||||
static bool convert_constant_item(THD *thd, Field *field, Item **item)
|
||||
{
|
||||
if ((*item)->const_item())
|
||||
if (!(*item)->with_subselect && (*item)->const_item())
|
||||
{
|
||||
/* For comparison purposes allow invalid dates like 2000-01-32 */
|
||||
ulong orig_sql_mode= field->table->in_use->variables.sql_mode;
|
||||
|
@ -2570,7 +2588,9 @@ Item_cond::fix_fields(THD *thd, Item **ref)
|
|||
(item= *li.ref())->check_cols(1))
|
||||
return TRUE; /* purecov: inspected */
|
||||
used_tables_cache|= item->used_tables();
|
||||
if (!item->const_item())
|
||||
if (item->const_item())
|
||||
and_tables_cache= (table_map) 0;
|
||||
else
|
||||
{
|
||||
tmp_table_map= item->not_null_tables();
|
||||
not_null_tables_cache|= tmp_table_map;
|
||||
|
@ -2578,6 +2598,7 @@ Item_cond::fix_fields(THD *thd, Item **ref)
|
|||
const_item_cache= FALSE;
|
||||
}
|
||||
with_sum_func= with_sum_func || item->with_sum_func;
|
||||
with_subselect|= item->with_subselect;
|
||||
if (item->maybe_null)
|
||||
maybe_null=1;
|
||||
}
|
||||
|
|
|
@ -184,6 +184,7 @@ Item_func::fix_fields(THD *thd, Item **ref)
|
|||
used_tables_cache|= item->used_tables();
|
||||
not_null_tables_cache|= item->not_null_tables();
|
||||
const_item_cache&= item->const_item();
|
||||
with_subselect|= item->with_subselect;
|
||||
}
|
||||
}
|
||||
fix_length_and_dec();
|
||||
|
|
|
@ -542,7 +542,7 @@ public:
|
|||
void fix_length_and_dec()
|
||||
{
|
||||
collation.set(default_charset());
|
||||
decimals=0; max_length=64;
|
||||
max_length= 64;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ Item_subselect::Item_subselect():
|
|||
engine(0), old_engine(0), used_tables_cache(0), have_to_be_excluded(0),
|
||||
const_item_cache(1), engine_changed(0), changed(0)
|
||||
{
|
||||
with_subselect= 1;
|
||||
reset();
|
||||
/*
|
||||
item value is NULL if select_subselect not changed this value
|
||||
|
|
|
@ -1498,6 +1498,7 @@ extern my_bool locked_in_memory;
|
|||
extern bool opt_using_transactions, mysqld_embedded;
|
||||
extern bool using_update_log, opt_large_files, server_id_supplied;
|
||||
extern bool opt_log, opt_update_log, opt_bin_log, opt_slow_log, opt_error_log;
|
||||
extern my_bool opt_log_queries_not_using_indexes;
|
||||
extern bool opt_disable_networking, opt_skip_show_db;
|
||||
extern my_bool opt_character_set_client_handshake;
|
||||
extern bool volatile abort_loop, shutdown_in_progress, grant_option;
|
||||
|
|
|
@ -318,7 +318,6 @@ static bool volatile ready_to_exit;
|
|||
static my_bool opt_debugging= 0, opt_external_locking= 0, opt_console= 0;
|
||||
static my_bool opt_bdb, opt_isam, opt_ndbcluster;
|
||||
static my_bool opt_short_log_format= 0;
|
||||
static my_bool opt_log_queries_not_using_indexes= 0;
|
||||
static uint kill_cached_threads, wake_thread;
|
||||
static ulong killed_threads, thread_created;
|
||||
static ulong max_used_connections;
|
||||
|
@ -344,6 +343,7 @@ static my_bool opt_sync_bdb_logs;
|
|||
/* Global variables */
|
||||
|
||||
bool opt_log, opt_update_log, opt_bin_log, opt_slow_log;
|
||||
my_bool opt_log_queries_not_using_indexes= 0;
|
||||
bool opt_error_log= IF_WIN(1,0);
|
||||
bool opt_disable_networking=0, opt_skip_show_db=0;
|
||||
my_bool opt_character_set_client_handshake= 1;
|
||||
|
@ -693,6 +693,7 @@ my_bool opt_enable_shared_memory;
|
|||
HANDLE smem_event_connect_request= 0;
|
||||
#endif
|
||||
|
||||
#define SSL_VARS_NOT_STATIC
|
||||
#include "sslopt-vars.h"
|
||||
#ifdef HAVE_OPENSSL
|
||||
#include <openssl/crypto.h>
|
||||
|
@ -1043,7 +1044,8 @@ static void __cdecl kill_server(int sig_ptr)
|
|||
RETURN_FROM_KILL_SERVER;
|
||||
kill_in_progress=TRUE;
|
||||
abort_loop=1; // This should be set
|
||||
my_sigset(sig,SIG_IGN);
|
||||
if (sig != 0) // 0 is not a valid signal number
|
||||
my_sigset(sig,SIG_IGN);
|
||||
if (sig == MYSQL_KILL_SIGNAL || sig == 0)
|
||||
sql_print_information(ER(ER_NORMAL_SHUTDOWN),my_progname);
|
||||
else
|
||||
|
|
|
@ -162,6 +162,7 @@ void fix_sql_mode_var(THD *thd, enum_var_type type);
|
|||
static byte *get_error_count(THD *thd);
|
||||
static byte *get_warning_count(THD *thd);
|
||||
static byte *get_prepared_stmt_count(THD *thd);
|
||||
static byte *get_tmpdir(THD *thd);
|
||||
|
||||
/*
|
||||
Variable definition list
|
||||
|
@ -184,6 +185,7 @@ sys_var_thd_ulong sys_auto_increment_offset("auto_increment_offset",
|
|||
sys_var_bool_ptr sys_automatic_sp_privileges("automatic_sp_privileges",
|
||||
&sp_automatic_privileges);
|
||||
|
||||
sys_var_const_str sys_basedir("basedir", mysql_home);
|
||||
sys_var_long_ptr sys_binlog_cache_size("binlog_cache_size",
|
||||
&binlog_cache_size);
|
||||
sys_var_thd_binlog_format sys_binlog_format("binlog_format",
|
||||
|
@ -209,6 +211,7 @@ sys_var_long_ptr sys_concurrent_insert("concurrent_insert",
|
|||
&myisam_concurrent_insert);
|
||||
sys_var_long_ptr sys_connect_timeout("connect_timeout",
|
||||
&connect_timeout);
|
||||
sys_var_const_str sys_datadir("datadir", mysql_real_data_home);
|
||||
#ifndef DBUG_OFF
|
||||
sys_var_thd_dbug sys_dbug("debug");
|
||||
#endif
|
||||
|
@ -262,6 +265,9 @@ sys_trust_routine_creators("log_bin_trust_routine_creators",
|
|||
sys_var_bool_ptr
|
||||
sys_trust_function_creators("log_bin_trust_function_creators",
|
||||
&trust_function_creators);
|
||||
sys_var_bool_ptr
|
||||
sys_log_queries_not_using_indexes("log_queries_not_using_indexes",
|
||||
&opt_log_queries_not_using_indexes);
|
||||
sys_var_thd_ulong sys_log_warnings("log_warnings", &SV::log_warnings);
|
||||
sys_var_thd_ulong sys_long_query_time("long_query_time",
|
||||
&SV::long_query_time);
|
||||
|
@ -389,6 +395,7 @@ sys_var_thd_ulong sys_query_alloc_block_size("query_alloc_block_size",
|
|||
sys_var_thd_ulong sys_query_prealloc_size("query_prealloc_size",
|
||||
&SV::query_prealloc_size,
|
||||
0, fix_thd_mem_root);
|
||||
sys_var_readonly sys_tmpdir("tmpdir", OPT_GLOBAL, SHOW_CHAR, get_tmpdir);
|
||||
sys_var_thd_ulong sys_trans_alloc_block_size("transaction_alloc_block_size",
|
||||
&SV::trans_alloc_block_size,
|
||||
0, fix_trans_mem_root);
|
||||
|
@ -425,6 +432,21 @@ sys_var_thd_ulong sys_sort_buffer("sort_buffer_size",
|
|||
&SV::sortbuff_size);
|
||||
sys_var_thd_sql_mode sys_sql_mode("sql_mode",
|
||||
&SV::sql_mode);
|
||||
#ifdef HAVE_OPENSSL
|
||||
extern char *opt_ssl_ca, *opt_ssl_capath, *opt_ssl_cert, *opt_ssl_cipher,
|
||||
*opt_ssl_key;
|
||||
sys_var_const_str_ptr sys_ssl_ca("ssl_ca", &opt_ssl_ca);
|
||||
sys_var_const_str_ptr sys_ssl_capath("ssl_capath", &opt_ssl_capath);
|
||||
sys_var_const_str_ptr sys_ssl_cert("ssl_cert", &opt_ssl_cert);
|
||||
sys_var_const_str_ptr sys_ssl_cipher("ssl_cipher", &opt_ssl_cipher);
|
||||
sys_var_const_str_ptr sys_ssl_key("ssl_key", &opt_ssl_key);
|
||||
#else
|
||||
sys_var_const_str sys_ssl_ca("ssl_ca", NULL);
|
||||
sys_var_const_str sys_ssl_capath("ssl_capath", NULL);
|
||||
sys_var_const_str sys_ssl_cert("ssl_cert", NULL);
|
||||
sys_var_const_str sys_ssl_cipher("ssl_cipher", NULL);
|
||||
sys_var_const_str sys_ssl_key("ssl_key", NULL);
|
||||
#endif
|
||||
sys_var_thd_enum
|
||||
sys_updatable_views_with_limit("updatable_views_with_limit",
|
||||
&SV::updatable_views_with_limit,
|
||||
|
@ -696,7 +718,6 @@ static int show_slave_skip_errors(THD *thd, SHOW_VAR *var, char *buff)
|
|||
}
|
||||
#endif /* HAVE_REPLICATION */
|
||||
|
||||
|
||||
/*
|
||||
Variables shown by SHOW variables in alphabetical order
|
||||
*/
|
||||
|
@ -706,7 +727,7 @@ SHOW_VAR init_vars[]= {
|
|||
{"auto_increment_offset", (char*) &sys_auto_increment_offset, SHOW_SYS},
|
||||
{sys_automatic_sp_privileges.name,(char*) &sys_automatic_sp_privileges, SHOW_SYS},
|
||||
{"back_log", (char*) &back_log, SHOW_LONG},
|
||||
{"basedir", mysql_home, SHOW_CHAR},
|
||||
{sys_basedir.name, (char*) &sys_basedir, SHOW_SYS},
|
||||
{"bdb_cache_parts", (char*) &berkeley_cache_parts, SHOW_LONG},
|
||||
{"bdb_cache_size", (char*) &berkeley_cache_size, SHOW_LONGLONG},
|
||||
{"bdb_home", (char*) &berkeley_home, SHOW_CHAR_PTR},
|
||||
|
@ -733,7 +754,7 @@ SHOW_VAR init_vars[]= {
|
|||
{sys_completion_type.name, (char*) &sys_completion_type, SHOW_SYS},
|
||||
{sys_concurrent_insert.name,(char*) &sys_concurrent_insert, SHOW_SYS},
|
||||
{sys_connect_timeout.name, (char*) &sys_connect_timeout, SHOW_SYS},
|
||||
{"datadir", mysql_real_data_home, SHOW_CHAR},
|
||||
{sys_datadir.name, (char*) &sys_datadir, SHOW_SYS},
|
||||
{sys_date_format.name, (char*) &sys_date_format, SHOW_SYS},
|
||||
{sys_datetime_format.name, (char*) &sys_datetime_format, SHOW_SYS},
|
||||
#ifndef DBUG_OFF
|
||||
|
@ -833,6 +854,8 @@ SHOW_VAR init_vars[]= {
|
|||
{"log_bin", (char*) &opt_bin_log, SHOW_BOOL},
|
||||
{sys_trust_function_creators.name,(char*) &sys_trust_function_creators, SHOW_SYS},
|
||||
{"log_error", (char*) log_error_file, SHOW_CHAR},
|
||||
{sys_log_queries_not_using_indexes.name,
|
||||
(char*) &sys_log_queries_not_using_indexes, SHOW_SYS},
|
||||
#ifdef HAVE_REPLICATION
|
||||
{"log_slave_updates", (char*) &opt_log_slave_updates, SHOW_MY_BOOL},
|
||||
#endif
|
||||
|
@ -962,6 +985,11 @@ SHOW_VAR init_vars[]= {
|
|||
{sys_sql_mode.name, (char*) &sys_sql_mode, SHOW_SYS},
|
||||
{"sql_notes", (char*) &sys_sql_notes, SHOW_SYS},
|
||||
{"sql_warnings", (char*) &sys_sql_warnings, SHOW_SYS},
|
||||
{sys_ssl_ca.name, (char*) &sys_ssl_ca, SHOW_SYS},
|
||||
{sys_ssl_capath.name, (char*) &sys_ssl_capath, SHOW_SYS},
|
||||
{sys_ssl_cert.name, (char*) &sys_ssl_cert, SHOW_SYS},
|
||||
{sys_ssl_cipher.name, (char*) &sys_ssl_cipher, SHOW_SYS},
|
||||
{sys_ssl_key.name, (char*) &sys_ssl_key, SHOW_SYS},
|
||||
{sys_storage_engine.name, (char*) &sys_storage_engine, SHOW_SYS},
|
||||
#ifdef HAVE_REPLICATION
|
||||
{sys_sync_binlog_period.name,(char*) &sys_sync_binlog_period, SHOW_SYS},
|
||||
|
@ -983,7 +1011,7 @@ SHOW_VAR init_vars[]= {
|
|||
{"time_zone", (char*) &sys_time_zone, SHOW_SYS},
|
||||
{sys_timed_mutexes.name, (char*) &sys_timed_mutexes, SHOW_SYS},
|
||||
{sys_tmp_table_size.name, (char*) &sys_tmp_table_size, SHOW_SYS},
|
||||
{"tmpdir", (char*) &opt_mysql_tmpdir, SHOW_CHAR_PTR},
|
||||
{sys_tmpdir.name, (char*) &sys_tmpdir, SHOW_SYS},
|
||||
{sys_trans_alloc_block_size.name, (char*) &sys_trans_alloc_block_size,
|
||||
SHOW_SYS},
|
||||
{sys_trans_prealloc_size.name, (char*) &sys_trans_prealloc_size, SHOW_SYS},
|
||||
|
@ -2855,6 +2883,31 @@ static byte *get_prepared_stmt_count(THD *thd)
|
|||
return (byte*) &thd->sys_var_tmp.ulong_value;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Get the tmpdir that was specified or chosen by default
|
||||
|
||||
SYNOPSIS
|
||||
get_tmpdir()
|
||||
thd thread handle
|
||||
|
||||
DESCRIPTION
|
||||
This is necessary because if the user does not specify a temporary
|
||||
directory via the command line, one is chosen based on the environment
|
||||
or system defaults. But we can't just always use mysql_tmpdir, because
|
||||
that is actually a call to my_tmpdir() which cycles among possible
|
||||
temporary directories.
|
||||
|
||||
RETURN VALUES
|
||||
ptr pointer to NUL-terminated string
|
||||
*/
|
||||
static byte *get_tmpdir(THD *thd)
|
||||
{
|
||||
if (opt_mysql_tmpdir)
|
||||
return (byte *)opt_mysql_tmpdir;
|
||||
return (byte*)mysql_tmpdir;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Main handling of variables:
|
||||
- Initialisation
|
||||
|
|
|
@ -231,6 +231,35 @@ public:
|
|||
};
|
||||
|
||||
|
||||
class sys_var_const_str_ptr :public sys_var
|
||||
{
|
||||
public:
|
||||
char **value; // Pointer to const value
|
||||
sys_var_const_str_ptr(const char *name_arg, char **value_arg)
|
||||
:sys_var(name_arg),value(value_arg)
|
||||
{}
|
||||
bool check(THD *thd, set_var *var)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
bool update(THD *thd, set_var *var)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
SHOW_TYPE type() { return SHOW_CHAR; }
|
||||
byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
|
||||
{
|
||||
return (byte*) *value;
|
||||
}
|
||||
bool check_update_type(Item_result type)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
bool check_default(enum_var_type type) { return 1; }
|
||||
bool is_readonly() const { return 1; }
|
||||
};
|
||||
|
||||
|
||||
class sys_var_enum :public sys_var
|
||||
{
|
||||
uint *value;
|
||||
|
|
|
@ -6154,20 +6154,21 @@ void fill_effective_table_privileges(THD *thd, GRANT_INFO *grant,
|
|||
}
|
||||
|
||||
/* table privileges */
|
||||
rw_rdlock(&LOCK_grant);
|
||||
if (grant->version != grant_version)
|
||||
{
|
||||
rw_rdlock(&LOCK_grant);
|
||||
grant->grant_table=
|
||||
table_hash_search(sctx->host, sctx->ip, db,
|
||||
sctx->priv_user,
|
||||
table, 0); /* purecov: inspected */
|
||||
grant->version= grant_version; /* purecov: inspected */
|
||||
rw_unlock(&LOCK_grant);
|
||||
}
|
||||
if (grant->grant_table != 0)
|
||||
{
|
||||
grant->privilege|= grant->grant_table->privs;
|
||||
}
|
||||
rw_unlock(&LOCK_grant);
|
||||
|
||||
DBUG_PRINT("info", ("privilege 0x%lx", grant->privilege));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
|
|
@ -1926,6 +1926,7 @@ int Dbtup::interpreterNextLab(Signal* signal,
|
|||
// word read. Thus we set the register to be a 32 bit register.
|
||||
/* ------------------------------------------------------------- */
|
||||
TregMemBuffer[theRegister]= 0x50;
|
||||
// arithmetic conversion if big-endian
|
||||
* (Int64*)(TregMemBuffer+theRegister+2)=
|
||||
TregMemBuffer[theRegister+1];
|
||||
} else if (TnoDataRW == 3) {
|
||||
|
@ -1985,6 +1986,11 @@ int Dbtup::interpreterNextLab(Signal* signal,
|
|||
Tlen= TattrNoOfWords + 1;
|
||||
if (Toptype == ZUPDATE) {
|
||||
if (TattrNoOfWords <= 2) {
|
||||
if (TattrNoOfWords == 1) {
|
||||
// arithmetic conversion if big-endian
|
||||
TdataForUpdate[1] = *(Int64*)&TregMemBuffer[theRegister + 2];
|
||||
TdataForUpdate[2] = 0;
|
||||
}
|
||||
if (TregType == 0) {
|
||||
/* --------------------------------------------------------- */
|
||||
// Write a NULL value into the attribute
|
||||
|
|
|
@ -24,6 +24,7 @@ testOIBasic \
|
|||
testOperations \
|
||||
testRestartGci \
|
||||
testScan \
|
||||
testInterpreter \
|
||||
testScanInterpreter \
|
||||
testScanPerf \
|
||||
testSystemRestart \
|
||||
|
@ -64,6 +65,7 @@ testOIBasic_SOURCES = testOIBasic.cpp
|
|||
testOperations_SOURCES = testOperations.cpp
|
||||
testRestartGci_SOURCES = testRestartGci.cpp
|
||||
testScan_SOURCES = testScan.cpp ScanFunctions.hpp
|
||||
testInterpreter_SOURCES = testInterpreter.cpp
|
||||
testScanInterpreter_SOURCES = testScanInterpreter.cpp ScanFilter.hpp ScanInterpretTest.hpp
|
||||
testScanPerf_SOURCES = testScanPerf.cpp
|
||||
testSystemRestart_SOURCES = testSystemRestart.cpp
|
||||
|
|
|
@ -79,46 +79,46 @@ int runTestIncValue32(NDBT_Context* ctx, NDBT_Step* step){
|
|||
Ndb* pNdb = GETNDB(step);
|
||||
|
||||
|
||||
NdbConnection* pTrans = pNdb->startTransaction();
|
||||
if (pTrans == NULL){
|
||||
ERR(pNdb->getNdbError());
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
NdbOperation* pOp = pTrans->getNdbOperation(pTab->getName());
|
||||
if (pOp == NULL) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
int check = pOp->interpretedUpdateTuple();
|
||||
if( check == -1 ) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
|
||||
// Primary keys
|
||||
Uint32 pkVal = 1;
|
||||
check = pOp->equal("KOL1", pkVal );
|
||||
if( check == -1 ) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
// Attributes
|
||||
|
||||
// Update column
|
||||
Uint32 valToIncWith = 1;
|
||||
check = pOp->incValue("KOL2", valToIncWith);
|
||||
if( check == -1 ) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
NdbConnection* pTrans = pNdb->startTransaction();
|
||||
if (pTrans == NULL){
|
||||
ERR(pNdb->getNdbError());
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
NdbOperation* pOp = pTrans->getNdbOperation(pTab->getName());
|
||||
if (pOp == NULL) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
int check = pOp->interpretedUpdateTuple();
|
||||
if( check == -1 ) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
|
||||
// Primary keys
|
||||
Uint32 pkVal = 1;
|
||||
check = pOp->equal("KOL1", pkVal );
|
||||
if( check == -1 ) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
// Attributes
|
||||
|
||||
// Update column
|
||||
Uint32 valToIncWith = 1;
|
||||
check = pOp->incValue("KOL2", valToIncWith);
|
||||
if( check == -1 ) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
NdbRecAttr* valueRec = pOp->getValue("KOL2");
|
||||
if( valueRec == NULL ) {
|
||||
|
@ -142,6 +142,122 @@ int runTestIncValue32(NDBT_Context* ctx, NDBT_Step* step){
|
|||
return NDBT_OK;
|
||||
}
|
||||
|
||||
int runTestBug19537(NDBT_Context* ctx, NDBT_Step* step){
|
||||
int result = NDBT_OK;
|
||||
const NdbDictionary::Table * pTab = ctx->getTab();
|
||||
Ndb* pNdb = GETNDB(step);
|
||||
|
||||
if (strcmp(pTab->getName(), "T1") != 0) {
|
||||
g_err << "runTestBug19537: skip, table != T1" << endl;
|
||||
return NDBT_OK;
|
||||
}
|
||||
|
||||
|
||||
NdbConnection* pTrans = pNdb->startTransaction();
|
||||
if (pTrans == NULL){
|
||||
ERR(pNdb->getNdbError());
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
NdbOperation* pOp = pTrans->getNdbOperation(pTab->getName());
|
||||
if (pOp == NULL) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
if (pOp->interpretedUpdateTuple() == -1) {
|
||||
ERR(pOp->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
|
||||
// Primary keys
|
||||
const Uint32 pkVal = 1;
|
||||
if (pOp->equal("KOL1", pkVal) == -1) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
// Load 64-bit constant into register 1 and
|
||||
// write from register 1 to 32-bit column KOL2
|
||||
const Uint64 reg_val = 0x0102030405060708ULL;
|
||||
|
||||
const Uint32* reg_ptr32 = (const Uint32*)®_val;
|
||||
if (reg_ptr32[0] == 0x05060708 && reg_ptr32[1] == 0x01020304) {
|
||||
g_err << "runTestBug19537: platform is LITTLE endian" << endl;
|
||||
} else if (reg_ptr32[0] == 0x01020304 && reg_ptr32[1] == 0x05060708) {
|
||||
g_err << "runTestBug19537: platform is BIG endian" << endl;
|
||||
} else {
|
||||
g_err << "runTestBug19537: impossible platform"
|
||||
<< hex << " [0]=" << reg_ptr32[0] << " [1]=" <<reg_ptr32[1] << endl;
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
if (pOp->load_const_u64(1, reg_val) == -1 ||
|
||||
pOp->write_attr("KOL2", 1) == -1) {
|
||||
ERR(pOp->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
if (pTrans->execute(Commit) == -1) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
// Read value via a new transaction
|
||||
|
||||
pTrans = pNdb->startTransaction();
|
||||
if (pTrans == NULL){
|
||||
ERR(pNdb->getNdbError());
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
pOp = pTrans->getNdbOperation(pTab->getName());
|
||||
if (pOp == NULL) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
Uint32 kol2 = 0x09090909;
|
||||
if (pOp->readTuple() == -1 ||
|
||||
pOp->equal("KOL1", pkVal) == -1 ||
|
||||
pOp->getValue("KOL2", (char*)&kol2) == 0) {
|
||||
ERR(pOp->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
if (pTrans->execute(Commit) == -1) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
// Expected conversion as in C - truncate to lower (logical) word
|
||||
|
||||
if (kol2 == 0x01020304) {
|
||||
g_err << "runTestBug19537: the bug manifests itself !" << endl;
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
if (kol2 != 0x05060708) {
|
||||
g_err << "runTestBug19537: impossible KOL2 " << hex << kol2 << endl;
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_OK;
|
||||
}
|
||||
|
||||
|
||||
NDBT_TESTSUITE(testInterpreter);
|
||||
TESTCASE("IncValue32",
|
||||
|
@ -156,6 +272,12 @@ TESTCASE("IncValue64",
|
|||
INITIALIZER(runTestIncValue64);
|
||||
FINALIZER(runClearTable);
|
||||
}
|
||||
TESTCASE("Bug19537",
|
||||
"Test big-endian write_attr of 32 bit integer\n"){
|
||||
INITIALIZER(runLoadTable);
|
||||
INITIALIZER(runTestBug19537);
|
||||
FINALIZER(runClearTable);
|
||||
}
|
||||
#if 0
|
||||
TESTCASE("MaxTransactions",
|
||||
"Start transactions until no more can be created\n"){
|
||||
|
|
Loading…
Add table
Reference in a new issue