summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2017-12-18 11:25:38 +0400
committerAlexander Barkov <bar@mariadb.org>2017-12-18 11:25:38 +0400
commitc1e5fef05d87038fff8b55ba763d082a5bec5d78 (patch)
treed83530632287de5bd655b67a96621d99d1a1a826
parent9d76b2749835a4fdbd009433c5a762da2769c4dd (diff)
downloadmariadb-git-c1e5fef05d87038fff8b55ba763d082a5bec5d78.tar.gz
MDEV-14008 Assertion failing: `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())
-rw-r--r--mysql-test/suite/innodb/r/innodb-autoinc.result12
-rw-r--r--mysql-test/suite/innodb/t/innodb-autoinc.test12
-rw-r--r--sql/field.cc4
-rw-r--r--sql/field.h8
-rw-r--r--storage/innobase/handler/ha_innodb.cc4
-rw-r--r--storage/xtradb/handler/ha_innodb.cc4
6 files changed, 37 insertions, 7 deletions
diff --git a/mysql-test/suite/innodb/r/innodb-autoinc.result b/mysql-test/suite/innodb/r/innodb-autoinc.result
index 879f9dfa238..9aa819de22b 100644
--- a/mysql-test/suite/innodb/r/innodb-autoinc.result
+++ b/mysql-test/suite/innodb/r/innodb-autoinc.result
@@ -1348,3 +1348,15 @@ t CREATE TABLE `t` (
KEY `i` (`i`)
) ENGINE=InnoDB AUTO_INCREMENT=401 DEFAULT CHARSET=latin1
DROP TABLE t;
+#
+# MDEV-14008 Assertion failing: `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())
+#
+SET sql_mode=STRICT_ALL_TABLES;
+CREATE TABLE t1 (
+c1 DOUBLE NOT NULL PRIMARY KEY AUTO_INCREMENT
+) ENGINE=InnoDB AUTO_INCREMENT=10000000000000000000;
+INSERT INTO t1 VALUES ();
+SELECT * FROM t1;
+c1
+1e19
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb/t/innodb-autoinc.test b/mysql-test/suite/innodb/t/innodb-autoinc.test
index 362be2e055b..ebb6a5d24ff 100644
--- a/mysql-test/suite/innodb/t/innodb-autoinc.test
+++ b/mysql-test/suite/innodb/t/innodb-autoinc.test
@@ -680,3 +680,15 @@ INSERT INTO t VALUES (NULL);
SELECT * FROM t;
SHOW CREATE TABLE t;
DROP TABLE t;
+
+--echo #
+--echo # MDEV-14008 Assertion failing: `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())
+--echo #
+
+SET sql_mode=STRICT_ALL_TABLES;
+CREATE TABLE t1 (
+ c1 DOUBLE NOT NULL PRIMARY KEY AUTO_INCREMENT
+) ENGINE=InnoDB AUTO_INCREMENT=10000000000000000000;
+INSERT INTO t1 VALUES ();
+SELECT * FROM t1;
+DROP TABLE t1;
diff --git a/sql/field.cc b/sql/field.cc
index 7074cc2cbc4..a3c20ec18f2 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -4390,7 +4390,7 @@ double Field_double::val_real(void)
return j;
}
-longlong Field_double::val_int(void)
+longlong Field_double::val_int_from_real(bool want_unsigned_result)
{
ASSERT_COLUMN_MARKED_FOR_READ;
double j;
@@ -4398,7 +4398,7 @@ longlong Field_double::val_int(void)
bool error;
float8get(j,ptr);
- res= double_to_longlong(j, 0, &error);
+ res= double_to_longlong(j, want_unsigned_result, &error);
if (error)
{
ErrConvDouble err(j);
diff --git a/sql/field.h b/sql/field.h
index e7bd5532ae6..c99327bd068 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -420,6 +420,10 @@ public:
enum_check_fields check_level);
virtual double val_real(void)=0;
virtual longlong val_int(void)=0;
+ virtual ulonglong val_uint(void)
+ {
+ return (ulonglong) val_int();
+ }
virtual my_decimal *val_decimal(my_decimal *);
inline String *val_str(String *str) { return val_str(str, str); }
/*
@@ -1554,6 +1558,7 @@ private:
class Field_double :public Field_real {
+ longlong val_int_from_real(bool want_unsigned_result);
public:
Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
uchar null_bit_arg,
@@ -1580,7 +1585,8 @@ public:
int store(longlong nr, bool unsigned_val);
int reset(void) { bzero(ptr,sizeof(double)); return 0; }
double val_real(void);
- longlong val_int(void);
+ longlong val_int(void) { return val_int_from_real(false); }
+ ulonglong val_uint(void) { return (ulonglong) val_int_from_real(true); }
String *val_str(String*,String *);
bool send_binary(Protocol *protocol);
int cmp(const uchar *,const uchar *);
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 4aab1b8d713..59a8aedd266 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -7274,7 +7274,7 @@ no_commit:
table->next_number_field);
/* Get the value that MySQL attempted to store in the table.*/
- auto_inc = table->next_number_field->val_int();
+ auto_inc = table->next_number_field->val_uint();
switch (error) {
case DB_DUPLICATE_KEY:
@@ -7735,7 +7735,7 @@ ha_innobase::update_row(
ulonglong auto_inc;
ulonglong col_max_value;
- auto_inc = table->next_number_field->val_int();
+ auto_inc = table->next_number_field->val_uint();
/* We need the upper limit of the col type to check for
whether we update the table autoinc counter or not. */
diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc
index f111a576d8f..88b59db9a46 100644
--- a/storage/xtradb/handler/ha_innodb.cc
+++ b/storage/xtradb/handler/ha_innodb.cc
@@ -7988,7 +7988,7 @@ no_commit:
table->next_number_field);
/* Get the value that MySQL attempted to store in the table.*/
- auto_inc = table->next_number_field->val_int();
+ auto_inc = table->next_number_field->val_uint();
switch (error) {
case DB_DUPLICATE_KEY:
@@ -8468,7 +8468,7 @@ ha_innobase::update_row(
ulonglong auto_inc;
ulonglong col_max_value;
- auto_inc = table->next_number_field->val_int();
+ auto_inc = table->next_number_field->val_uint();
/* We need the upper limit of the col type to check for
whether we update the table autoinc counter or not. */