summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BitKeeper/etc/logging_ok1
-rwxr-xr-xBitKeeper/triggers/post-commit1
-rw-r--r--client/mysqltest.c9
-rw-r--r--include/config-win.h23
-rw-r--r--libmysqld/emb_qcache.cc18
-rw-r--r--myisam/ft_boolean_search.c36
-rw-r--r--myisam/mi_preload.c8
-rw-r--r--mysql-test/r/ctype_ucs.result14
-rw-r--r--mysql-test/r/fulltext.result7
-rw-r--r--mysql-test/r/information_schema.result6
-rw-r--r--mysql-test/r/ndb_autodiscover.result2
-rw-r--r--mysql-test/r/ndb_index_ordered.result83
-rw-r--r--mysql-test/r/preload.result28
-rw-r--r--mysql-test/r/sp.result10
-rw-r--r--mysql-test/r/strict.result83
-rw-r--r--mysql-test/r/subselect.result100
-rw-r--r--mysql-test/r/union.result22
-rw-r--r--mysql-test/t/ctype_ucs.test21
-rw-r--r--mysql-test/t/fulltext.test8
-rw-r--r--mysql-test/t/information_schema.test11
-rw-r--r--mysql-test/t/ndb_index_ordered.test52
-rw-r--r--mysql-test/t/row.test2
-rw-r--r--mysql-test/t/sp.test24
-rw-r--r--mysql-test/t/strict.test297
-rw-r--r--mysql-test/t/subselect.test101
-rw-r--r--mysql-test/t/union.test12
-rw-r--r--ndb/include/kernel/signaldata/DictTabInfo.hpp51
-rw-r--r--ndb/include/ndb_constants.h7
-rw-r--r--ndb/include/ndbapi/NdbDictionary.hpp13
-rw-r--r--ndb/include/util/NdbSqlUtil.hpp17
-rw-r--r--ndb/src/common/util/NdbSqlUtil.cpp147
-rw-r--r--ndb/src/mgmsrv/MgmtSrvr.cpp3
-rw-r--r--ndb/src/ndbapi/NdbDictionary.cpp11
-rw-r--r--ndb/src/ndbapi/NdbDictionaryImpl.cpp3
-rw-r--r--ndb/src/ndbapi/NdbRecAttr.cpp20
-rw-r--r--ndb/test/include/NdbSchemaOp.hpp3
-rw-r--r--ndb/test/run-test/Makefile.am4
-rw-r--r--ndb/test/src/HugoCalculator.cpp3
-rw-r--r--ndb/tools/restore/consumer.cpp5
-rw-r--r--scripts/mysql_create_system_tables.sh4
-rw-r--r--sql/examples/ha_archive.cc11
-rw-r--r--sql/field.cc69
-rw-r--r--sql/field.h8
-rw-r--r--sql/filesort.cc67
-rw-r--r--sql/ha_innodb.cc2
-rw-r--r--sql/ha_ndbcluster.cc45
-rw-r--r--sql/item.cc55
-rw-r--r--sql/item.h8
-rw-r--r--sql/item_buff.cc3
-rw-r--r--sql/item_cmpfunc.cc62
-rw-r--r--sql/item_strfunc.cc12
-rw-r--r--sql/my_decimal.cc30
-rw-r--r--sql/my_decimal.h4
-rw-r--r--sql/sql_cache.cc2
-rw-r--r--sql/sql_class.cc2
-rw-r--r--sql/sql_class.h9
-rw-r--r--sql/sql_lex.cc6
-rw-r--r--sql/sql_lex.h3
-rw-r--r--sql/sql_list.h4
-rw-r--r--sql/sql_parse.cc9
-rw-r--r--sql/sql_select.cc3
-rw-r--r--sql/sql_string.h4
-rw-r--r--sql/sql_update.cc4
-rw-r--r--sql/sql_yacc.yy30
-rw-r--r--sql/table.cc1
-rw-r--r--strings/ctype-ucs2.c25
-rw-r--r--vio/viosocket.c12
67 files changed, 1471 insertions, 289 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok
index e519dbb1de2..76027180194 100644
--- a/BitKeeper/etc/logging_ok
+++ b/BitKeeper/etc/logging_ok
@@ -222,6 +222,7 @@ serg@sergbook.mysql.com
sergefp@mysql.com
sinisa@rhols221.adsl.netsonic.fi
stewart@mysql.com
+svoj@mysql.com
tfr@beta.frontier86.ee
tfr@indrek.tfr.cafe.ee
tfr@sarvik.tfr.cafe.ee
diff --git a/BitKeeper/triggers/post-commit b/BitKeeper/triggers/post-commit
index 30238c06b93..4e0135fa822 100755
--- a/BitKeeper/triggers/post-commit
+++ b/BitKeeper/triggers/post-commit
@@ -62,7 +62,6 @@ From: $FROM
To: $INTERNALS
Subject: bk commit into $VERSION tree ($CHANGESET)$BS
$BH
-
Below is the list of changes that have just been committed into a local
$VERSION repository of $USER. When $USER does a push these changes will
be propagated to the main repository and, within 24 hours after the
diff --git a/client/mysqltest.c b/client/mysqltest.c
index 7bdcf6db3e5..4050dd7a029 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -253,6 +253,7 @@ VAR var_reg[10];
/*Perl/shell-like variable registers */
HASH var_hash;
my_bool disable_query_log=0, disable_result_log=0, disable_warnings=0;
+my_bool disable_ps_warnings= 0;
my_bool disable_info= 1; /* By default off */
my_bool abort_on_error= 1;
@@ -283,6 +284,7 @@ Q_ENABLE_RESULT_LOG, Q_DISABLE_RESULT_LOG,
Q_SERVER_START, Q_SERVER_STOP,Q_REQUIRE_MANAGER,
Q_WAIT_FOR_SLAVE_TO_STOP,
Q_ENABLE_WARNINGS, Q_DISABLE_WARNINGS,
+Q_ENABLE_PS_WARNINGS, Q_DISABLE_PS_WARNINGS,
Q_ENABLE_INFO, Q_DISABLE_INFO,
Q_ENABLE_METADATA, Q_DISABLE_METADATA,
Q_EXEC, Q_DELIMITER,
@@ -360,6 +362,8 @@ const char *command_names[]=
"wait_for_slave_to_stop",
"enable_warnings",
"disable_warnings",
+ "enable_ps_warnings",
+ "disable_ps_warnings",
"enable_info",
"disable_info",
"enable_metadata",
@@ -3021,7 +3025,8 @@ static int run_query_stmt(MYSQL *mysql, struct st_query *q, int flags)
/* We may have got warnings already, collect them if any */
/* FIXME we only want this if the statement succeeds I think */
- run_query_stmt_handle_warnings(mysql, ds);
+ if (!disable_ps_warnings)
+ run_query_stmt_handle_warnings(mysql, ds);
/*
No need to call mysql_stmt_bind_param() because we have no
@@ -3711,6 +3716,8 @@ int main(int argc, char **argv)
case Q_DISABLE_RESULT_LOG: disable_result_log=1; break;
case Q_ENABLE_WARNINGS: disable_warnings=0; break;
case Q_DISABLE_WARNINGS: disable_warnings=1; break;
+ case Q_ENABLE_PS_WARNINGS: disable_ps_warnings=0; break;
+ case Q_DISABLE_PS_WARNINGS: disable_ps_warnings=1; break;
case Q_ENABLE_INFO: disable_info=0; break;
case Q_DISABLE_INFO: disable_info=1; break;
case Q_ENABLE_METADATA: display_metadata=1; break;
diff --git a/include/config-win.h b/include/config-win.h
index cb2c072d056..9918f69a978 100644
--- a/include/config-win.h
+++ b/include/config-win.h
@@ -31,18 +31,25 @@ functions */
#define HAVE_SMEM 1
-#if defined(__NT__)
-#define SYSTEM_TYPE "NT"
-#elif defined(__WIN2000__)
-#define SYSTEM_TYPE "WIN2000"
+#if defined(_WIN64) || defined(WIN64)
+#define SYSTEM_TYPE "Win64"
+#elif defined(_WIN32) || defined(WIN32)
+#define SYSTEM_TYPE "Win32"
#else
-#define SYSTEM_TYPE "Win95/Win98"
+#define SYSTEM_TYPE "Windows"
#endif
-#if defined(_WIN64) || defined(WIN64)
-#define MACHINE_TYPE "ia64" /* Define to machine type name */
+#if defined(_M_IA64)
+#define MACHINE_TYPE "ia64"
+#elif defined(_M_IX86)
+#define MACHINE_TYPE "ia32"
+#elif defined(_M_ALPHA)
+#define MACHINE_TYPE "axp"
#else
-#define MACHINE_TYPE "i32" /* Define to machine type name */
+#define MACHINE_TYPE "unknown" /* Define to machine type name */
+#endif
+
+#if !(defined(_WIN64) || defined(WIN64))
#ifndef _WIN32
#define _WIN32 /* Compatible with old source */
#endif
diff --git a/libmysqld/emb_qcache.cc b/libmysqld/emb_qcache.cc
index 7d83023abd5..2d3d82b7952 100644
--- a/libmysqld/emb_qcache.cc
+++ b/libmysqld/emb_qcache.cc
@@ -71,9 +71,11 @@ void Querycache_stream::store_int(uint i)
cur_data+= 4;
return;
}
- memcpy(cur_data, &i, rest_len);
+ char buf[4];
+ int4store(buf, i);
+ memcpy(cur_data, buf, rest_len);
use_next_block();
- memcpy(cur_data, ((byte*)&i)+rest_len, 4-rest_len);
+ memcpy(cur_data, buf+rest_len, 4-rest_len);
cur_data+= 4-rest_len;
}
@@ -186,10 +188,12 @@ uint Querycache_stream::load_int()
cur_data+= 4;
return result;
}
- memcpy(&result, cur_data, rest_len);
+ char buf[4];
+ memcpy(buf, cur_data, rest_len);
use_next_block();
- memcpy(((byte*)&result)+rest_len, cur_data, 4-rest_len);
+ memcpy(buf+rest_len, cur_data, 4-rest_len);
cur_data+= 4-rest_len;
+ result= uint4korr(buf);
return result;
}
@@ -270,10 +274,10 @@ int Querycache_stream::load_column(MEM_ROOT *alloc, char** column)
return 0;
}
len--;
- if (!(*column= (char *)alloc_root(alloc, len + 4 + 1)))
+ if (!(*column= (char *)alloc_root(alloc, len + sizeof(uint) + 1)))
return 1;
- int4store(*column, len);
- (*column)+= 4;
+ *((uint*)*column)= len;
+ (*column)+= sizeof(uint);
load_str_only(*column, len);
return 1;
}
diff --git a/myisam/ft_boolean_search.c b/myisam/ft_boolean_search.c
index a5b4439a57f..6236f837c42 100644
--- a/myisam/ft_boolean_search.c
+++ b/myisam/ft_boolean_search.c
@@ -436,32 +436,24 @@ static int _ftb_strstr(const byte *s0, const byte *e0,
const byte *s1, const byte *e1,
CHARSET_INFO *cs)
{
- const byte *p0, *p1;
- my_bool s_after, e_before;
-
- s_after=true_word_char(cs, s1[0]);
- e_before=true_word_char(cs, e1[-1]);
- p0=s0;
+ const byte *p0= s0;
+ my_bool s_after= true_word_char(cs, s1[0]);
+ my_bool e_before= true_word_char(cs, e1[-1]);
+ uint p0_len;
+ my_match_t m[2];
while (p0 < e0)
{
- while (p0 < e0 && cs->to_upper[(uint) (uchar) *p0++] !=
- cs->to_upper[(uint) (uchar) *s1])
- /* no-op */;
- if (p0 >= e0)
- return 0;
-
- if (s_after && p0-1 > s0 && true_word_char(cs, p0[-2]))
- continue;
-
- p1=s1+1;
- while (p0 < e0 && p1 < e1 && cs->to_upper[(uint) (uchar) *p0] ==
- cs->to_upper[(uint) (uchar) *p1])
- p0++, p1++;
- if (p1 == e1 && (!e_before || p0 == e0 || !true_word_char(cs, p0[0])))
- return 1;
+ if (cs->coll->instr(cs, p0, e0 - p0, s1, e1 - s1, m, 2) != 2)
+ return(0);
+ if ((!s_after || p0 + m[1].beg == s0 || !true_word_char(cs, p0[m[1].beg-1])) &&
+ (!e_before || p0 + m[1].end == e0 || !true_word_char(cs, p0[m[1].end])))
+ return(1);
+ p0+= m[1].beg;
+ p0+= (p0_len= my_mbcharlen(cs, *(uchar *)p0)) ? p0_len : 1;
}
- return 0;
+
+ return(0);
}
diff --git a/myisam/mi_preload.c b/myisam/mi_preload.c
index 5e03d489efe..317ab4ad7fe 100644
--- a/myisam/mi_preload.c
+++ b/myisam/mi_preload.c
@@ -71,15 +71,15 @@ int mi_preload(MI_INFO *info, ulonglong key_map, my_bool ignore_leaves)
if (flush_key_blocks(share->key_cache,share->kfile, FLUSH_RELEASE))
goto err;
-
+
do
{
/* Read the next block of index file into the preload buffer */
if ((my_off_t) length > (key_file_length-pos))
length= (ulong) (key_file_length-pos);
- if (my_pread(share->kfile, (byte*) buff, length, pos, MYF(MY_FAE)))
+ if (my_pread(share->kfile, (byte*) buff, length, pos, MYF(MY_FAE|MY_FNABP)))
goto err;
-
+
if (ignore_leaves)
{
uchar *end= buff+length;
@@ -88,7 +88,7 @@ int mi_preload(MI_INFO *info, ulonglong key_map, my_bool ignore_leaves)
if (mi_test_if_nod(buff))
{
if (key_cache_insert(share->key_cache,
- share->kfile, pos, DFLT_INIT_HITS,
+ share->kfile, pos, DFLT_INIT_HITS,
(byte*) buff, block_length))
goto err;
}
diff --git a/mysql-test/r/ctype_ucs.result b/mysql-test/r/ctype_ucs.result
index 881da636617..8cbd4d58192 100644
--- a/mysql-test/r/ctype_ucs.result
+++ b/mysql-test/r/ctype_ucs.result
@@ -625,3 +625,17 @@ ucs2_bin 00610009
ucs2_bin 0061
ucs2_bin 00610020
drop table t1;
+SET NAMES latin1;
+SET collation_connection='ucs2_swedish_ci';
+CREATE TABLE t1 (Field1 int(10) default '0');
+INSERT INTO t1 VALUES ('-1');
+SELECT * FROM t1;
+Field1
+-1
+DROP TABLE t1;
+CREATE TABLE t1 (Field1 int(10) unsigned default '0');
+INSERT INTO t1 VALUES ('-1');
+Warnings:
+Warning 1264 Out of range value adjusted for column 'Field1' at row 1
+DROP TABLE t1;
+SET NAMES latin1;
diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result
index f50cae79608..77325c4e88b 100644
--- a/mysql-test/r/fulltext.result
+++ b/mysql-test/r/fulltext.result
@@ -408,3 +408,10 @@ insert t1 values (1, "aaaa"), (2, "bbbb");
insert t2 values (10, "aaaa"), (2, "cccc");
replace t1 select * from t2;
drop table t1, t2;
+CREATE TABLE t1 (t VARCHAR(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci, FULLTEXT (t));
+SET NAMES latin1;
+INSERT INTO t1 VALUES('Mit freundlichem Grüß aus Osnabrück');
+SELECT COUNT(*) FROM t1 WHERE MATCH(t) AGAINST ('"osnabrück"' IN BOOLEAN MODE);
+COUNT(*)
+1
+DROP TABLE t1;
diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result
index 9bf21e9f061..87e6062d411 100644
--- a/mysql-test/r/information_schema.result
+++ b/mysql-test/r/information_schema.result
@@ -604,3 +604,9 @@ Variable_name Value
show global status like "Threads_running";
Variable_name Value
Threads_running 1
+create table t1(f1 int);
+create table t2(f2 int);
+create view v1 as select * from t1, t2;
+set @got_val= (select count(*) from information_schema.columns);
+drop view v1;
+drop table t1, t2;
diff --git a/mysql-test/r/ndb_autodiscover.result b/mysql-test/r/ndb_autodiscover.result
index ba21483a9b0..1316e33c9ba 100644
--- a/mysql-test/r/ndb_autodiscover.result
+++ b/mysql-test/r/ndb_autodiscover.result
@@ -167,6 +167,8 @@ show status like 'handler_discover%';
Variable_name Value
Handler_discover 0
drop table t4;
+Warnings:
+Error 1296 Got error 709 'No such table existed' from NDB
flush status;
create table t4(
id int not null primary key,
diff --git a/mysql-test/r/ndb_index_ordered.result b/mysql-test/r/ndb_index_ordered.result
index 9aa7559d660..212c843cc44 100644
--- a/mysql-test/r/ndb_index_ordered.result
+++ b/mysql-test/r/ndb_index_ordered.result
@@ -554,6 +554,89 @@ select count(*)-9 from t1 use index (ts) where ts <= '2001-01-01 23:59:59';
count(*)-9
0
drop table t1;
+create table t1 (
+a int primary key,
+s decimal(12),
+t decimal(12, 5),
+u decimal(12) unsigned,
+v decimal(12, 5) unsigned,
+key (s),
+key (t),
+key (u),
+key (v)
+) engine=ndb;
+insert into t1 values
+( 0, -000000000007, -0000061.00003, 000000000061, 0000965.00042),
+( 1, -000000000007, -0000061.00042, 000000000061, 0000965.00003),
+( 2, -071006035767, 4210253.00024, 000000000001, 0000001.84488),
+( 3, 000000007115, 0000000.77607, 000077350625, 0000018.00013),
+( 4, -000000068391, -0346486.00000, 000000005071, 0005334.00002),
+( 5, -521579890459, -1936874.00001, 000000000154, 0000003.00018),
+( 6, -521579890459, -1936874.00018, 000000000154, 0000003.00001),
+( 7, 000000000333, 0000051.39140, 000000907958, 0788643.08374),
+( 8, 000042731229, 0000009.00000, 000000000009, 6428667.00000),
+( 9, -000008159769, 0000918.00004, 000096951421, 7607730.00008);
+select count(*)- 5 from t1 use index (s) where s < -000000000007;
+count(*)- 5
+0
+select count(*)- 7 from t1 use index (s) where s <= -000000000007;
+count(*)- 7
+0
+select count(*)- 2 from t1 use index (s) where s = -000000000007;
+count(*)- 2
+0
+select count(*)- 5 from t1 use index (s) where s >= -000000000007;
+count(*)- 5
+0
+select count(*)- 3 from t1 use index (s) where s > -000000000007;
+count(*)- 3
+0
+select count(*)- 4 from t1 use index (t) where t < -0000061.00003;
+count(*)- 4
+0
+select count(*)- 5 from t1 use index (t) where t <= -0000061.00003;
+count(*)- 5
+0
+select count(*)- 1 from t1 use index (t) where t = -0000061.00003;
+count(*)- 1
+0
+select count(*)- 6 from t1 use index (t) where t >= -0000061.00003;
+count(*)- 6
+0
+select count(*)- 5 from t1 use index (t) where t > -0000061.00003;
+count(*)- 5
+0
+select count(*)- 2 from t1 use index (u) where u < 000000000061;
+count(*)- 2
+0
+select count(*)- 4 from t1 use index (u) where u <= 000000000061;
+count(*)- 4
+0
+select count(*)- 2 from t1 use index (u) where u = 000000000061;
+count(*)- 2
+0
+select count(*)- 8 from t1 use index (u) where u >= 000000000061;
+count(*)- 8
+0
+select count(*)- 6 from t1 use index (u) where u > 000000000061;
+count(*)- 6
+0
+select count(*)- 5 from t1 use index (v) where v < 0000965.00042;
+count(*)- 5
+0
+select count(*)- 6 from t1 use index (v) where v <= 0000965.00042;
+count(*)- 6
+0
+select count(*)- 1 from t1 use index (v) where v = 0000965.00042;
+count(*)- 1
+0
+select count(*)- 5 from t1 use index (v) where v >= 0000965.00042;
+count(*)- 5
+0
+select count(*)- 4 from t1 use index (v) where v > 0000965.00042;
+count(*)- 4
+0
+drop table t1;
create table t1(a int primary key, b int not null, index(b));
insert into t1 values (1,1), (2,2);
set autocommit=0;
diff --git a/mysql-test/r/preload.result b/mysql-test/r/preload.result
index f0b99a8d6f1..7237a0da7e0 100644
--- a/mysql-test/r/preload.result
+++ b/mysql-test/r/preload.result
@@ -74,15 +74,15 @@ Table Op Msg_type Msg_text
test.t1 preload_keys status OK
show status like "key_read%";
Variable_name Value
-Key_read_requests 0
-Key_reads 0
+Key_read_requests 581
+Key_reads 581
select count(*) from t1 where b = 'test1';
count(*)
4181
show status like "key_read%";
Variable_name Value
-Key_read_requests 217
-Key_reads 45
+Key_read_requests 798
+Key_reads 581
flush tables;
flush status;
show status like "key_read%";
@@ -98,15 +98,15 @@ Table Op Msg_type Msg_text
test.t1 preload_keys status OK
show status like "key_read%";
Variable_name Value
-Key_read_requests 0
-Key_reads 0
+Key_read_requests 10
+Key_reads 10
select count(*) from t1 where b = 'test1';
count(*)
4181
show status like "key_read%";
Variable_name Value
-Key_read_requests 217
-Key_reads 45
+Key_read_requests 227
+Key_reads 52
flush tables;
flush status;
show status like "key_read%";
@@ -123,8 +123,8 @@ test.t1 preload_keys status OK
test.t2 preload_keys status OK
show status like "key_read%";
Variable_name Value
-Key_read_requests 0
-Key_reads 0
+Key_read_requests 587
+Key_reads 587
select count(*) from t1 where b = 'test1';
count(*)
4181
@@ -133,8 +133,8 @@ count(*)
2584
show status like "key_read%";
Variable_name Value
-Key_read_requests 351
-Key_reads 73
+Key_read_requests 938
+Key_reads 613
flush tables;
flush status;
show status like "key_read%";
@@ -147,8 +147,8 @@ test.t3 preload_keys error Table 'test.t3' doesn't exist
test.t2 preload_keys status OK
show status like "key_read%";
Variable_name Value
-Key_read_requests 0
-Key_reads 0
+Key_read_requests 355
+Key_reads 355
flush tables;
flush status;
show status like "key_read%";
diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result
index 0af6b821ce0..05803e57ba0 100644
--- a/mysql-test/r/sp.result
+++ b/mysql-test/r/sp.result
@@ -2059,6 +2059,16 @@ call bug6029()|
1136
drop procedure bug6029|
drop table t3|
+drop procedure if exists bug8540|
+create procedure bug8540()
+begin
+declare x int default 1;
+select x as y, x+0 as z;
+end|
+call bug8540()|
+y z
+1 1
+drop procedure bug8540|
drop table if exists fac|
create table fac (n int unsigned not null primary key, f bigint unsigned)|
drop procedure if exists ifac|
diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result
index 2e48ddf6d53..69e4b082422 100644
--- a/mysql-test/r/strict.result
+++ b/mysql-test/r/strict.result
@@ -129,6 +129,8 @@ INSERT INTO t1 VALUES('2004-09-31 15:30:00');
ERROR 22007: Incorrect datetime value: '2004-09-31 15:30:00' for column 'col1' at row 1
INSERT INTO t1 VALUES('2004-10-32 15:30:00');
ERROR 22007: Incorrect datetime value: '2004-10-32 15:30:00' for column 'col1' at row 1
+INSERT INTO t1 VALUES('2003-02-29 15:30:00');
+ERROR 22007: Incorrect datetime value: '2003-02-29 15:30:00' for column 'col1' at row 1
INSERT INTO t1 VALUES('2004-13-15 15:30:00');
ERROR 22007: Incorrect datetime value: '2004-13-15 15:30:00' for column 'col1' at row 1
INSERT INTO t1 VALUES('0000-00-00 15:30:00');
@@ -153,6 +155,8 @@ INSERT INTO t1 VALUES('2004-09-31 15:30:00');
ERROR 22007: Incorrect datetime value: '2004-09-31 15:30:00' for column 'col1' at row 1
INSERT INTO t1 VALUES('2004-10-32 15:30:00');
ERROR 22007: Incorrect datetime value: '2004-10-32 15:30:00' for column 'col1' at row 1
+INSERT INTO t1 VALUES('2003-02-29 15:30:00');
+ERROR 22007: Incorrect datetime value: '2003-02-29 15:30:00' for column 'col1' at row 1
INSERT INTO t1 VALUES('2004-13-15 15:30:00');
ERROR 22007: Incorrect datetime value: '2004-13-15 15:30:00' for column 'col1' at row 1
INSERT INTO t1 VALUES('2004-02-29 25:30:00');
@@ -194,6 +198,85 @@ col1
0000-00-00 00:00:00
0000-00-00 00:00:00
DROP TABLE t1;
+CREATE TABLE t1 (col1 date, col2 datetime, col3 timestamp);
+INSERT INTO t1 (col1) VALUES (STR_TO_DATE('15.10.2004','%d.%m.%Y'));
+INSERT INTO t1 (col2) VALUES (STR_TO_DATE('15.10.2004 10.15','%d.%m.%Y %H.%i'));
+INSERT INTO t1 (col3) VALUES (STR_TO_DATE('15.10.2004 10.15','%d.%m.%Y %H.%i'));
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i'));
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect date value: '2004-00-31 15:30:00' for column 'col1' at row 1
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect date value: '2004-10-00 15:30:00' for column 'col1' at row 1
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect date value: '2004-09-31 15:30:00' for column 'col1' at row 1
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect date value: '2003-02-29 15:30:00' for column 'col1' at row 1
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y'));
+ERROR 22007: Incorrect date value: '0000-00-00' for column 'col1' at row 1
+INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i'));
+INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect datetime value: '2004-00-31 15:30:00' for column 'col2' at row 1
+INSERT INTO t1 (col2) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col2' at row 1
+INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect datetime value: '2004-09-31 15:30:00' for column 'col2' at row 1
+INSERT INTO t1 (col2) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect datetime value: '2003-02-29 15:30:00' for column 'col2' at row 1
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect datetime value: '0000-10-31 15:30:00' for column 'col3' at row 1
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect datetime value: '2004-00-31 15:30:00' for column 'col3' at row 1
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col3' at row 1
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect datetime value: '2004-09-31 15:30:00' for column 'col3' at row 1
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
+ERROR 22007: Incorrect datetime value: '2003-02-29 15:30:00' for column 'col3' at row 1
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y'));
+ERROR 22007: Incorrect datetime value: '0000-00-00' for column 'col3' at row 1
+drop table t1;
+CREATE TABLE t1 (col1 date, col2 datetime, col3 timestamp);
+INSERT INTO t1 (col1) VALUES (CAST('2004-10-15' AS DATE));
+INSERT INTO t1 (col2) VALUES (CAST('2004-10-15 10:15' AS DATETIME));
+INSERT INTO t1 (col3) VALUES (CAST('2004-10-15 10:15' AS DATETIME));
+INSERT INTO t1 (col1) VALUES(CAST('0000-10-31' AS DATE));
+INSERT INTO t1 (col1) VALUES(CAST('2004-10-0' AS DATE));
+ERROR 22007: Incorrect date value: '2004-10-00' for column 'col1' at row 1
+INSERT INTO t1 (col1) VALUES(CAST('2004-0-10' AS DATE));
+ERROR 22007: Incorrect date value: '2004-00-10' for column 'col1' at row 1
+INSERT INTO t1 (col2) VALUES(CAST('0000-10-31 15:30' AS DATETIME));
+INSERT INTO t1 (col2) VALUES(CAST('2004-10-0 15:30' AS DATETIME));
+ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col2' at row 1
+INSERT INTO t1 (col2) VALUES(CAST('2004-0-10 15:30' AS DATETIME));
+ERROR 22007: Incorrect datetime value: '2004-00-10 15:30:00' for column 'col2' at row 1
+INSERT INTO t1 (col3) VALUES(CAST('0000-10-31 15:30' AS DATETIME));
+ERROR 22007: Incorrect datetime value: '0000-10-31 15:30:00' for column 'col3' at row 1
+INSERT INTO t1 (col3) VALUES(CAST('2004-10-0 15:30' AS DATETIME));
+ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col3' at row 1
+INSERT INTO t1 (col3) VALUES(CAST('2004-0-10 15:30' AS DATETIME));
+ERROR 22007: Incorrect datetime value: '2004-00-10 15:30:00' for column 'col3' at row 1
+drop table t1;
+CREATE TABLE t1 (col1 date, col2 datetime, col3 timestamp);
+INSERT INTO t1 (col1) VALUES (CONVERT('2004-10-15',DATE));
+INSERT INTO t1 (col2) VALUES (CONVERT('2004-10-15 10:15',DATETIME));
+INSERT INTO t1 (col3) VALUES (CONVERT('2004-10-15 10:15',DATETIME));
+INSERT INTO t1 (col1) VALUES(CONVERT('0000-10-31' , DATE));
+INSERT INTO t1 (col1) VALUES(CONVERT('2004-10-0' , DATE));
+ERROR 22007: Incorrect date value: '2004-10-00' for column 'col1' at row 1
+INSERT INTO t1 (col1) VALUES(CONVERT('2004-0-10' , DATE));
+ERROR 22007: Incorrect date value: '2004-00-10' for column 'col1' at row 1
+INSERT INTO t1 (col2) VALUES(CONVERT('0000-10-31 15:30',DATETIME));
+INSERT INTO t1 (col2) VALUES(CONVERT('2004-10-0 15:30',DATETIME));
+ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col2' at row 1
+INSERT INTO t1 (col2) VALUES(CONVERT('2004-0-10 15:30',DATETIME));
+ERROR 22007: Incorrect datetime value: '2004-00-10 15:30:00' for column 'col2' at row 1
+INSERT INTO t1 (col3) VALUES(CONVERT('0000-10-31 15:30',DATETIME));
+ERROR 22007: Incorrect datetime value: '0000-10-31 15:30:00' for column 'col3' at row 1
+INSERT INTO t1 (col3) VALUES(CONVERT('2004-10-0 15:30',DATETIME));
+ERROR 22007: Incorrect datetime value: '2004-10-00 15:30:00' for column 'col3' at row 1
+INSERT INTO t1 (col3) VALUES(CONVERT('2004-0-10 15:30',DATETIME));
+ERROR 22007: Incorrect datetime value: '2004-00-10 15:30:00' for column 'col3' at row 1
+drop table t1;
CREATE TABLE t1(col1 TINYINT, col2 TINYINT UNSIGNED);
INSERT INTO t1 VALUES(-128,0),(0,0),(127,255),('-128','0'),('0','0'),('127','255'),(-128.0,0.0),(0.0,0.0),(127.0,255.0);
SELECT MOD(col1,0) FROM t1 WHERE col1 > 0 LIMIT 2;
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result
index 67d3287c16f..bb9ac2ff4eb 100644
--- a/mysql-test/r/subselect.result
+++ b/mysql-test/r/subselect.result
@@ -2176,3 +2176,103 @@ ERROR 42S22: Reference 'xx' not supported (forward reference in item list)
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx from DUAL;
ERROR 42S22: Reference 'xx' not supported (forward reference in item list)
drop table t1;
+CREATE TABLE t1 (
+categoryId int(11) NOT NULL,
+courseId int(11) NOT NULL,
+startDate datetime NOT NULL,
+endDate datetime NOT NULL,
+createDate datetime NOT NULL,
+modifyDate timestamp NOT NULL,
+attributes text NOT NULL
+);
+INSERT INTO t1 VALUES (1,41,'2004-02-09','2010-01-01','2004-02-09','2004-02-09',''),
+(1,86,'2004-08-16','2004-08-16','2004-08-16','2004-08-16',''),
+(1,87,'2004-08-16','2004-08-16','2004-08-16','2004-08-16',''),
+(2,52,'2004-03-15','2004-10-01','2004-03-15','2004-09-17',''),
+(2,53,'2004-03-16','2004-10-01','2004-03-16','2004-09-17',''),
+(2,88,'2004-08-16','2004-08-16','2004-08-16','2004-08-16',''),
+(2,89,'2004-08-16','2004-08-16','2004-08-16','2004-08-16',''),
+(3,51,'2004-02-09','2010-01-01','2004-02-09','2004-02-09',''),
+(5,12,'2004-02-18','2010-01-01','2004-02-18','2004-02-18','');
+CREATE TABLE t2 (
+userId int(11) NOT NULL,
+courseId int(11) NOT NULL,
+date datetime NOT NULL
+);
+INSERT INTO t2 VALUES (5141,71,'2003-11-18'),
+(5141,72,'2003-11-25'),(5141,41,'2004-08-06'),
+(5141,52,'2004-08-06'),(5141,53,'2004-08-06'),
+(5141,12,'2004-08-06'),(5141,86,'2004-10-21'),
+(5141,87,'2004-10-21'),(5141,88,'2004-10-21'),
+(5141,89,'2004-10-22'),(5141,51,'2004-10-26');
+CREATE TABLE t3 (
+groupId int(11) NOT NULL,
+parentId int(11) NOT NULL,
+startDate datetime NOT NULL,
+endDate datetime NOT NULL,
+createDate datetime NOT NULL,
+modifyDate timestamp NOT NULL,
+ordering int(11)
+);
+INSERT INTO t3 VALUES (12,9,'1000-01-01','3999-12-31','2004-01-29','2004-01-29',NULL);
+CREATE TABLE t4 (
+id int(11) NOT NULL,
+groupTypeId int(11) NOT NULL,
+groupKey varchar(50) NOT NULL,
+name text,
+ordering int(11),
+description text,
+createDate datetime NOT NULL,
+modifyDate timestamp NOT NULL
+);
+INSERT INTO t4 VALUES (9,5,'stationer','stationer',0,'Stationer','2004-01-29','2004-01-29'),
+(12,5,'group2','group2',0,'group2','2004-01-29','2004-01-29');
+CREATE TABLE t5 (
+userId int(11) NOT NULL,
+groupId int(11) NOT NULL,
+createDate datetime NOT NULL,
+modifyDate timestamp NOT NULL
+);
+INSERT INTO t5 VALUES (5141,12,'2004-08-06','2004-08-06');
+select
+count(distinct t2.userid) pass,
+groupstuff.*,
+count(t2.courseid) crse,
+t1.categoryid,
+t2.courseid,
+date_format(date, '%b%y') as colhead
+from t2
+join t1 on t2.courseid=t1.courseid
+join
+(
+select
+t5.userid,
+parentid,
+parentgroup,
+childid,
+groupname,
+grouptypeid
+from t5
+join
+(
+select t4.id as parentid,
+t4.name as parentgroup,
+t4.id as childid,
+t4.name as groupname,
+t4.grouptypeid
+from t4
+) as gin on t5.groupid=gin.childid
+) as groupstuff on t2.userid = groupstuff.userid
+group by
+groupstuff.groupname, colhead , t2.courseid;
+pass userid parentid parentgroup childid groupname grouptypeid crse categoryid courseid colhead
+1 5141 12 group2 12 group2 5 1 5 12 Aug04
+1 5141 12 group2 12 group2 5 1 1 41 Aug04
+1 5141 12 group2 12 group2 5 1 2 52 Aug04
+1 5141 12 group2 12 group2 5 1 2 53 Aug04
+1 5141 12 group2 12 group2 5 1 3 51 Oct04
+1 5141 12 group2 12 group2 5 1 1 86 Oct04
+1 5141 12 group2 12 group2 5 1 1 87 Oct04
+1 5141 12 group2 12 group2 5 1 2 88 Oct04
+1 5141 12 group2 12 group2 5 1 2 89 Oct04
+drop table if exists t1, t2, t3, t4, t5;
diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result
index 5a60ef8abfb..663793e0b5e 100644
--- a/mysql-test/r/union.result
+++ b/mysql-test/r/union.result
@@ -1173,3 +1173,25 @@ show columns from t4;
Field Type Null Key Default Extra
sdate date YES NULL
drop table t1, t2, t3, t4;
+create table t1 (a int not null, b char (10) not null);
+insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c');
+select * from ((select * from t1 limit 1)) a;
+a b
+1 a
+select * from ((select * from t1 limit 1) union (select * from t1 limit 1)) a;
+a b
+1 a
+select * from ((select * from t1 limit 1) union (select * from t1 limit 1) union (select * from t1 limit 1)) a;
+a b
+1 a
+select * from ((((select * from t1))) union (select * from t1) union (select * from t1)) a;
+a b
+1 a
+2 b
+3 c
+select * from ((select * from t1) union (((select * from t1))) union (select * from t1)) a;
+a b
+1 a
+2 b
+3 c
+drop table t1;
diff --git a/mysql-test/t/ctype_ucs.test b/mysql-test/t/ctype_ucs.test
index 05552fcc6c5..7d34c4504bd 100644
--- a/mysql-test/t/ctype_ucs.test
+++ b/mysql-test/t/ctype_ucs.test
@@ -392,3 +392,24 @@ SET collation_connection='ucs2_general_ci';
SET NAMES latin1;
SET collation_connection='ucs2_bin';
-- source include/ctype_filesort.inc
+
+SET NAMES latin1;
+#
+# Bug#8235
+#
+# This bug also helped to find another problem that
+# INSERT of a UCS2 string containing a negative number
+# into a unsigned int column didn't produce warnings.
+# This test covers both problems.
+#
+SET collation_connection='ucs2_swedish_ci';
+CREATE TABLE t1 (Field1 int(10) default '0');
+# no warnings, negative numbers are allowed
+INSERT INTO t1 VALUES ('-1');
+SELECT * FROM t1;
+DROP TABLE t1;
+CREATE TABLE t1 (Field1 int(10) unsigned default '0');
+# this should generate a "Data truncated" warning
+INSERT INTO t1 VALUES ('-1');
+DROP TABLE t1;
+SET NAMES latin1;
diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test
index 62dcecaff68..50d01da080f 100644
--- a/mysql-test/t/fulltext.test
+++ b/mysql-test/t/fulltext.test
@@ -322,3 +322,11 @@ insert t2 values (10, "aaaa"), (2, "cccc");
replace t1 select * from t2;
drop table t1, t2;
+#
+# bug#8351
+#
+CREATE TABLE t1 (t VARCHAR(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci, FULLTEXT (t));
+SET NAMES latin1;
+INSERT INTO t1 VALUES('Mit freundlichem Grüß aus Osnabrück');
+SELECT COUNT(*) FROM t1 WHERE MATCH(t) AGAINST ('"osnabrück"' IN BOOLEAN MODE);
+DROP TABLE t1;
diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test
index c34dfc94576..baf817b7c84 100644
--- a/mysql-test/t/information_schema.test
+++ b/mysql-test/t/information_schema.test
@@ -352,3 +352,14 @@ show variables where variable_name like "skip_show_databas";
# Bug #7981:SHOW GLOBAL STATUS crashes server
#
show global status like "Threads_running";
+
+#
+# Bug #7915 crash,JOIN VIEW, subquery,
+# SELECT .. FROM INFORMATION_SCHEMA.COLUMNS
+#
+create table t1(f1 int);
+create table t2(f2 int);
+create view v1 as select * from t1, t2;
+set @got_val= (select count(*) from information_schema.columns);
+drop view v1;
+drop table t1, t2;
diff --git a/mysql-test/t/ndb_index_ordered.test b/mysql-test/t/ndb_index_ordered.test
index bea21f65381..2ebf06b78a8 100644
--- a/mysql-test/t/ndb_index_ordered.test
+++ b/mysql-test/t/ndb_index_ordered.test
@@ -280,6 +280,58 @@ select count(*)-9 from t1 use index (ts) where ts <= '2001-01-01 23:59:59';
drop table t1;
+# decimal (not the new 5.0 thing)
+
+create table t1 (
+ a int primary key,
+ s decimal(12),
+ t decimal(12, 5),
+ u decimal(12) unsigned,
+ v decimal(12, 5) unsigned,
+ key (s),
+ key (t),
+ key (u),
+ key (v)
+) engine=ndb;
+#
+insert into t1 values
+ ( 0, -000000000007, -0000061.00003, 000000000061, 0000965.00042),
+ ( 1, -000000000007, -0000061.00042, 000000000061, 0000965.00003),
+ ( 2, -071006035767, 4210253.00024, 000000000001, 0000001.84488),
+ ( 3, 000000007115, 0000000.77607, 000077350625, 0000018.00013),
+ ( 4, -000000068391, -0346486.00000, 000000005071, 0005334.00002),
+ ( 5, -521579890459, -1936874.00001, 000000000154, 0000003.00018),
+ ( 6, -521579890459, -1936874.00018, 000000000154, 0000003.00001),
+ ( 7, 000000000333, 0000051.39140, 000000907958, 0788643.08374),
+ ( 8, 000042731229, 0000009.00000, 000000000009, 6428667.00000),
+ ( 9, -000008159769, 0000918.00004, 000096951421, 7607730.00008);
+#
+select count(*)- 5 from t1 use index (s) where s < -000000000007;
+select count(*)- 7 from t1 use index (s) where s <= -000000000007;
+select count(*)- 2 from t1 use index (s) where s = -000000000007;
+select count(*)- 5 from t1 use index (s) where s >= -000000000007;
+select count(*)- 3 from t1 use index (s) where s > -000000000007;
+#
+select count(*)- 4 from t1 use index (t) where t < -0000061.00003;
+select count(*)- 5 from t1 use index (t) where t <= -0000061.00003;
+select count(*)- 1 from t1 use index (t) where t = -0000061.00003;
+select count(*)- 6 from t1 use index (t) where t >= -0000061.00003;
+select count(*)- 5 from t1 use index (t) where t > -0000061.00003;
+#
+select count(*)- 2 from t1 use index (u) where u < 000000000061;
+select count(*)- 4 from t1 use index (u) where u <= 000000000061;
+select count(*)- 2 from t1 use index (u) where u = 000000000061;
+select count(*)- 8 from t1 use index (u) where u >= 000000000061;
+select count(*)- 6 from t1 use index (u) where u > 000000000061;
+#
+select count(*)- 5 from t1 use index (v) where v < 0000965.00042;
+select count(*)- 6 from t1 use index (v) where v <= 0000965.00042;
+select count(*)- 1 from t1 use index (v) where v = 0000965.00042;
+select count(*)- 5 from t1 use index (v) where v >= 0000965.00042;
+select count(*)- 4 from t1 use index (v) where v > 0000965.00042;
+
+drop table t1;
+
# bug#7798
create table t1(a int primary key, b int not null, index(b));
insert into t1 values (1,1), (2,2);
diff --git a/mysql-test/t/row.test b/mysql-test/t/row.test
index 62e8eb7991c..58b90c9a356 100644
--- a/mysql-test/t/row.test
+++ b/mysql-test/t/row.test
@@ -7,7 +7,9 @@ select (1,2,3) IN ((3,2,3), (1,2,3), (1,3,3));
select row(10,2,3) IN (row(3,2,3), row(1,2,3), row(1,3,3));
select row(1,2,3) IN (row(3,NULL,3), row(1,2,3), row(1,3,3));
select row(10,2,3) IN (row(3,NULL,3), row(1,2,3), row(1,3,3));
+--disable_ps_warnings
select row('a',1.5,3) IN (row(1,2,3), row('a',1.5,3), row('a','a','a'));
+--enable_ps_warnings
select row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3));
select row('a',0,3) IN (row(3,2,3), row('a','a','3'), row(1,3,3));
select row('a',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3));
diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test
index d474fb1c84e..8b59af6e494 100644
--- a/mysql-test/t/sp.test
+++ b/mysql-test/t/sp.test
@@ -2520,6 +2520,22 @@ call bug6029()|
drop procedure bug6029|
drop table t3|
+#
+# BUG#8540: Local variable overrides an alias
+#
+--disable_warnings
+drop procedure if exists bug8540|
+--enable_warnings
+
+create procedure bug8540()
+begin
+ declare x int default 1;
+ select x as y, x+0 as z;
+end|
+
+call bug8540()|
+drop procedure bug8540|
+
#
# Some "real" examples
@@ -2811,6 +2827,12 @@ drop function getcount|
#
# BUG#5240: Stored procedure crash if function has cursor declaration
#
+# The following test case fails in --ps-protocol mode due to some bugs
+# in algorithm which calculates list of tables to be locked for queries
+# using Stored Functions. It is disabled until Dmitri fixes this.
+#
+--disable_ps_protocol
+
--disable_warnings
drop function if exists bug5240|
--enable_warnings
@@ -2831,6 +2853,8 @@ insert into t1 values ("answer", 42)|
select id, bug5240() from t1|
drop function bug5240|
+--enable_ps_protocol
+
#
# BUG#5278: Stored procedure packets out of order if SET PASSWORD.
#
diff --git a/mysql-test/t/strict.test b/mysql-test/t/strict.test
index 15373f59149..d8833f6f914 100644
--- a/mysql-test/t/strict.test
+++ b/mysql-test/t/strict.test
@@ -13,6 +13,9 @@ DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (col1 date);
INSERT INTO t1 VALUES('2004-01-01'),('0000-10-31'),('2004-02-29');
+
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid date value>
--error 1292
INSERT INTO t1 VALUES('2004-0-31');
--error 1292
@@ -94,6 +97,9 @@ set @@sql_mode='ansi,traditional';
CREATE TABLE t1 (col1 datetime);
INSERT INTO t1 VALUES('2004-10-31 15:30:00'),('0000-10-31 15:30:00'),('2004-02-29 15:30:00');
+
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid datetime value>
--error 1292
INSERT INTO t1 VALUES('2004-0-31 15:30:00');
--error 1292
@@ -103,6 +109,8 @@ INSERT INTO t1 VALUES('2004-09-31 15:30:00');
--error 1292
INSERT INTO t1 VALUES('2004-10-32 15:30:00');
--error 1292
+INSERT INTO t1 VALUES('2003-02-29 15:30:00');
+--error 1292
INSERT INTO t1 VALUES('2004-13-15 15:30:00');
--error 1292
INSERT INTO t1 VALUES('0000-00-00 15:30:00');
@@ -116,6 +124,9 @@ drop table t1;
CREATE TABLE t1 (col1 timestamp);
INSERT INTO t1 VALUES('2004-10-31 15:30:00'),('2004-02-29 15:30:00');
+
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid datetime value>
# Standard says we should return ok, but we can't as this is out of range
--error 1292
INSERT INTO t1 VALUES('0000-10-31 15:30:00');
@@ -128,6 +139,8 @@ INSERT INTO t1 VALUES('2004-09-31 15:30:00');
--error 1292
INSERT INTO t1 VALUES('2004-10-32 15:30:00');
--error 1292
+INSERT INTO t1 VALUES('2003-02-29 15:30:00');
+--error 1292
INSERT INTO t1 VALUES('2004-13-15 15:30:00');
--error 1292
INSERT INTO t1 VALUES('2004-02-29 25:30:00');
@@ -163,6 +176,290 @@ set @@sql_mode='ansi,traditional';
SELECT * FROM t1;
DROP TABLE t1;
+
+#### Test INSERT with STR_TO_DATE into DATE/DATETIME/TIMESTAMP
+
+CREATE TABLE t1 (col1 date, col2 datetime, col3 timestamp);
+
+INSERT INTO t1 (col1) VALUES (STR_TO_DATE('15.10.2004','%d.%m.%Y'));
+INSERT INTO t1 (col2) VALUES (STR_TO_DATE('15.10.2004 10.15','%d.%m.%Y %H.%i'));
+INSERT INTO t1 (col3) VALUES (STR_TO_DATE('15.10.2004 10.15','%d.%m.%Y %H.%i'));
+
+## Test INSERT with STR_TO_DATE into DATE
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid date value>
+
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i'));
+
+--error 1292
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i'));
+--error 1292
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
+--error 1292
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
+
+# deactivated because of Bug#5902
+# Bug#5902: Traditional mode: STR_TO_DATE changes invalid value rather than rejecting
+#--error 1292
+#INSERT INTO t1 (col1) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i'));
+
+--error 1292
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
+
+# deactivated because of Bug#5902
+# Bug#5902: Traditional mode: STR_TO_DATE changes invalid value rather than rejecting
+#--error 1292
+#INSERT INTO t1 (col1) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i'));
+
+--error 1292
+INSERT INTO t1 (col1) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y'));
+
+## Test INSERT with STR_TO_DATE into DATETIME
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid datetime value>
+
+INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i'));
+
+--error 1292
+INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i'));
+--error 1292
+INSERT INTO t1 (col2) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
+--error 1292
+INSERT INTO t1 (col2) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
+
+# deactivated because of Bug#5902
+# Bug#5902: Traditional mode: STR_TO_DATE changes invalid value rather than rejecting
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i'));
+
+--error 1292
+INSERT INTO t1 (col2) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
+
+# deactivated because of Bug#5902
+# Bug#5902: Traditional mode: STR_TO_DATE changes invalid value rather than rejecting
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i'));
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y'));
+
+## Test INSERT with STR_TO_DATE into TIMESTAMP
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid datetime value>
+
+--error 1292
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i'));
+--error 1292
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i'));
+--error 1292
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
+--error 1292
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('31.9.2004 15.30','%d.%m.%Y %H.%i'));
+
+# deactivated because of Bug#5902
+# Bug#5902: Traditional mode: STR_TO_DATE changes invalid value rather than rejecting
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(STR_TO_DATE('32.10.2004 15.30','%d.%m.%Y %H.%i'));
+
+--error 1292
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('29.02.2003 15.30','%d.%m.%Y %H.%i'));
+
+# deactivated because of Bug#5902
+# Bug#5902: Traditional mode: STR_TO_DATE changes invalid value rather than rejecting
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(STR_TO_DATE('15.13.2004 15.30','%d.%m.%Y %H.%i'));
+
+--error 1292
+INSERT INTO t1 (col3) VALUES(STR_TO_DATE('00.00.0000','%d.%m.%Y'));
+
+drop table t1;
+
+
+#### Test INSERT with CAST AS DATE/DATETIME into DATE/DATETIME/TIMESTAMP
+
+CREATE TABLE t1 (col1 date, col2 datetime, col3 timestamp);
+
+INSERT INTO t1 (col1) VALUES (CAST('2004-10-15' AS DATE));
+INSERT INTO t1 (col2) VALUES (CAST('2004-10-15 10:15' AS DATETIME));
+INSERT INTO t1 (col3) VALUES (CAST('2004-10-15 10:15' AS DATETIME));
+
+
+## Test INSERT with CAST AS DATE into DATE
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid date value>
+INSERT INTO t1 (col1) VALUES(CAST('0000-10-31' AS DATE));
+
+--error 1292
+INSERT INTO t1 (col1) VALUES(CAST('2004-10-0' AS DATE));
+--error 1292
+INSERT INTO t1 (col1) VALUES(CAST('2004-0-10' AS DATE));
+
+# deactivated because of Bug#8294
+# Bug#8294 Traditional: Misleading error message for invalid CAST to DATE
+# --error 1292
+# INSERT INTO t1 (col1) VALUES(CAST('2004-9-31' AS DATE));
+# --error 1292
+# INSERT INTO t1 (col1) VALUES(CAST('2004-10-32' AS DATE));
+# --error 1292
+# INSERT INTO t1 (col1) VALUES(CAST('2003-02-29' AS DATE));
+# --error 1292
+# INSERT INTO t1 (col1) VALUES(CAST('2004-13-15' AS DATE));
+
+# deactivated because of Bug#6145
+# Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values
+#--error 1292
+#INSERT INTO t1 (col1) VALUES(CAST('0000-00-00' AS DATE));
+
+## Test INSERT with CAST AS DATETIME into DATETIME
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid datetime value>
+INSERT INTO t1 (col2) VALUES(CAST('0000-10-31 15:30' AS DATETIME));
+
+--error 1292
+INSERT INTO t1 (col2) VALUES(CAST('2004-10-0 15:30' AS DATETIME));
+--error 1292
+INSERT INTO t1 (col2) VALUES(CAST('2004-0-10 15:30' AS DATETIME));
+
+# deactivated because of Bug#8294
+# Bug#8294 Traditional: Misleading error message for invalid CAST to DATE
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(CAST('2004-9-31 15:30' AS DATETIME));
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(CAST('2004-10-32 15:30' AS DATETIME));
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(CAST('2003-02-29 15:30' AS DATETIME));
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(CAST('2004-13-15 15:30' AS DATETIME));
+
+# deactivated because of Bug#6145
+# Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(CAST('0000-00-00' AS DATETIME));
+
+## Test INSERT with CAST AS DATETIME into TIMESTAMP
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid datetime value>
+!$1292
+INSERT INTO t1 (col3) VALUES(CAST('0000-10-31 15:30' AS DATETIME));
+-- should return OK
+-- We accept this to be a failure
+
+--error 1292
+INSERT INTO t1 (col3) VALUES(CAST('2004-10-0 15:30' AS DATETIME));
+--error 1292
+INSERT INTO t1 (col3) VALUES(CAST('2004-0-10 15:30' AS DATETIME));
+-- should return SQLSTATE 22007 <invalid datetime value>
+
+# deactivated because of Bug#8294
+# Bug#8294 Traditional: Misleading error message for invalid CAST to DATE
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(CAST('2004-9-31 15:30' AS DATETIME));
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(CAST('2004-10-32 15:30' AS DATETIME));
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(CAST('2003-02-29 15:30' AS DATETIME));
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(CAST('2004-13-15 15:30' AS DATETIME));
+
+# deactivated because of Bug#6145
+# Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(CAST('0000-00-00' AS DATETIME));
+
+drop table t1;
+
+
+#### Test INSERT with CONVERT to DATE/DATETIME into DATE/DATETIME/TIMESTAMP
+
+CREATE TABLE t1 (col1 date, col2 datetime, col3 timestamp);
+
+INSERT INTO t1 (col1) VALUES (CONVERT('2004-10-15',DATE));
+INSERT INTO t1 (col2) VALUES (CONVERT('2004-10-15 10:15',DATETIME));
+INSERT INTO t1 (col3) VALUES (CONVERT('2004-10-15 10:15',DATETIME));
+
+
+## Test INSERT with CONVERT to DATE into DATE
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid date value>
+INSERT INTO t1 (col1) VALUES(CONVERT('0000-10-31' , DATE));
+
+--error 1292
+INSERT INTO t1 (col1) VALUES(CONVERT('2004-10-0' , DATE));
+--error 1292
+INSERT INTO t1 (col1) VALUES(CONVERT('2004-0-10' , DATE));
+
+# deactivated because of Bug#8294
+# Bug#8294 Traditional: Misleading error message for invalid CAST to DATE
+#--error 1292
+#INSERT INTO t1 (col1) VALUES(CONVERT('2004-9-31' , DATE));
+#--error 1292
+#INSERT INTO t1 (col1) VALUES(CONVERT('2004-10-32' , DATE));
+#--error 1292
+#INSERT INTO t1 (col1) VALUES(CONVERT('2003-02-29' , DATE));
+#--error 1292
+#INSERT INTO t1 (col1) VALUES(CONVERT('2004-13-15',DATE));
+
+# deactivated because of Bug#6145
+# Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values
+#--error 1292
+#INSERT INTO t1 (col1) VALUES(CONVERT('0000-00-00',DATE));
+
+## Test INSERT with CONVERT to DATETIME into DATETIME
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid datetime value>
+INSERT INTO t1 (col2) VALUES(CONVERT('0000-10-31 15:30',DATETIME));
+
+--error 1292
+INSERT INTO t1 (col2) VALUES(CONVERT('2004-10-0 15:30',DATETIME));
+--error 1292
+INSERT INTO t1 (col2) VALUES(CONVERT('2004-0-10 15:30',DATETIME));
+
+# deactivated because of Bug#8294
+# Bug#8294 Traditional: Misleading error message for invalid CAST to DATE
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(CONVERT('2004-9-31 15:30',DATETIME));
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(CONVERT('2004-10-32 15:30',DATETIME));
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(CONVERT('2003-02-29 15:30',DATETIME));
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(CONVERT('2004-13-15 15:30',DATETIME));
+
+# Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values
+#--error 1292
+#INSERT INTO t1 (col2) VALUES(CONVERT('0000-00-00',DATETIME));
+
+## Test INSERT with CONVERT to DATETIME into DATETIME
+# All test cases expected to fail should return
+# SQLSTATE 22007 <invalid datetime value>
+!$1292
+INSERT INTO t1 (col3) VALUES(CONVERT('0000-10-31 15:30',DATETIME));
+-- should return OK
+-- We accept this to be a failure
+
+--error 1292
+INSERT INTO t1 (col3) VALUES(CONVERT('2004-10-0 15:30',DATETIME));
+--error 1292
+INSERT INTO t1 (col3) VALUES(CONVERT('2004-0-10 15:30',DATETIME));
+
+# deactivated because of Bug#8294
+# Bug#8294 Traditional: Misleading error message for invalid CAST to DATE
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(CONVERT('2004-9-31 15:30',DATETIME));
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(CONVERT('2004-10-32 15:30',DATETIME));
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(CONVERT('2003-02-29 15:30',DATETIME));
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(CONVERT('2004-13-15 15:30',DATETIME));
+
+# deactivated because of Bug#6145
+# Bug#6145: Traditional: CONVERT and CAST should reject zero DATE values
+#--error 1292
+#INSERT INTO t1 (col3) VALUES(CONVERT('0000-00-00',DATETIME));
+
+drop table t1;
+
+
# Test INSERT with TINYINT
CREATE TABLE t1(col1 TINYINT, col2 TINYINT UNSIGNED);
diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test
index 7b75686ab4e..429012e8a36 100644
--- a/mysql-test/t/subselect.test
+++ b/mysql-test/t/subselect.test
@@ -1442,3 +1442,104 @@ select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx;
-- error 1247
select 1 = ALL (select 1 from t1 where 1 = xx ), 1 as xx from DUAL;
drop table t1;
+
+# Test for BUG#8218
+
+CREATE TABLE t1 (
+ categoryId int(11) NOT NULL,
+ courseId int(11) NOT NULL,
+ startDate datetime NOT NULL,
+ endDate datetime NOT NULL,
+ createDate datetime NOT NULL,
+ modifyDate timestamp NOT NULL,
+ attributes text NOT NULL
+);
+INSERT INTO t1 VALUES (1,41,'2004-02-09','2010-01-01','2004-02-09','2004-02-09',''),
+(1,86,'2004-08-16','2004-08-16','2004-08-16','2004-08-16',''),
+(1,87,'2004-08-16','2004-08-16','2004-08-16','2004-08-16',''),
+(2,52,'2004-03-15','2004-10-01','2004-03-15','2004-09-17',''),
+(2,53,'2004-03-16','2004-10-01','2004-03-16','2004-09-17',''),
+(2,88,'2004-08-16','2004-08-16','2004-08-16','2004-08-16',''),
+(2,89,'2004-08-16','2004-08-16','2004-08-16','2004-08-16',''),
+(3,51,'2004-02-09','2010-01-01','2004-02-09','2004-02-09',''),
+(5,12,'2004-02-18','2010-01-01','2004-02-18','2004-02-18','');
+
+CREATE TABLE t2 (
+ userId int(11) NOT NULL,
+ courseId int(11) NOT NULL,
+ date datetime NOT NULL
+);
+INSERT INTO t2 VALUES (5141,71,'2003-11-18'),
+(5141,72,'2003-11-25'),(5141,41,'2004-08-06'),
+(5141,52,'2004-08-06'),(5141,53,'2004-08-06'),
+(5141,12,'2004-08-06'),(5141,86,'2004-10-21'),
+(5141,87,'2004-10-21'),(5141,88,'2004-10-21'),
+(5141,89,'2004-10-22'),(5141,51,'2004-10-26');
+
+
+CREATE TABLE t3 (
+ groupId int(11) NOT NULL,
+ parentId int(11) NOT NULL,
+ startDate datetime NOT NULL,
+ endDate datetime NOT NULL,
+ createDate datetime NOT NULL,
+ modifyDate timestamp NOT NULL,
+ ordering int(11)
+);
+INSERT INTO t3 VALUES (12,9,'1000-01-01','3999-12-31','2004-01-29','2004-01-29',NULL);
+
+CREATE TABLE t4 (
+ id int(11) NOT NULL,
+ groupTypeId int(11) NOT NULL,
+ groupKey varchar(50) NOT NULL,
+ name text,
+ ordering int(11),
+ description text,
+ createDate datetime NOT NULL,
+ modifyDate timestamp NOT NULL
+);
+INSERT INTO t4 VALUES (9,5,'stationer','stationer',0,'Stationer','2004-01-29','2004-01-29'),
+(12,5,'group2','group2',0,'group2','2004-01-29','2004-01-29');
+
+CREATE TABLE t5 (
+ userId int(11) NOT NULL,
+ groupId int(11) NOT NULL,
+ createDate datetime NOT NULL,
+ modifyDate timestamp NOT NULL
+);
+INSERT INTO t5 VALUES (5141,12,'2004-08-06','2004-08-06');
+
+select
+ count(distinct t2.userid) pass,
+ groupstuff.*,
+ count(t2.courseid) crse,
+ t1.categoryid,
+ t2.courseid,
+ date_format(date, '%b%y') as colhead
+from t2
+join t1 on t2.courseid=t1.courseid
+join
+(
+ select
+ t5.userid,
+ parentid,
+ parentgroup,
+ childid,
+ groupname,
+ grouptypeid
+ from t5
+ join
+ (
+ select t4.id as parentid,
+ t4.name as parentgroup,
+ t4.id as childid,
+ t4.name as groupname,
+ t4.grouptypeid
+ from t4
+ ) as gin on t5.groupid=gin.childid
+) as groupstuff on t2.userid = groupstuff.userid
+group by
+ groupstuff.groupname, colhead , t2.courseid;
+
+drop table if exists t1, t2, t3, t4, t5;
+
diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test
index be6bc7a48d8..5ff22f1d6b6 100644
--- a/mysql-test/t/union.test
+++ b/mysql-test/t/union.test
@@ -717,3 +717,15 @@ union
order by sdate;
show columns from t4;
drop table t1, t2, t3, t4;
+
+#
+# Bug #2435 UNION with parentheses not supported
+#
+create table t1 (a int not null, b char (10) not null);
+insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c');
+select * from ((select * from t1 limit 1)) a;
+select * from ((select * from t1 limit 1) union (select * from t1 limit 1)) a;
+select * from ((select * from t1 limit 1) union (select * from t1 limit 1) union (select * from t1 limit 1)) a;
+select * from ((((select * from t1))) union (select * from t1) union (select * from t1)) a;
+select * from ((select * from t1) union (((select * from t1))) union (select * from t1)) a;
+drop table t1;
diff --git a/ndb/include/kernel/signaldata/DictTabInfo.hpp b/ndb/include/kernel/signaldata/DictTabInfo.hpp
index 61c043f2998..09b00cf8993 100644
--- a/ndb/include/kernel/signaldata/DictTabInfo.hpp
+++ b/ndb/include/kernel/signaldata/DictTabInfo.hpp
@@ -24,6 +24,28 @@
#include <trigger_definitions.h>
#include <NdbSqlUtil.hpp>
+#ifndef my_decimal_h
+
+// sql/my_decimal.h requires many more sql/*.h new to ndb
+// for now, copy the bit we need TODO proper fix
+
+#define DECIMAL_MAX_LENGTH ((8 * 9) - 8)
+
+#ifndef NOT_FIXED_DEC
+#define NOT_FIXED_DEC 31
+#endif
+
+C_MODE_START
+extern int decimal_bin_size(int, int);
+C_MODE_END
+
+inline int my_decimal_get_binary_size(uint precision, uint scale)
+{
+ return decimal_bin_size((int)precision, (int)scale);
+}
+
+#endif
+
#define DTIMAP(x, y, z) \
{ DictTabInfo::y, offsetof(x, z), SimpleProperties::Uint32Value, 0, (~0), 0 }
@@ -264,7 +286,10 @@ public:
ExtBigunsigned = NdbSqlUtil::Type::Bigunsigned,
ExtFloat = NdbSqlUtil::Type::Float,
ExtDouble = NdbSqlUtil::Type::Double,
+ ExtOlddecimal = NdbSqlUtil::Type::Olddecimal,
+ ExtOlddecimalunsigned = NdbSqlUtil::Type::Olddecimalunsigned,
ExtDecimal = NdbSqlUtil::Type::Decimal,
+ ExtDecimalunsigned = NdbSqlUtil::Type::Decimalunsigned,
ExtChar = NdbSqlUtil::Type::Char,
ExtVarchar = NdbSqlUtil::Type::Varchar,
ExtBinary = NdbSqlUtil::Type::Binary,
@@ -345,9 +370,31 @@ public:
AttributeSize = DictTabInfo::a64Bit;
AttributeArraySize = AttributeExtLength;
break;
+ case DictTabInfo::ExtOlddecimal:
+ AttributeSize = DictTabInfo::an8Bit;
+ AttributeArraySize =
+ (1 + AttributeExtPrecision + (int(AttributeExtScale) > 0)) *
+ AttributeExtLength;
+ break;
+ case DictTabInfo::ExtOlddecimalunsigned:
+ AttributeSize = DictTabInfo::an8Bit;
+ AttributeArraySize =
+ (0 + AttributeExtPrecision + (int(AttributeExtScale) > 0)) *
+ AttributeExtLength;
+ break;
case DictTabInfo::ExtDecimal:
- // not yet implemented anywhere
- return false;
+ case DictTabInfo::ExtDecimalunsigned:
+ {
+ // copy from Field_new_decimal ctor
+ uint precision = AttributeExtPrecision;
+ uint scale = AttributeExtScale;
+ if (precision > DECIMAL_MAX_LENGTH || scale >= NOT_FIXED_DEC)
+ precision = DECIMAL_MAX_LENGTH;
+ uint bin_size = my_decimal_get_binary_size(precision, scale);
+ AttributeSize = DictTabInfo::an8Bit;
+ AttributeArraySize = bin_size * AttributeExtLength;
+ }
+ break;
case DictTabInfo::ExtChar:
case DictTabInfo::ExtBinary:
AttributeSize = DictTabInfo::an8Bit;
diff --git a/ndb/include/ndb_constants.h b/ndb/include/ndb_constants.h
index da3fc2cbdd8..c7c15063cc5 100644
--- a/ndb/include/ndb_constants.h
+++ b/ndb/include/ndb_constants.h
@@ -48,7 +48,7 @@
#define NDB_TYPE_BIGUNSIGNED 10
#define NDB_TYPE_FLOAT 11
#define NDB_TYPE_DOUBLE 12
-#define NDB_TYPE_DECIMAL 13 /* not used */
+#define NDB_TYPE_OLDDECIMAL 13
#define NDB_TYPE_CHAR 14
#define NDB_TYPE_VARCHAR 15
#define NDB_TYPE_BINARY 16
@@ -63,7 +63,10 @@
#define NDB_TYPE_TIME 25
#define NDB_TYPE_YEAR 26
#define NDB_TYPE_TIMESTAMP 27
+#define NDB_TYPE_OLDDECIMALUNSIGNED 28
+#define NDB_TYPE_DECIMAL 29
+#define NDB_TYPE_DECIMALUNSIGNED 30
-#define NDB_TYPE_MAX 28
+#define NDB_TYPE_MAX 31
#endif
diff --git a/ndb/include/ndbapi/NdbDictionary.hpp b/ndb/include/ndbapi/NdbDictionary.hpp
index 6b9085fbdca..44851b70958 100644
--- a/ndb/include/ndbapi/NdbDictionary.hpp
+++ b/ndb/include/ndbapi/NdbDictionary.hpp
@@ -184,7 +184,10 @@ public:
Bigunsigned = NDB_TYPE_BIGUNSIGNED, ///< 64 Bit. 8 byte signed integer, can be used in array
Float = NDB_TYPE_FLOAT, ///< 32-bit float. 4 bytes float, can be used in array
Double = NDB_TYPE_DOUBLE, ///< 64-bit float. 8 byte float, can be used in array
- Decimal = NDB_TYPE_DECIMAL, ///< Precision, Scale are applicable
+ Olddecimal = NDB_TYPE_OLDDECIMAL, ///< MySQL < 5.0 signed decimal, Precision, Scale
+ Olddecimalunsigned = NDB_TYPE_OLDDECIMALUNSIGNED,
+ Decimal = NDB_TYPE_DECIMAL, ///< MySQL >= 5.0 signed decimal, Precision, Scale
+ Decimalunsigned = NDB_TYPE_DECIMALUNSIGNED,
Char = NDB_TYPE_CHAR, ///< Len. A fixed array of 1-byte chars
Varchar = NDB_TYPE_VARCHAR, ///< Length bytes: 1, Max: 255
Binary = NDB_TYPE_BINARY, ///< Len
@@ -248,13 +251,13 @@ public:
/**
* Get precision of column.
- * @note Only applicable for builtin type Decimal
+ * @note Only applicable for decimal types
*/
int getPrecision() const;
/**
* Get scale of column.
- * @note Only applicable for builtin type Decimal
+ * @note Only applicable for decimal types
*/
int getScale() const;
@@ -372,13 +375,13 @@ public:
/**
* Set precision of column.
- * @note Only applicable for builtin type Decimal
+ * @note Only applicable for decimal types
*/
void setPrecision(int);
/**
* Set scale of column.
- * @note Only applicable for builtin type Decimal
+ * @note Only applicable for decimal types
*/
void setScale(int);
diff --git a/ndb/include/util/NdbSqlUtil.hpp b/ndb/include/util/NdbSqlUtil.hpp
index a8a2979558a..41e4dadfd60 100644
--- a/ndb/include/util/NdbSqlUtil.hpp
+++ b/ndb/include/util/NdbSqlUtil.hpp
@@ -80,7 +80,7 @@ public:
Bigunsigned = NDB_TYPE_BIGUNSIGNED,
Float = NDB_TYPE_FLOAT,
Double = NDB_TYPE_DOUBLE,
- Decimal = NDB_TYPE_DECIMAL,
+ Olddecimal = NDB_TYPE_OLDDECIMAL,
Char = NDB_TYPE_CHAR,
Varchar = NDB_TYPE_VARCHAR,
Binary = NDB_TYPE_BINARY,
@@ -94,7 +94,10 @@ public:
Longvarbinary = NDB_TYPE_LONG_VARBINARY,
Time = NDB_TYPE_TIME,
Year = NDB_TYPE_YEAR,
- Timestamp = NDB_TYPE_TIMESTAMP
+ Timestamp = NDB_TYPE_TIMESTAMP,
+ Olddecimalunsigned = NDB_TYPE_OLDDECIMALUNSIGNED,
+ Decimal = NDB_TYPE_DECIMAL,
+ Decimalunsigned = NDB_TYPE_DECIMALUNSIGNED
};
Enum m_typeId; // redundant
Cmp* m_cmp; // comparison method
@@ -130,6 +133,11 @@ public:
*/
static int strnxfrm_bug7284(CHARSET_INFO* cs, unsigned char* dst, unsigned dstLen, const unsigned char*src, unsigned srcLen);
+ /**
+ * Compare decimal numbers.
+ */
+ static int cmp_olddecimal(const uchar* s1, const uchar* s2, unsigned n);
+
private:
/**
* List of all types. Must match Type::Enum.
@@ -150,7 +158,7 @@ private:
static Cmp cmpBigunsigned;
static Cmp cmpFloat;
static Cmp cmpDouble;
- static Cmp cmpDecimal;
+ static Cmp cmpOlddecimal;
static Cmp cmpChar;
static Cmp cmpVarchar;
static Cmp cmpBinary;
@@ -165,6 +173,9 @@ private:
static Cmp cmpTime;
static Cmp cmpYear;
static Cmp cmpTimestamp;
+ static Cmp cmpOlddecimalunsigned;
+ static Cmp cmpDecimal;
+ static Cmp cmpDecimalunsigned;
};
#endif
diff --git a/ndb/src/common/util/NdbSqlUtil.cpp b/ndb/src/common/util/NdbSqlUtil.cpp
index bff829cbaf8..7ecfb5194b8 100644
--- a/ndb/src/common/util/NdbSqlUtil.cpp
+++ b/ndb/src/common/util/NdbSqlUtil.cpp
@@ -77,117 +77,129 @@ NdbSqlUtil::char_like(const char* s1, unsigned n1,
const NdbSqlUtil::Type
NdbSqlUtil::m_typeList[] = {
- {
+ { // 0
Type::Undefined,
NULL
},
- {
+ { // 1
Type::Tinyint,
cmpTinyint
},
- {
+ { // 2
Type::Tinyunsigned,
cmpTinyunsigned
},
- {
+ { // 3
Type::Smallint,
cmpSmallint
},
- {
+ { // 4
Type::Smallunsigned,
cmpSmallunsigned
},
- {
+ { // 5
Type::Mediumint,
cmpMediumint
},
- {
+ { // 6
Type::Mediumunsigned,
cmpMediumunsigned
},
- {
+ { // 7
Type::Int,
cmpInt
},
- {
+ { // 8
Type::Unsigned,
cmpUnsigned
},
- {
+ { // 9
Type::Bigint,
cmpBigint
},
- {
+ { // 10
Type::Bigunsigned,
cmpBigunsigned
},
- {
+ { // 11
Type::Float,
cmpFloat
},
- {
+ { // 12
Type::Double,
cmpDouble
},
- {
- Type::Decimal,
- NULL // cmpDecimal
+ { // 13
+ Type::Olddecimal,
+ cmpOlddecimal
},
- {
+ { // 14
Type::Char,
cmpChar
},
- {
+ { // 15
Type::Varchar,
cmpVarchar
},
- {
+ { // 16
Type::Binary,
cmpBinary
},
- {
+ { // 17
Type::Varbinary,
cmpVarbinary
},
- {
+ { // 18
Type::Datetime,
cmpDatetime
},
- {
+ { // 19
Type::Date,
cmpDate
},
- {
+ { // 20
Type::Blob,
NULL // cmpBlob
},
- {
+ { // 21
Type::Text,
NULL // cmpText
},
- {
+ { // 22
Type::Bit,
NULL // cmpBit
},
- {
+ { // 23
Type::Longvarchar,
cmpLongvarchar
},
- {
+ { // 24
Type::Longvarbinary,
cmpLongvarbinary
},
- {
+ { // 25
Type::Time,
cmpTime
},
- {
+ { // 26
Type::Year,
cmpYear
},
- {
+ { // 27
Type::Timestamp,
cmpTimestamp
+ },
+ { // 28
+ Type::Olddecimalunsigned,
+ cmpOlddecimalunsigned
+ },
+ { // 29
+ Type::Decimal,
+ cmpDecimal
+ },
+ { // 30
+ Type::Decimalunsigned,
+ cmpDecimalunsigned
}
};
@@ -430,15 +442,84 @@ NdbSqlUtil::cmpDouble(const void* info, const void* p1, unsigned n1, const void*
return CmpUnknown;
}
-// not used by MySQL or NDB
int
-NdbSqlUtil::cmpDecimal(const void* info, const void* p1, unsigned n1, const void* p2, unsigned n2, bool full)
+NdbSqlUtil::cmp_olddecimal(const uchar* s1, const uchar* s2, unsigned n)
{
- assert(false);
+ int sgn = +1;
+ unsigned i = 0;
+ while (i < n) {
+ int c1 = s1[i];
+ int c2 = s2[i];
+ if (c1 == c2) {
+ if (c1 == '-')
+ sgn = -1;
+ } else if (c1 == '-') {
+ return -1;
+ } else if (c2 == '-') {
+ return +1;
+ } else if (c1 < c2) {
+ return -1 * sgn;
+ } else {
+ return +1 * sgn;
+ }
+ i++;
+ }
return 0;
}
int
+NdbSqlUtil::cmpOlddecimal(const void* info, const void* p1, unsigned n1, const void* p2, unsigned n2, bool full)
+{
+ if (full) {
+ assert(n1 == n2);
+ const uchar* v1 = (const uchar*)p1;
+ const uchar* v2 = (const uchar*)p2;
+ return cmp_olddecimal(v1, v2, n1);
+ }
+ return CmpUnknown;
+}
+
+int
+NdbSqlUtil::cmpOlddecimalunsigned(const void* info, const void* p1, unsigned n1, const void* p2, unsigned n2, bool full)
+{
+ if (full) {
+ assert(n1 == n2);
+ const uchar* v1 = (const uchar*)p1;
+ const uchar* v2 = (const uchar*)p2;
+ return cmp_olddecimal(v1, v2, n1);
+ }
+ return CmpUnknown;
+}
+
+int
+NdbSqlUtil::cmpDecimal(const void* info, const void* p1, unsigned n1, const void* p2, unsigned n2, bool full)
+{
+ const uchar* v1 = (const uchar*)p1;
+ const uchar* v2 = (const uchar*)p2;
+ // compare as binary strings
+ unsigned n = (n1 <= n2 ? n1 : n2);
+ int k = memcmp(v1, v2, n);
+ if (k == 0) {
+ k = (full ? n1 : n) - n2;
+ }
+ return k < 0 ? -1 : k > 0 ? +1 : full ? 0 : CmpUnknown;
+}
+
+int
+NdbSqlUtil::cmpDecimalunsigned(const void* info, const void* p1, unsigned n1, const void* p2, unsigned n2, bool full)
+{
+ const uchar* v1 = (const uchar*)p1;
+ const uchar* v2 = (const uchar*)p2;
+ // compare as binary strings
+ unsigned n = (n1 <= n2 ? n1 : n2);
+ int k = memcmp(v1, v2, n);
+ if (k == 0) {
+ k = (full ? n1 : n) - n2;
+ }
+ return k < 0 ? -1 : k > 0 ? +1 : full ? 0 : CmpUnknown;
+}
+
+int
NdbSqlUtil::cmpChar(const void* info, const void* p1, unsigned n1, const void* p2, unsigned n2, bool full)
{
// collation does not work on prefix for some charsets
diff --git a/ndb/src/mgmsrv/MgmtSrvr.cpp b/ndb/src/mgmsrv/MgmtSrvr.cpp
index fc880079b40..e36461c8d0d 100644
--- a/ndb/src/mgmsrv/MgmtSrvr.cpp
+++ b/ndb/src/mgmsrv/MgmtSrvr.cpp
@@ -2783,7 +2783,8 @@ MgmtSrvr::setConnectionDbParameter(int node1,
Uint32 n1,n2;
iter.get(CFG_CONNECTION_NODE_1, &n1);
iter.get(CFG_CONNECTION_NODE_2, &n2);
- if(n1 == (unsigned)node1 && n2 == (unsigned)node2)
+ if((n1 == (unsigned)node1 && n2 == (unsigned)node2)
+ || (n1 == (unsigned)node2 && n2 == (unsigned)node1))
break;
}
if(!iter.valid()) {
diff --git a/ndb/src/ndbapi/NdbDictionary.cpp b/ndb/src/ndbapi/NdbDictionary.cpp
index 346f5de9eb5..664d568aee0 100644
--- a/ndb/src/ndbapi/NdbDictionary.cpp
+++ b/ndb/src/ndbapi/NdbDictionary.cpp
@@ -948,8 +948,17 @@ operator<<(NdbOut& out, const NdbDictionary::Column& col)
case NdbDictionary::Column::Double:
out << "Double";
break;
+ case NdbDictionary::Column::Olddecimal:
+ out << "Olddecimal(" << col.getPrecision() << "," << col.getScale() << ")";
+ break;
+ case NdbDictionary::Column::Olddecimalunsigned:
+ out << "Olddecimalunsigned(" << col.getPrecision() << "," << col.getScale() << ")";
+ break;
case NdbDictionary::Column::Decimal:
- out << "Decimal(" << col.getScale() << "," << col.getPrecision() << ")";
+ out << "Decimal(" << col.getPrecision() << "," << col.getScale() << ")";
+ break;
+ case NdbDictionary::Column::Decimalunsigned:
+ out << "Decimalunsigned(" << col.getPrecision() << "," << col.getScale() << ")";
break;
case NdbDictionary::Column::Char:
out << "Char(" << col.getLength() << ";" << csname << ")";
diff --git a/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/ndb/src/ndbapi/NdbDictionaryImpl.cpp
index f917fcce18b..8c3f238404f 100644
--- a/ndb/src/ndbapi/NdbDictionaryImpl.cpp
+++ b/ndb/src/ndbapi/NdbDictionaryImpl.cpp
@@ -109,7 +109,10 @@ NdbColumnImpl::init(Type t)
m_length = 1;
m_cs = NULL;
break;
+ case Olddecimal:
+ case Olddecimalunsigned:
case Decimal:
+ case Decimalunsigned:
m_precision = 10;
m_scale = 0;
m_length = 1;
diff --git a/ndb/src/ndbapi/NdbRecAttr.cpp b/ndb/src/ndbapi/NdbRecAttr.cpp
index 85b08c0cfa4..86a777e79d2 100644
--- a/ndb/src/ndbapi/NdbRecAttr.cpp
+++ b/ndb/src/ndbapi/NdbRecAttr.cpp
@@ -178,7 +178,8 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
return out;
}
- uint length = r.getColumn()->getLength();
+ const NdbDictionary::Column* c = r.getColumn();
+ uint length = c->getLength();
if (length > 1)
out << "[";
@@ -237,6 +238,22 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
case NdbDictionary::Column::Double:
out << r.double_value();
break;
+ case NdbDictionary::Column::Olddecimal:
+ {
+ short len = 1 + c->getPrecision() + (c->getScale() > 0);
+ out.print("%.*s", len, r.aRef());
+ }
+ break;
+ case NdbDictionary::Column::Olddecimalunsigned:
+ {
+ short len = 0 + c->getPrecision() + (c->getScale() > 0);
+ out.print("%.*s", len, r.aRef());
+ }
+ break;
+ case NdbDictionary::Column::Decimal:
+ case NdbDictionary::Column::Decimalunsigned:
+ goto unknown; // TODO
+ break;
// for dates cut-and-paste from field.cc
case NdbDictionary::Column::Datetime:
{
@@ -346,6 +363,7 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
j = length;
}
break;
+ unknown:
default: /* no print functions for the rest, just print type */
out << (int) r.getType();
j = length;
diff --git a/ndb/test/include/NdbSchemaOp.hpp b/ndb/test/include/NdbSchemaOp.hpp
index 77e704c0e5c..da55f5f9aa5 100644
--- a/ndb/test/include/NdbSchemaOp.hpp
+++ b/ndb/test/include/NdbSchemaOp.hpp
@@ -567,7 +567,10 @@ convertColumnTypeToAttrType(NdbDictionary::Column::Type _type)
case NdbDictionary::Column::Unsigned:
return UnSigned;
case NdbDictionary::Column::Float:
+ case NdbDictionary::Column::Olddecimal:
+ case NdbDictionary::Column::Olddecimalunsigned:
case NdbDictionary::Column::Decimal:
+ case NdbDictionary::Column::Decimalunsigned:
case NdbDictionary::Column::Double:
return Float;
case NdbDictionary::Column::Char:
diff --git a/ndb/test/run-test/Makefile.am b/ndb/test/run-test/Makefile.am
index 127ef22f37c..6b3ba0bff09 100644
--- a/ndb/test/run-test/Makefile.am
+++ b/ndb/test/run-test/Makefile.am
@@ -10,7 +10,7 @@ test_DATA=daily-basic-tests.txt daily-devel-tests.txt
test_SCRIPTS=atrt-analyze-result.sh atrt-gather-result.sh atrt-setup.sh \
atrt-clear-result.sh make-config.sh make-index.sh make-html-reports.sh
-atrt_SOURCES = main.cpp
+atrt_SOURCES = main.cpp run-test.hpp
INCLUDES_LOC = -I$(top_srcdir)/ndb/test/include
LDADD_LOC = $(top_builddir)/ndb/test/src/libNDBT.a \
$(top_builddir)/ndb/src/libndbclient.la \
@@ -21,7 +21,7 @@ LDADD_LOC = $(top_builddir)/ndb/test/src/libNDBT.a \
wrappersdir=$(prefix)/bin
wrappers_SCRIPTS=atrt-testBackup atrt-mysql-test-run
-noinst_HEADERS = run-test.hpp $(test_DATA) $(test_SCRIPTS) $(wrappers_SCRIPTS) README.ATRT
+EXTRA_DIST = $(test_DATA) $(test_SCRIPTS) $(wrappers_SCRIPTS) README.ATRT
# Don't update the files from bitkeeper
%::SCCS/s.%
diff --git a/ndb/test/src/HugoCalculator.cpp b/ndb/test/src/HugoCalculator.cpp
index 44edb34295a..8e01f6442bb 100644
--- a/ndb/test/src/HugoCalculator.cpp
+++ b/ndb/test/src/HugoCalculator.cpp
@@ -145,7 +145,10 @@ HugoCalculator::calcValue(int record,
case NdbDictionary::Column::Bigunsigned:
case NdbDictionary::Column::Float:
case NdbDictionary::Column::Double:
+ case NdbDictionary::Column::Olddecimal:
+ case NdbDictionary::Column::Olddecimalunsigned:
case NdbDictionary::Column::Decimal:
+ case NdbDictionary::Column::Decimalunsigned:
case NdbDictionary::Column::Binary:
case NdbDictionary::Column::Datetime:
case NdbDictionary::Column::Time:
diff --git a/ndb/tools/restore/consumer.cpp b/ndb/tools/restore/consumer.cpp
index 4d228230423..b130c4998d5 100644
--- a/ndb/tools/restore/consumer.cpp
+++ b/ndb/tools/restore/consumer.cpp
@@ -44,9 +44,14 @@ BackupConsumer::create_table_string(const TableS & table,
case NdbDictionary::Column::Float:
pos += sprintf(buf+pos, "%s", "float");
break;
+ case NdbDictionary::Column::Olddecimal:
case NdbDictionary::Column::Decimal:
pos += sprintf(buf+pos, "%s", "decimal");
break;
+ case NdbDictionary::Column::Olddecimalunsigned:
+ case NdbDictionary::Column::Decimalunsigned:
+ pos += sprintf(buf+pos, "%s", "decimal unsigned");
+ break;
case NdbDictionary::Column::Char:
pos += sprintf(buf+pos, "%s", "char");
break;
diff --git a/scripts/mysql_create_system_tables.sh b/scripts/mysql_create_system_tables.sh
index 75ab48227f7..40525cb20ce 100644
--- a/scripts/mysql_create_system_tables.sh
+++ b/scripts/mysql_create_system_tables.sh
@@ -176,9 +176,7 @@ then
INSERT INTO user (host,user) values ('localhost','');"
else
i_u="$i_u
- INSERT INTO user VALUES ('%','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
- INSERT INTO user VALUES ('localhost','','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
- INSERT INTO user VALUES ('%','','','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','','','','',0,0,0,0);"
+ INSERT INTO user VALUES ('localhost','','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);"
fi
fi
fi
diff --git a/sql/examples/ha_archive.cc b/sql/examples/ha_archive.cc
index fb9a9d2281a..070469819ee 100644
--- a/sql/examples/ha_archive.cc
+++ b/sql/examples/ha_archive.cc
@@ -115,6 +115,8 @@
data - The data is stored in a "row +blobs" format.
*/
+/* If the archive storage engine has been inited */
+static bool archive_inited= 0;
/* Variables for archive share methods */
pthread_mutex_t archive_mutex;
static HASH archive_open_tables;
@@ -175,6 +177,7 @@ static byte* archive_get_key(ARCHIVE_SHARE *share,uint *length,
handlerton *archive_db_init()
{
+ archive_inited= 1;
VOID(pthread_mutex_init(&archive_mutex, MY_MUTEX_INIT_FAST));
if (hash_init(&archive_open_tables, system_charset_info, 32, 0, 0,
(hash_get_key) archive_get_key, 0, 0))
@@ -195,8 +198,12 @@ handlerton *archive_db_init()
bool archive_db_end()
{
- hash_free(&archive_open_tables);
- VOID(pthread_mutex_destroy(&archive_mutex));
+ if (archive_inited)
+ {
+ hash_free(&archive_open_tables);
+ VOID(pthread_mutex_destroy(&archive_mutex));
+ }
+ archive_inited= 0;
return FALSE;
}
diff --git a/sql/field.cc b/sql/field.cc
index bc95e1dab54..0be72458701 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -572,8 +572,7 @@ my_decimal* Field_num::val_decimal(my_decimal *decimal_value)
{
DBUG_ASSERT(result_type() == INT_RESULT);
longlong nr= val_int();
- if (!is_null())
- int2my_decimal(E_DEC_FATAL_ERROR, nr, unsigned_flag, decimal_value);
+ int2my_decimal(E_DEC_FATAL_ERROR, nr, unsigned_flag, decimal_value);
return decimal_value;
}
@@ -605,7 +604,7 @@ void Field_num::make_field(Send_field *field)
d value for storing
NOTE
- Field_str is the base class for fields like Field_date, and some
+ Field_str is the base class for fields like Field_enum, Field_date and some
similar. Some dates use fraction and also string value should be
converted to floating point value according our rules, so we use double
to store value of decimal in string
@@ -629,8 +628,7 @@ my_decimal *Field_str::val_decimal(my_decimal *decimal_value)
{
DBUG_ASSERT(result_type() == INT_RESULT);
longlong nr= val_int();
- if (is_null())
- int2my_decimal(E_DEC_FATAL_ERROR, nr, 0, decimal_value);
+ int2my_decimal(E_DEC_FATAL_ERROR, nr, 0, decimal_value);
return decimal_value;
}
@@ -733,6 +731,7 @@ Field *Field::new_key_field(MEM_ROOT *root, struct st_table *new_table,
return tmp;
}
+
/*
SYNOPSIS
Field::quote_data()
@@ -749,44 +748,35 @@ Field *Field::new_key_field(MEM_ROOT *root, struct st_table *new_table,
void Upon prepending/appending quotes on each side of variable
*/
+
bool Field::quote_data(String *unquoted_string)
{
char escaped_string[IO_SIZE];
char *unquoted_string_buffer= (char *)(unquoted_string->ptr());
uint need_quotes;
-
DBUG_ENTER("Field::quote_data");
+
// this is the same call that mysql_real_escape_string() calls
escape_string_for_mysql(&my_charset_bin, (char *)escaped_string,
unquoted_string->ptr(), unquoted_string->length());
-
- if (is_null())
- DBUG_RETURN(0);
-
need_quotes= needs_quotes();
if (need_quotes == 0)
- {
DBUG_RETURN(0);
- }
- else
- {
- // reset string, then re-append with quotes and escaped values
- unquoted_string->length(0);
- if (unquoted_string->append("'"))
- DBUG_RETURN(1);
- if (unquoted_string->append((char *)escaped_string))
- DBUG_RETURN(1);
- if (unquoted_string->append("'"))
- DBUG_RETURN(1);
- }
- //DBUG_PRINT("Field::quote_data",
- // ("FINAL quote_flag %d unquoted_string %s escaped_string %s",
- //needs_quotes, unquoted_string->c_ptr_quick(), escaped_string));
+
+ // reset string, then re-append with quotes and escaped values
+ unquoted_string->length(0);
+ if (unquoted_string->append('\''))
+ DBUG_RETURN(1);
+ if (unquoted_string->append((char *)escaped_string))
+ DBUG_RETURN(1);
+ if (unquoted_string->append('\''))
+ DBUG_RETURN(1);
DBUG_RETURN(0);
}
+
/*
Quote a field type if needed
@@ -802,6 +792,7 @@ bool Field::quote_data(String *unquoted_string)
0 if value is of type NOT needing quotes
1 if value is of type needing quotes
*/
+
bool Field::needs_quotes(void)
{
DBUG_ENTER("Field::type_quote");
@@ -840,9 +831,9 @@ bool Field::needs_quotes(void)
default: DBUG_RETURN(0);
}
DBUG_RETURN(0);
-
}
+
/****************************************************************************
Field_null, a field that always return NULL
****************************************************************************/
@@ -2441,6 +2432,13 @@ void Field_medium::sql_type(String &res) const
** long int
****************************************************************************/
+static bool test_if_minus(CHARSET_INFO *cs,
+ const char *s, const char *e)
+{
+ my_wc_t wc;
+ return cs->cset->mb_wc(cs, &wc, (uchar*) s, (uchar*) e) > 0 && wc == '-';
+}
+
int Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
{
@@ -2454,7 +2452,7 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
from+= tmp;
end= (char*) from+len;
- tmp= my_strtoll10(from, &end, &error);
+ tmp= cs->cset->my_strtoll10(cs, from, &end, &error);
if (error != MY_ERRNO_EDOM)
{
@@ -2743,7 +2741,7 @@ int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
from+= tmp;
if (unsigned_flag)
{
- if (!len || *from == '-')
+ if (!len || test_if_minus(cs, from, from + len))
{
tmp=0; // Set negative to 0
error= 1;
@@ -4646,8 +4644,6 @@ String *Field_newdate::val_str(String *val_buffer,
bool Field_newdate::get_date(TIME *ltime,uint fuzzydate)
{
- if (is_null())
- return 1;
uint32 tmp=(uint32) uint3korr(ptr);
ltime->day= tmp & 31;
ltime->month= (tmp >> 5) & 15;
@@ -5058,17 +5054,16 @@ int Field_string::store(longlong nr)
return Field_string::store(buff,(uint)l,cs);
}
+
int Field_longstr::store_decimal(const my_decimal *d)
{
- uint buf_size= my_decimal_string_length(d);
- char *buff= (char *)my_alloca(buf_size);
- String str(buff, buf_size, &my_charset_bin);
+ char buff[DECIMAL_MAX_STR_LENGTH+1];
+ String str(buff, sizeof(buff), &my_charset_bin);
my_decimal2string(E_DEC_FATAL_ERROR, d, 0, 0, 0, &str);
- int result= store(str.ptr(), str.length(), str.charset());
- my_afree(buff);
- return result;
+ return store(str.ptr(), str.length(), str.charset());
}
+
double Field_string::val_real(void)
{
int not_used;
diff --git a/sql/field.h b/sql/field.h
index 327fb4c885b..cfed2eb19e1 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -367,7 +367,9 @@ public:
my_decimal *val_decimal(my_decimal *);
};
-/* base class for Item_string, Item_valstring, Item_blob */
+
+/* base class for Field_string, Field_varstring and Field_blob */
+
class Field_longstr :public Field_str
{
public:
@@ -1181,7 +1183,9 @@ public:
bool has_charset(void) const
{ return charset() == &my_charset_bin ? FALSE : TRUE; }
field_cast_enum field_cast_type() { return FIELD_CAST_BLOB; }
- uint32 max_length();};
+ uint32 max_length();
+};
+
#ifdef HAVE_SPATIAL
class Field_geom :public Field_blob {
diff --git a/sql/filesort.cc b/sql/filesort.cc
index 956ac2ef61b..de14287003b 100644
--- a/sql/filesort.cc
+++ b/sql/filesort.cc
@@ -619,20 +619,21 @@ static void make_sortkey(register SORTPARAM *param,
else
{ // Item
Item *item=sort_field->item;
+ maybe_null= item->maybe_null;
switch (sort_field->result_type) {
case STRING_RESULT:
{
CHARSET_INFO *cs=item->collation.collation;
char fill_char= ((cs->state & MY_CS_BINSORT) ? (char) 0 : ' ');
- if ((maybe_null=item->maybe_null))
+ if (maybe_null)
*to++=1;
/* All item->str() to use some extra byte for end null.. */
String tmp((char*) to,sort_field->length+4,cs);
String *res=item->val_str(&tmp);
if (!res)
{
- if (item->maybe_null)
+ if (maybe_null)
bzero((char*) to-1,sort_field->length+1);
else
{
@@ -672,20 +673,22 @@ static void make_sortkey(register SORTPARAM *param,
case INT_RESULT:
{
longlong value=item->val_int();
- if ((maybe_null=item->maybe_null))
+ if (maybe_null)
+ {
*to++=1; /* purecov: inspected */
- if (item->null_value)
- {
- if (item->maybe_null)
- bzero((char*) to-1,sort_field->length+1);
- else
- {
- DBUG_PRINT("warning",
- ("Got null on something that shouldn't be null"));
- bzero((char*) to,sort_field->length);
- }
- break;
- }
+ if (item->null_value)
+ {
+ if (maybe_null)
+ bzero((char*) to-1,sort_field->length+1);
+ else
+ {
+ DBUG_PRINT("warning",
+ ("Got null on something that shouldn't be null"));
+ bzero((char*) to,sort_field->length);
+ }
+ break;
+ }
+ }
#if SIZEOF_LONG_LONG > 4
to[7]= (uchar) value;
to[6]= (uchar) (value >> 8);
@@ -706,15 +709,17 @@ static void make_sortkey(register SORTPARAM *param,
case DECIMAL_RESULT:
{
my_decimal dec_buf, *dec_val= item->val_decimal(&dec_buf);
- if ((maybe_null=item->null_value))
- {
- bzero((char*)to, sort_field->length+1);
- to++;
- break;
- }
- if ((maybe_null=item->maybe_null))
+ if (maybe_null)
+ {
+ if (item->null_value)
+ {
+ bzero((char*)to, sort_field->length+1);
+ to++;
+ break;
+ }
*to++=1;
- my_decimal2binary(E_DEC_FATAL_ERROR, dec_val, (byte*)to,
+ }
+ my_decimal2binary(E_DEC_FATAL_ERROR, dec_val, (char*)to,
item->max_length - (item->decimals ? 1:0),
item->decimals);
break;
@@ -722,14 +727,16 @@ static void make_sortkey(register SORTPARAM *param,
case REAL_RESULT:
{
double value= item->val_real();
- if ((maybe_null=item->null_value))
- {
- bzero((char*) to,sort_field->length+1);
- to++;
- break;
- }
- if ((maybe_null=item->maybe_null))
+ if (maybe_null)
+ {
+ if (item->null_value)
+ {
+ bzero((char*) to,sort_field->length+1);
+ to++;
+ break;
+ }
*to++=1;
+ }
change_double_for_sort(value,(byte*) to);
break;
}
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index dafed2fd510..2199d958bb6 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -621,7 +621,7 @@ innobase_mysql_tmpfile(void)
{
char filename[FN_REFLEN];
int fd2 = -1;
- File fd = create_temp_file(filename, NullS, "ib",
+ File fd = create_temp_file(filename, mysql_tmpdir, "ib",
#ifdef __WIN__
O_BINARY | O_TRUNC | O_SEQUENTIAL |
O_TEMPORARY | O_SHORT_LIVED |
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 58f744438fc..f62a65cb109 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -446,7 +446,6 @@ bool ha_ndbcluster::get_error_message(int error,
static inline bool ndb_supported_type(enum_field_types type)
{
switch (type) {
- case MYSQL_TYPE_DECIMAL:
case MYSQL_TYPE_TINY:
case MYSQL_TYPE_SHORT:
case MYSQL_TYPE_LONG:
@@ -454,6 +453,8 @@ static inline bool ndb_supported_type(enum_field_types type)
case MYSQL_TYPE_LONGLONG:
case MYSQL_TYPE_FLOAT:
case MYSQL_TYPE_DOUBLE:
+ case MYSQL_TYPE_DECIMAL:
+ case MYSQL_TYPE_NEWDECIMAL:
case MYSQL_TYPE_TIMESTAMP:
case MYSQL_TYPE_DATETIME:
case MYSQL_TYPE_DATE:
@@ -3430,10 +3431,6 @@ static int create_ndb_column(NDBCOL &col,
const enum enum_field_types mysql_type= field->real_type();
switch (mysql_type) {
// Numeric types
- case MYSQL_TYPE_DECIMAL:
- col.setType(NDBCOL::Char);
- col.setLength(field->pack_length());
- break;
case MYSQL_TYPE_TINY:
if (field->flags & UNSIGNED_FLAG)
col.setType(NDBCOL::Tinyunsigned);
@@ -3477,6 +3474,44 @@ static int create_ndb_column(NDBCOL &col,
col.setType(NDBCOL::Double);
col.setLength(1);
break;
+ case MYSQL_TYPE_DECIMAL:
+ {
+ Field_decimal *f= (Field_decimal*)field;
+ uint precision= f->pack_length();
+ uint scale= f->decimals();
+ if (field->flags & UNSIGNED_FLAG)
+ {
+ col.setType(NDBCOL::Olddecimalunsigned);
+ precision-= (scale > 0);
+ }
+ else
+ {
+ col.setType(NDBCOL::Olddecimal);
+ precision-= 1 + (scale > 0);
+ }
+ col.setPrecision(precision);
+ col.setScale(scale);
+ col.setLength(1);
+ }
+ break;
+ case MYSQL_TYPE_NEWDECIMAL:
+ {
+ Field_new_decimal *f= (Field_new_decimal*)field;
+ uint precision= f->field_length;
+ uint scale= f->decimals();
+ if (field->flags & UNSIGNED_FLAG)
+ {
+ col.setType(NDBCOL::Decimalunsigned);
+ }
+ else
+ {
+ col.setType(NDBCOL::Decimal);
+ }
+ col.setPrecision(precision);
+ col.setScale(scale);
+ col.setLength(1);
+ }
+ break;
// Date types
case MYSQL_TYPE_DATETIME:
col.setType(NDBCOL::Datetime);
diff --git a/sql/item.cc b/sql/item.cc
index 53d9d532b3d..4eb4e017ef2 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -48,10 +48,10 @@ void item_init(void)
/*
TODO: make this functions class dependent
*/
+
bool Item::val_bool()
{
- switch(result_type())
- {
+ switch(result_type()) {
case INT_RESULT:
return val_int();
case DECIMAL_RESULT:
@@ -68,6 +68,7 @@ bool Item::val_bool()
case ROW_RESULT:
default:
DBUG_ASSERT(0);
+ return 0; // Wrong (but safe)
}
}
@@ -991,8 +992,7 @@ bool Item_field::val_bool_result()
{
if ((null_value= result_field->is_null()))
return FALSE;
- switch (result_field->result_type())
- {
+ switch (result_field->result_type()) {
case INT_RESULT:
return result_field->val_int();
case DECIMAL_RESULT:
@@ -1060,8 +1060,9 @@ Item *Item_field::get_tmp_table_item(THD *thd)
/*
- Create an item from a string we KNOW points to a valid longlong/ulonglong
- end \0 terminated number string
+ Create an item from a string we KNOW points to a valid longlong
+ end \0 terminated number string.
+ This is always 'signed'. Unsigned values are created with Item_uint()
*/
Item_int::Item_int(const char *str_arg, uint length)
@@ -1071,7 +1072,6 @@ Item_int::Item_int(const char *str_arg, uint length)
value= my_strtoll10(str_arg, &end_ptr, &error);
max_length= (uint) (end_ptr - str_arg);
name= (char*) str_arg;
- unsigned_flag= value > 0;
fixed= 1;
}
@@ -2436,8 +2436,8 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **reference)
rf is Item_ref => never substitute other items (in this case)
during fix_fields() => we can use rf after fix_fields()
*/
- if (!rf->fixed &&
- rf->fix_fields(thd, tables, reference) || rf->check_cols(1))
+ DBUG_ASSERT(!rf->fixed); // Assured by Item_ref()
+ if (rf->fix_fields(thd, tables, reference) || rf->check_cols(1))
return TRUE;
mark_as_dependent(thd, last, current_sel, rf);
@@ -2458,8 +2458,8 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **reference)
rf is Item_ref => never substitute other items (in this case)
during fix_fields() => we can use rf after fix_fields()
*/
- return (!rf->fixed &&
- rf->fix_fields(thd, tables, reference) || rf->check_cols(1));
+ DBUG_ASSERT(!rf->fixed); // Assured by Item_ref()
+ return (rf->fix_fields(thd, tables, reference) || rf->check_cols(1));
}
}
}
@@ -2706,8 +2706,7 @@ void Item_empty_string::make_field(Send_field *tmp_field)
enum_field_types Item::field_type() const
{
- switch (result_type())
- {
+ switch (result_type()) {
case STRING_RESULT: return MYSQL_TYPE_VARCHAR;
case INT_RESULT: return FIELD_TYPE_LONGLONG;
case DECIMAL_RESULT: return FIELD_TYPE_NEWDECIMAL;
@@ -2715,8 +2714,8 @@ enum_field_types Item::field_type() const
case ROW_RESULT:
default:
DBUG_ASSERT(0);
- return FIELD_TYPE_VAR_STRING;
- };
+ return MYSQL_TYPE_VARCHAR;
+ }
}
@@ -3662,18 +3661,17 @@ bool Item_ref::val_bool_result()
{
if ((null_value= result_field->is_null()))
return 0;
- switch (result_field->result_type())
- {
+ switch (result_field->result_type()) {
case INT_RESULT:
return result_field->val_int();
case DECIMAL_RESULT:
- {
- my_decimal decimal_value;
- my_decimal *val= result_field->val_decimal(&decimal_value);
- if (val)
- return !my_decimal_is_zero(val);
- return 0;
- }
+ {
+ my_decimal decimal_value;
+ my_decimal *val= result_field->val_decimal(&decimal_value);
+ if (val)
+ return !my_decimal_is_zero(val);
+ return 0;
+ }
case REAL_RESULT:
case STRING_RESULT:
return result_field->val_real() != 0.0;
@@ -4049,8 +4047,7 @@ void resolve_const_item(THD *thd, Item **ref, Item *comp_item)
item->result_type());
char *name=item->name; // Alloced by sql_alloc
- switch (res_type)
- {
+ switch (res_type) {
case STRING_RESULT:
{
char buff[MAX_FIELD_WIDTH];
@@ -4146,8 +4143,7 @@ bool field_is_equal_to_item(Field *field,Item *item)
Item_cache* Item_cache::get_cache(Item_result type)
{
- switch (type)
- {
+ switch (type) {
case INT_RESULT:
return new Item_cache_int();
case REAL_RESULT:
@@ -4617,8 +4613,7 @@ uint32 Item_type_holder::real_length(Item *item)
if (item->type() == Item::FIELD_ITEM)
return ((Item_field *)item)->max_disp_length();
- switch (item->result_type())
- {
+ switch (item->result_type()) {
case STRING_RESULT:
case DECIMAL_RESULT:
return item->max_length;
diff --git a/sql/item.h b/sql/item.h
index e2e72dbee40..7d9526b53a8 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -121,8 +121,7 @@ public:
static void *operator new(size_t size, MEM_ROOT *mem_root)
{ return (void*) alloc_root(mem_root, (uint) size); }
static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); }
- static void operator delete(void *ptr,size_t size, MEM_ROOT *mem_root)
- { TRASH(ptr, size); }
+ static void operator delete(void *ptr, MEM_ROOT *mem_root) {}
enum Type {FIELD_ITEM, FUNC_ITEM, SUM_FUNC_ITEM, STRING_ITEM,
INT_ITEM, REAL_ITEM, NULL_ITEM, VARBIN_ITEM,
@@ -461,7 +460,10 @@ public:
{
Item *it= this_item();
- it->set_name(m_name.str, m_name.length, system_charset_info);
+ if (name)
+ it->set_name(name, strlen(name), system_charset_info);
+ else
+ it->set_name(m_name.str, m_name.length, system_charset_info);
it->make_field(field);
}
diff --git a/sql/item_buff.cc b/sql/item_buff.cc
index 7c77f7fa3bc..af17d377e31 100644
--- a/sql/item_buff.cc
+++ b/sql/item_buff.cc
@@ -28,8 +28,7 @@ Item_buff *new_Item_buff(Item *item)
if (item->type() == Item::FIELD_ITEM &&
!(((Item_field *) item)->field->flags & BLOB_FLAG))
return new Item_field_buff((Item_field *) item);
- switch (item->result_type())
- {
+ switch (item->result_type()) {
case STRING_RESULT:
return new Item_str_buff((Item_field *) item);
case INT_RESULT:
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index c26365e3f0e..3884cce8451 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -273,8 +273,7 @@ int Arg_comparator::set_compare_func(Item_bool_func2 *item, Item_result type)
owner= item;
func= comparator_matrix[type]
[test(owner->functype() == Item_func::EQUAL_FUNC)];
- switch(type)
- {
+ switch(type) {
case ROW_RESULT:
{
uint n= (*a)->cols();
@@ -877,25 +876,43 @@ void Item_func_interval::fix_length_and_dec()
/*
- return -1 if null value,
- 0 if lower than lowest
- 1 - arg_count-1 if between args[n] and args[n+1]
- arg_count if higher than biggest argument
+ Execute Item_func_interval()
+
+ SYNOPSIS
+ Item_func_interval::val_int()
+
+ NOTES
+ If we are doing a decimal comparison, we are
+ evaluating the first item twice.
+
+ RETURN
+ -1 if null value,
+ 0 if lower than lowest
+ 1 - arg_count-1 if between args[n] and args[n+1]
+ arg_count if higher than biggest argument
*/
longlong Item_func_interval::val_int()
{
DBUG_ASSERT(fixed == 1);
- double value= row->el(0)->val_real();
+ double value;
my_decimal dec_buf, *dec= NULL;
+ uint i;
+
if (use_decimal_comparison)
{
dec= row->el(0)->val_decimal(&dec_buf);
+ if (row->el(0)->null_value)
+ return -1;
+ my_decimal2double(E_DEC_FATAL_ERROR, dec, &value);
+ }
+ else
+ {
+ value= row->el(0)->val_real();
+ if (row->el(0)->null_value)
+ return -1;
}
- uint i;
- if (row->el(0)->null_value)
- return -1; // -1 if null
if (intervals)
{ // Use binary search to find interval
uint start,end;
@@ -906,6 +923,11 @@ longlong Item_func_interval::val_int()
uint mid= (start + end + 1) / 2;
interval_range *range= intervals + mid;
my_bool cmp_result;
+ /*
+ The values in the range intervall may have different types,
+ Only do a decimal comparision of the first argument is a decimal
+ and we are comparing against a decimal
+ */
if (dec && range->type == DECIMAL_RESULT)
cmp_result= my_decimal_cmp(&range->dec, dec) <= 0;
else
@@ -917,7 +939,7 @@ longlong Item_func_interval::val_int()
}
interval_range *range= intervals+start;
return ((dec && range->type == DECIMAL_RESULT) ?
- my_decimal_cmp(dec, &range->dec) < 0 :
+ my_decimal_cmp(dec, &range->dec) < 0 :
value < range->dbl) ? 0 : start + 1;
}
@@ -932,13 +954,13 @@ longlong Item_func_interval::val_int()
if (my_decimal_cmp(e_dec, dec) > 0)
return i-1;
}
- else
- if (row->el(i)->val_real() > value)
- return i-1;
+ else if (row->el(i)->val_real() > value)
+ return i-1;
}
return i-1;
}
+
void Item_func_between::fix_length_and_dec()
{
max_length= 1;
@@ -1087,8 +1109,7 @@ Item_func_ifnull::fix_length_and_dec()
args[1]->max_length - args[1]->decimals) +
decimals);
agg_result_type(&cached_result_type, args, 2);
- switch (cached_result_type)
- {
+ switch (cached_result_type) {
case STRING_RESULT:
agg_arg_charsets(collation, args, arg_count, MY_COLL_CMP_CONV);
break;
@@ -1166,7 +1187,6 @@ my_decimal *Item_func_ifnull::val_decimal(my_decimal *decimal_value)
}
-
String *
Item_func_ifnull::val_str(String *str)
{
@@ -1456,7 +1476,6 @@ Item *Item_func_case::find_item(String *str)
}
-
String *Item_func_case::val_str(String *str)
{
DBUG_ASSERT(fixed == 1);
@@ -2037,7 +2056,8 @@ int cmp_item_row::compare(cmp_item *c)
void cmp_item_decimal::store_value(Item *item)
{
my_decimal *val= item->val_decimal(&value);
- if (val != &value)
+ /* val may be zero if item is nnull */
+ if (val && val != &value)
my_decimal2decimal(val, &value);
}
@@ -2051,9 +2071,9 @@ int cmp_item_decimal::cmp(Item *arg)
}
-int cmp_item_decimal::compare(cmp_item *c)
+int cmp_item_decimal::compare(cmp_item *arg)
{
- cmp_item_decimal *cmp= (cmp_item_decimal *)c;
+ cmp_item_decimal *cmp= (cmp_item_decimal*) arg;
return my_decimal_cmp(&value, &cmp->value);
}
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 02f33d39465..091de8e3a01 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -1665,7 +1665,8 @@ String *Item_func_format::val_str(String *str)
{
DBUG_ASSERT(fixed == 1);
double nr= args[0]->val_real();
- uint32 diff,length,str_length;
+ int diff;
+ uint32 length, str_length;
uint dec;
if ((null_value=args[0]->null_value))
return 0; /* purecov: inspected */
@@ -1690,9 +1691,12 @@ String *Item_func_format::val_str(String *str)
pos[0]= pos[-(int) diff];
while (diff)
{
- pos[0]=pos[-(int) diff]; pos--;
- pos[0]=pos[-(int) diff]; pos--;
- pos[0]=pos[-(int) diff]; pos--;
+ *pos= *(pos - diff);
+ pos--;
+ *pos= *(pos - diff);
+ pos--;
+ *pos= *(pos - diff);
+ pos--;
pos[0]=',';
pos--;
diff--;
diff --git a/sql/my_decimal.cc b/sql/my_decimal.cc
index 027b33f1d1c..36229d1c795 100644
--- a/sql/my_decimal.cc
+++ b/sql/my_decimal.cc
@@ -23,16 +23,18 @@
decimal_operation_results()
result decimal library return code (E_DEC_* see include/decimal.h)
- return
+ TODO
+ Fix error messages
+
+ RETURN
result
*/
+
int decimal_operation_results(int result)
{
- switch (result)
- {
+ switch (result) {
case E_DEC_OK:
break;
-//TODO: fix error messages
case E_DEC_TRUNCATED:
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
WARN_DATA_TRUNCATED, ER(WARN_DATA_TRUNCATED),
@@ -78,20 +80,18 @@ int decimal_operation_results(int result)
*/
int my_decimal2string(uint mask, const my_decimal *d,
- int fixed_prec, int fixed_dec,
- char filler, String *str)
+ int fixed_prec, int fixed_dec,
+ char filler, String *str)
{
int length= (fixed_prec ? (fixed_prec + 1) : my_decimal_string_length(d));
int result;
if (str->alloc(length))
- return check_result(mask, E_DEC_OOM);
- char *sptr= (char *)str->ptr();
- int res= decimal2string((decimal *)d, sptr,
- &length, fixed_prec, fixed_dec,
- filler);
- result= check_result(mask, res);
+ return check_result(mask, E_DEC_OOM);
+ result= decimal2string((decimal*) d, (char*) str->ptr(),
+ &length, fixed_prec, fixed_dec,
+ filler);
str->length(length);
- return result;
+ return check_result(mask, result);
}
@@ -116,7 +116,7 @@ int my_decimal2string(uint mask, const my_decimal *d,
E_DEC_OVERFLOW
*/
-int my_decimal2binary(uint mask, const my_decimal *d, byte *bin, int prec,
+int my_decimal2binary(uint mask, const my_decimal *d, char *bin, int prec,
int scale)
{
int err1= E_DEC_OK, err2;
@@ -171,7 +171,7 @@ int str2my_decimal(uint mask, const char *from, uint length,
}
my_decimal_set_zero(decimal_value);
err= string2decimal((char *)from, (decimal *)decimal_value, &end);
- if ((end-from) != length && !err)
+ if ((uint) (end-from) != length && !err)
err= E_DEC_TRUNCATED;
check_result(mask, err);
return err;
diff --git a/sql/my_decimal.h b/sql/my_decimal.h
index 63d3fb7e2e5..f4841418074 100644
--- a/sql/my_decimal.h
+++ b/sql/my_decimal.h
@@ -150,12 +150,12 @@ void my_decimal2decimal(const my_decimal *from, my_decimal *to)
}
-int my_decimal2binary(uint mask, const my_decimal *d, byte *bin, int prec,
+int my_decimal2binary(uint mask, const my_decimal *d, char *bin, int prec,
int scale);
inline
-int binary2my_decimal(uint mask, const byte *bin, my_decimal *d, int prec,
+int binary2my_decimal(uint mask, const char *bin, my_decimal *d, int prec,
int scale)
{
return check_result(mask, bin2decimal((char *)bin, (decimal *)d, prec,
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc
index e38e417e6df..b2f7922f1db 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -1438,7 +1438,7 @@ ulong Query_cache::init_cache()
init();
approx_additional_data_size = (sizeof(Query_cache) +
sizeof(gptr)*(def_query_hash_size+
- def_query_hash_size));
+ def_table_hash_size));
if (query_cache_size < approx_additional_data_size)
goto err;
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index c6f441e1825..fa6db61d2d8 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -747,6 +747,8 @@ struct Item_change_record: public ilink
Item *old_value;
/* Placement new was hidden by `new' in ilink (TODO: check): */
static void *operator new(size_t size, void *mem) { return mem; }
+ static void operator delete(void *ptr, size_t size) {}
+ static void operator delete(void *ptr, void *mem) { /* never called */ }
};
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 4ff9e7ecece..05fd1fdea58 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -1572,7 +1572,11 @@ public:
#include <myisam.h>
-/* Param to create temporary tables when doing SELECT:s */
+/*
+ Param to create temporary tables when doing SELECT:s
+ NOTE
+ This structure is copied using memcpy as a part of JOIN.
+*/
class TMP_TABLE_PARAM :public Sql_alloc
{
@@ -1584,7 +1588,6 @@ private:
public:
List<Item> copy_funcs;
List<Item> save_copy_funcs;
- List_iterator_fast<Item> copy_funcs_it;
Copy_field *copy_field, *copy_field_end;
Copy_field *save_copy_field, *save_copy_field_end;
byte *group_buff;
@@ -1602,7 +1605,7 @@ public:
CHARSET_INFO *table_charset;
TMP_TABLE_PARAM()
- :copy_funcs_it(copy_funcs), copy_field(0), group_parts(0),
+ :copy_field(0), group_parts(0),
group_length(0), group_null_parts(0), convert_blob_length(0)
{}
~TMP_TABLE_PARAM()
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 15822aa43d2..a1f0413127d 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -1733,6 +1733,12 @@ bool st_lex::can_not_use_merged()
{
case SQLCOM_CREATE_VIEW:
case SQLCOM_SHOW_CREATE:
+ /*
+ SQLCOM_SHOW_FIELDS is necessary to make
+ information schema tables working correctly with views.
+ see get_schema_tables_result function
+ */
+ case SQLCOM_SHOW_FIELDS:
return TRUE;
default:
return FALSE;
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index c7830a21fcf..12bacb82f0f 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -287,8 +287,7 @@ public:
static void *operator new(size_t size, MEM_ROOT *mem_root)
{ return (void*) alloc_root(mem_root, (uint) size); }
static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); }
- static void operator delete(void *ptr,size_t size, MEM_ROOT *mem_root)
- { TRASH(ptr, size); }
+ static void operator delete(void *ptr, MEM_ROOT *mem_root) {}
st_select_lex_node(): linkage(UNSPECIFIED_TYPE) {}
virtual ~st_select_lex_node() {}
inline st_select_lex_node* get_master() { return master; }
diff --git a/sql/sql_list.h b/sql/sql_list.h
index 85da553f64a..55d9d668bdd 100644
--- a/sql/sql_list.h
+++ b/sql/sql_list.h
@@ -35,8 +35,8 @@ public:
static void *operator new(size_t size, MEM_ROOT *mem_root)
{ return (void*) alloc_root(mem_root, (uint) size); }
static void operator delete(void *ptr, size_t size) { TRASH(ptr, size); }
- static void operator delete(void *ptr, size_t size, MEM_ROOT *mem_root)
- { TRASH(ptr, size); }
+ static void operator delete(void *ptr, MEM_ROOT *mem_root)
+ { /* never called */ }
static void operator delete[](void *ptr, size_t size) { TRASH(ptr, size); }
#ifdef HAVE_purify
bool dummy;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 345a938a7ba..8876fecf2a0 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -718,12 +718,12 @@ static int check_connection(THD *thd)
{
uint connect_errors= 0;
NET *net= &thd->net;
+ ulong pkt_len= 0;
+ char *end;
DBUG_PRINT("info",
("New connection received on %s", vio_description(net->vio)));
- vio_in_addr(net->vio,&thd->remote.sin_addr);
-
if (!thd->host) // If TCP/IP connection
{
char ip[30];
@@ -733,6 +733,7 @@ static int check_connection(THD *thd)
if (!(thd->ip= my_strdup(ip,MYF(0))))
return (ER_OUT_OF_RESOURCES);
thd->host_or_ip= thd->ip;
+ vio_in_addr(net->vio,&thd->remote.sin_addr);
#if !defined(HAVE_SYS_UN_H) || defined(HAVE_mit_thread)
/* Fast local hostname resolve for Win32 */
if (!strcmp(thd->ip,"127.0.0.1"))
@@ -768,10 +769,10 @@ static int check_connection(THD *thd)
DBUG_PRINT("info",("Host: %s",thd->host));
thd->host_or_ip= thd->host;
thd->ip= 0;
+ /* Reset sin_addr */
+ bzero((char*) &thd->remote, sizeof(thd->remote));
}
vio_keepalive(net->vio, TRUE);
- ulong pkt_len= 0;
- char *end;
{
/* buff[] needs to big enough to hold the server_version variable */
char buff[SERVER_VERSION_LENGTH + SCRAMBLE_LENGTH + 64];
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index f49f980f364..dead6a6e08e 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -11943,8 +11943,7 @@ copy_fields(TMP_TABLE_PARAM *param)
for (; ptr != end; ptr++)
(*ptr->do_copy)(ptr);
- List_iterator_fast<Item> &it=param->copy_funcs_it;
- it.rewind();
+ List_iterator_fast<Item> it(param->copy_funcs);
Item_copy_string *item;
while ((item = (Item_copy_string*) it++))
item->copy();
diff --git a/sql/sql_string.h b/sql/sql_string.h
index a5c7cf77630..2debeb61787 100644
--- a/sql/sql_string.h
+++ b/sql/sql_string.h
@@ -73,8 +73,8 @@ public:
{ return (void*) alloc_root(mem_root, (uint) size); }
static void operator delete(void *ptr_arg,size_t size)
{ TRASH(ptr_arg, size); }
- static void operator delete(void *ptr_arg,size_t size, MEM_ROOT *mem_root)
- { TRASH(ptr_arg, size); }
+ static void operator delete(void *ptr_arg, MEM_ROOT *mem_root)
+ { /* never called */ }
~String() { free(); }
inline void set_charset(CHARSET_INFO *charset) { str_charset= charset; }
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index b5df3595f41..b7a088ff37c 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -264,10 +264,8 @@ int mysql_update(THD *thd,
else if ((used_index=table->file->key_used_on_scan) < MAX_KEY)
used_key_is_modified=check_if_key_used(table, used_index, fields);
else
- {
used_key_is_modified=0;
- used_index= MAX_KEY;
- }
+
if (used_key_is_modified || order)
{
/*
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 92658192ac2..765f1ae0e73 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -3806,7 +3806,10 @@ select:
select_init:
SELECT_SYM select_init2
|
- '(' SELECT_SYM select_part2 ')'
+ '(' select_paren ')' union_opt;
+
+select_paren:
+ SELECT_SYM select_part2
{
LEX *lex= Lex;
SELECT_LEX * sel= lex->current_select;
@@ -3825,7 +3828,8 @@ select_init:
if (sel->master_unit()->fake_select_lex)
sel->master_unit()->global_parameters=
sel->master_unit()->fake_select_lex;
- } union_opt;
+ }
+ | '(' select_paren ')';
select_init2:
select_part2
@@ -4985,7 +4989,7 @@ table_factor:
}
| '{' ident table_ref LEFT OUTER JOIN_SYM table_ref ON expr '}'
{ add_join_on($7,$9); $7->outer_join|=JOIN_TYPE_LEFT; $$=$7; }
- | '(' SELECT_SYM select_derived ')' opt_table_alias
+ | '(' select_derived union_opt ')' opt_table_alias
{
LEX *lex=Lex;
SELECT_LEX_UNIT *unit= lex->current_select->master_unit();
@@ -4999,7 +5003,25 @@ table_factor:
lex->current_select->add_joined_table($$);
};
+
select_derived:
+ SELECT_SYM select_derived2
+ | '(' select_derived ')'
+ {
+ SELECT_LEX *sel= Select;
+ if (sel->set_braces(1))
+ {
+ yyerror(ER(ER_SYNTAX_ERROR));
+ YYABORT;
+ }
+ /* select in braces, can't contain global parameters */
+ if (sel->master_unit()->fake_select_lex)
+ sel->master_unit()->global_parameters=
+ sel->master_unit()->fake_select_lex;
+ }
+ ;
+
+select_derived2:
{
LEX *lex= Lex;
lex->derived_tables|= DERIVED_SUBQUERY;
@@ -5021,7 +5043,7 @@ select_derived:
{
Select->parsing_place= NO_MATTER;
}
- opt_select_from union_opt
+ opt_select_from
;
opt_outer:
diff --git a/sql/table.cc b/sql/table.cc
index a78d245ba9d..69a132329c0 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -661,7 +661,6 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat,
if (!(field->flags & BINARY_FLAG))
keyinfo->flags|= HA_END_SPACE_KEY;
}
- set_if_bigger(share->max_key_length, keyinfo->key_length);
if (field->type() == MYSQL_TYPE_BIT)
key_part->key_part_flag|= HA_BIT_PART;
diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c
index 35f49a34c80..a3f96a947a7 100644
--- a/strings/ctype-ucs2.c
+++ b/strings/ctype-ucs2.c
@@ -1493,6 +1493,29 @@ my_bool my_like_range_ucs2(CHARSET_INFO *cs,
}
+
+ulong my_scan_ucs2(CHARSET_INFO *cs __attribute__((unused)),
+ const char *str, const char *end, int sequence_type)
+{
+ const char *str0= str;
+ end--; /* for easier loop condition, because of two bytes per character */
+
+ switch (sequence_type)
+ {
+ case MY_SEQ_SPACES:
+ for ( ; str < end; str+= 2)
+ {
+ if (str[0] != '\0' || str[1] != ' ')
+ break;
+ }
+ return str - str0;
+ default:
+ return 0;
+ }
+}
+
+
+
static MY_COLLATION_HANDLER my_collation_ucs2_general_ci_handler =
{
NULL, /* init */
@@ -1549,7 +1572,7 @@ MY_CHARSET_HANDLER my_charset_ucs2_handler=
my_strntoull_ucs2,
my_strntod_ucs2,
my_strtoll10_ucs2,
- my_scan_8bit
+ my_scan_ucs2
};
diff --git a/vio/viosocket.c b/vio/viosocket.c
index 3064a01f0f8..43bd4e82013 100644
--- a/vio/viosocket.c
+++ b/vio/viosocket.c
@@ -272,6 +272,18 @@ my_bool vio_peer_addr(Vio * vio, char *buf, uint16 *port)
}
+/*
+ Get in_addr for a TCP/IP connection
+
+ SYNOPSIS
+ vio_in_addr()
+ vio vio handle
+ in put in_addr here
+
+ NOTES
+ one must call vio_peer_addr() before calling this one
+*/
+
void vio_in_addr(Vio *vio, struct in_addr *in)
{
DBUG_ENTER("vio_in_addr");