summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRucha Deodhar <rucha.deodhar@mariadb.com>2021-07-31 12:55:21 +0530
committerSergei Golubchik <serg@mariadb.org>2021-09-15 08:39:04 +0200
commit1be5520a3be38fd17850e4e908bc3225a145906b (patch)
treebd9bb41ceddd4383b8265bcccb8d1c380aa5fbaf
parent8d08971c84036b2c4e508035ad93ad11021abdee (diff)
downloadmariadb-git-preview-10.7-MDEV-10075-insert-error-index.tar.gz
MDEV-10075: Provide index of error causing error in array INSERTpreview-10.7-MDEV-10075-insert-error-index
Extended the parser for GET DIAGNOSTICS to use ERROR_INDEX to get warning/error index. Error information is stored in Sql_condition. So it can be used to store the index of warning/error too. THD::current_insert_index keeps a track of count for each row that is processed or going to be inserted in the table (or first row in case of prepare phase). When an error occurs, first we need to fetch corrected error index (using correct_error_index()) for an error number. This is needed because in prepare phase, the error may not be because of rows/values. In such case, correct value of error_index should be 0. Once correct value if fetched, assign it to Sql_condition::error_index when the object is created during error/warning. This error_index variable is returned when ERROR_INDEX is used in GET DIAGNOSTICS.
-rw-r--r--mysql-test/main/get_diagnostics.result763
-rw-r--r--mysql-test/main/get_diagnostics.test579
-rw-r--r--sql/lex.h1
-rw-r--r--sql/sp_rcontext.cc2
-rw-r--r--sql/sql_class.cc6
-rw-r--r--sql/sql_class.h23
-rw-r--r--sql/sql_error.cc3
-rw-r--r--sql/sql_error.h11
-rw-r--r--sql/sql_get_diagnostics.cc2
-rw-r--r--sql/sql_get_diagnostics.h3
-rw-r--r--sql/sql_insert.cc9
-rw-r--r--sql/sql_parse.cc1
-rw-r--r--sql/sql_prepare.cc4
-rw-r--r--sql/sql_signal.cc2
-rw-r--r--sql/sql_yacc.yy10
-rw-r--r--tests/mysql_client_test.c90
16 files changed, 1501 insertions, 8 deletions
diff --git a/mysql-test/main/get_diagnostics.result b/mysql-test/main/get_diagnostics.result
index fbd25dc603c..3c63055f541 100644
--- a/mysql-test/main/get_diagnostics.result
+++ b/mysql-test/main/get_diagnostics.result
@@ -789,3 +789,766 @@ GET DIAGNOSTICS @var1 = NUMBER;
SHOW STATUS LIKE 'Com%get_diagnostics';
Variable_name Value
Com_get_diagnostics 1
+#
+# MDEV-10075: Provide index of error causing error in array INSERT
+#
+#
+# INSERT STATEMENT
+#
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+# Simple INSERT statement
+INSERT INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+INSERT INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var1= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var2= ERROR_INDEX;
+Warnings:
+Error 1062 Duplicate entry '1' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var1, @var2;
+@var1 @var2
+2
+INSERT INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var3= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var4= ERROR_INDEX;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var3, @var4;
+@var3 @var4
+2 NULL
+INSERT INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+ERROR 21S01: Column count doesn't match value count at row 3
+GET DIAGNOSTICS CONDITION 1 @var5= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var6= ERROR_INDEX;
+Warnings:
+Error 1136 Column count doesn't match value count at row 3
+Error 1758 Invalid condition number
+SELECT @var5, @var6;
+@var5 @var6
+3 NULL
+INSERT INTO t1 VALUES (9,CAST(123 AS CHAR(1)),1.00109);
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var7= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var8= ERROR_INDEX;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var7, @var8;
+@var7 @var8
+1 NULL
+INSERT INTO t1 VALUES ('x','foo',1.0203);
+ERROR 22007: Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+GET DIAGNOSTICS CONDITION 1 @var9= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var10= ERROR_INDEX;
+Warnings:
+Error 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+Error 1758 Invalid condition number
+SELECT @var9, @var10;
+@var9 @var10
+1 NULL
+INSERT INTO t1 VALUES ((13,'m',1.0113));
+ERROR 21000: Operand should contain 1 column(s)
+GET DIAGNOSTICS CONDITION 1 @var11= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var12= ERROR_INDEX;
+Warnings:
+Error 1241 Operand should contain 1 column(s)
+Error 1758 Invalid condition number
+SELECT @var11, @var12;
+@var11 @var12
+1 NULL
+INSERT INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (16/0,'p',1.0116);
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+GET DIAGNOSTICS CONDITION 1 @var13= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var14= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var15= ERROR_INDEX;
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+Error 1758 Invalid condition number
+SELECT @var13, @var14, @var15;
+@var13 @var14 @var15
+3 3 NULL
+TRUNCATE TABLE t1;
+# INSERT ... IGNORE
+INSERT IGNORE INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+INSERT IGNORE INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+Warnings:
+Warning 1062 Duplicate entry '1' for key 'PRIMARY'
+Warning 1062 Duplicate entry '2' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var16= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var17= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var18= ERROR_INDEX;
+Warnings:
+Warning 1062 Duplicate entry '1' for key 'PRIMARY'
+Warning 1062 Duplicate entry '2' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var16, @var17, @var18;
+@var16 @var17 @var18
+2 3 NULL
+INSERT IGNORE INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var19= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var20= ERROR_INDEX;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var19, @var20;
+@var19 @var20
+2 NULL
+INSERT IGNORE INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+ERROR 21S01: Column count doesn't match value count at row 3
+GET DIAGNOSTICS CONDITION 1 @var21= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var22= ERROR_INDEX;
+Warnings:
+Error 1136 Column count doesn't match value count at row 3
+Error 1758 Invalid condition number
+SELECT @var21, @var22;
+@var21 @var22
+3 NULL
+INSERT IGNORE INTO t1 VALUES (9,CAST(123 AS CHAR(1)),1.00109);
+Warnings:
+Warning 1292 Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var23= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var24= ERROR_INDEX;
+Warnings:
+Warning 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var23, @var24;
+@var23 @var24
+1 NULL
+INSERT IGNORE INTO t1 VALUES ('x','foo',1.0203);
+Warnings:
+Warning 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+GET DIAGNOSTICS CONDITION 1 @var25= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var26= ERROR_INDEX;
+Warnings:
+Warning 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+Error 1758 Invalid condition number
+SELECT @var25, @var26;
+@var25 @var26
+1 NULL
+INSERT IGNORE INTO t1 VALUES ((13,'m',1.0113));
+ERROR 21000: Operand should contain 1 column(s)
+GET DIAGNOSTICS CONDITION 1 @var27= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var28= ERROR_INDEX;
+Warnings:
+Error 1241 Operand should contain 1 column(s)
+Error 1758 Invalid condition number
+SELECT @var27, @var28;
+@var27 @var28
+1 NULL
+INSERT IGNORE INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115),
+(16/0,'p',1.0116);
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+Warning 1062 Duplicate entry '0' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var29= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var30= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var31= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 4 @var32= ERROR_INDEX;
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+Warning 1062 Duplicate entry '0' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var29, @var30, @var31, @var32;
+@var29 @var30 @var31 @var32
+3 3 3 NULL
+TRUNCATE TABLE t1;
+# INSERT ... SET
+INSERT INTO t1 SET id1=1, val1='a', d1=1.00101;
+INSERT INTO t1 SET id1=2, val1='b', d1=1.00102;
+INSERT INTO t1 SET id1=3, val1='c', d1=1.00103;
+INSERT INTO t1 SET id1=1, val1='a', d1=1.00101;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var33= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var34= ERROR_INDEX;
+Warnings:
+Error 1062 Duplicate entry '1' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var33, @var34;
+@var33 @var34
+1 NULL
+INSERT INTO t1 SET id1=6, val1='f', d1=1.79769313486232e+308);
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var35= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var36= ERROR_INDEX;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var35, @var36;
+@var35 @var36
+1 NULL
+INSERT INTO t1 SET id1=9, val1=CAST(123 AS CHAR(1)), d1=1.00109;
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var37= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var38= ERROR_INDEX;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var37, @var38;
+@var37 @var38
+1 NULL
+INSERT INTO t1 SET id1='x', val1='foo', d1=1.0203;
+ERROR 22007: Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+GET DIAGNOSTICS CONDITION 1 @var39= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var40= ERROR_INDEX;
+Warnings:
+Error 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+Error 1758 Invalid condition number
+SELECT @var39, @var40;
+@var39 @var40
+1 NULL
+INSERT INTO t1 SET id1=3/0, val1='p', d1=1.0116;
+ERROR 22012: Division by 0
+GET DIAGNOSTICS CONDITION 1 @var41= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var42= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var43= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 4 @var44= ERROR_INDEX;
+Warnings:
+Error 1365 Division by 0
+Error 1048 Column 'id1' cannot be null
+Error 1105 Unknown error
+Error 1758 Invalid condition number
+SELECT @var41, @var42, @var43, @var44;
+@var41 @var42 @var43 @var44
+1 1 1 NULL
+TRUNCATE TABLE t1;
+# INSERT ... ON DUPLICATE KEY UPDATE
+INSERT INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+INSERT INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101)
+ON DUPLICATE KEY UPDATE val1='a', d1=1.00101;
+GET DIAGNOSTICS CONDITION 1 @var45= ERROR_INDEX;
+Warnings:
+Error 1758 Invalid condition number
+GET DIAGNOSTICS CONDITION 2 @var46= ERROR_INDEX;
+Warnings:
+Error 1758 Invalid condition number
+Error 1758 Invalid condition number
+SELECT @var45, @var46;
+@var45 @var46
+NULL NULL
+INSERT INTO t1 VALUES (5,'e',1.00105),(3,'f',1.79769313486232e+308)
+ON DUPLICATE KEY UPDATE val1='c';
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var47= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var48= ERROR_INDEX;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var47, @var48;
+@var47 @var48
+2 NULL
+INSERT INTO t1 VALUES (5,'e',1.00105), (3,'i')
+ON DUPLICATE KEY UPDATE val1='c';
+ERROR 21S01: Column count doesn't match value count at row 2
+GET DIAGNOSTICS CONDITION 1 @var49= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var50= ERROR_INDEX;
+Warnings:
+Error 1136 Column count doesn't match value count at row 2
+Error 1758 Invalid condition number
+SELECT @var49, @var50;
+@var49 @var50
+2 NULL
+INSERT INTO t1 VALUES (3, CAST(123 AS CHAR(1)), 1.00103)
+ON DUPLICATE KEY UPDATE val1='c';
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var51= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var52= ERROR_INDEX;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var51, @var52;
+@var51 @var52
+1 NULL
+INSERT INTO t1 VALUES ('x','foo',1.0203)
+ON DUPLICATE KEY UPDATE val1='c';
+ERROR 22007: Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+GET DIAGNOSTICS CONDITION 1 @var53= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var54= ERROR_INDEX;
+Warnings:
+Error 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+Error 1758 Invalid condition number
+SELECT @var53, @var54;
+@var53 @var54
+1 NULL
+INSERT INTO t1 VALUES ((13,'m',1.0113)) ON DUPLICATE KEY UPDATE val1='c';
+ERROR 21000: Operand should contain 1 column(s)
+GET DIAGNOSTICS CONDITION 1 @var55= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var56= ERROR_INDEX;
+Warnings:
+Error 1241 Operand should contain 1 column(s)
+Error 1758 Invalid condition number
+SELECT @var55, @var56;
+@var55 @var56
+1 NULL
+INSERT INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (2/0,'p',1.00102)
+ON DUPLICATE KEY UPDATE val1='b';
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+GET DIAGNOSTICS CONDITION 1 @var57= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var58= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var59= ERROR_INDEX;
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+Error 1758 Invalid condition number
+SELECT @var57, @var58, @var59;
+@var57 @var58 @var59
+3 3 NULL
+INSERT INTO t1 VALUES (1,'e',1.0),(5,'e',1.0),(5,'f',1.7)
+ON DUPLICATE KEY UPDATE id1='1';
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var60= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var61= ERROR_INDEX;
+Warnings:
+Error 1062 Duplicate entry '1' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var60, @var61;
+@var60 @var61
+3 NULL
+TRUNCATE TABLE t1;
+DROP TABLE t1;
+DROP TABLE t2;
+INSERT ... SELECT
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+INSERT INTO t2 VALUES(1,'a',1.00101,PointFromText('POINT(20 10)')),
+(2,'b',1.00102,PointFromText('POINT(20 10)')),
+(3,'c',1.00103,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2;
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2 WHERE id2=1;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var62= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var63= ERROR_INDEX;
+Warnings:
+Error 1062 Duplicate entry '1' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var62, @var63;
+@var62 @var63
+1 NULL
+INSERT INTO t1 SELECT id2, val2, p2 from t2;
+ERROR 22007: Incorrect double value: '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x004@\x00\x00\x00\x00\x00\x00$@' for column `test`.`t1`.`d1` at row 1
+GET DIAGNOSTICS CONDITION 1 @var64= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var65= ERROR_INDEX;
+Warnings:
+Error 1366 Incorrect double value: '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x004@\x00\x00\x00\x00\x00\x00$@' for column `test`.`t1`.`d1` at row 1
+Error 1758 Invalid condition number
+SELECT @var64, @var65;
+@var64 @var65
+1 NULL
+INSERT INTO t1 SELECT id2, val2 FROM t2;
+ERROR 21S01: Column count doesn't match value count at row 1
+GET DIAGNOSTICS CONDITION 1 @var66= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var67= ERROR_INDEX;
+Warnings:
+Error 1136 Column count doesn't match value count at row 1
+Error 1758 Invalid condition number
+SELECT @var66, @var67;
+@var66 @var67
+1 NULL
+INSERT INTO t2 VALUES(4,'a',1.00101,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, CAST(123 AS CHAR(1)), d2 FROM t2 WHERE id2=4;
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var68= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var69= ERROR_INDEX;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var68, @var69;
+@var68 @var69
+1 NULL
+INSERT INTO t1 SELECT id2, val2, 1.79769313486232e+308 FROM t2;
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var70= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var71= ERROR_INDEX;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var70, @var71;
+@var70 @var71
+1 NULL
+INSERT INTO t1 SELECT id2/0, val2, d2 FROM t2;
+ERROR 22012: Division by 0
+GET DIAGNOSTICS CONDITION 1 @var72= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var73= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var74= ERROR_INDEX;
+Warnings:
+Error 1365 Division by 0
+Error 1048 Column 'id1' cannot be null
+Error 1758 Invalid condition number
+SELECT @var72, @var73, @var74;
+@var72 @var73 @var74
+1 1 NULL
+DROP TABLE t1,t2;
+# Checking ERROR_INDEX in STORED PROCEDURE for INSERT
+CREATE TABLE t1(id1 INT PRIMARY KEY);
+CREATE PROCEDURE proc1 ()
+BEGIN
+DECLARE var75 INT;
+DECLARE var76 INT;
+INSERT INTO t1 VALUES (1),(2);
+INSERT IGNORE INTO t1 VALUES(2);
+GET DIAGNOSTICS CONDITION 1 var75= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 var76= ERROR_INDEX;
+SELECT var75, var76;
+END;
+|
+CALL proc1();
+var75 var76
+1 NULL
+Warnings:
+Warning 1062 Duplicate entry '2' for key 'PRIMARY'
+Error 1758 Invalid condition number
+TRUNCATE TABLE t1;
+# Checking ERROR_INDEX in PREPARED STATEMENTS for INSERT
+INSERT INTO t1 VALUES (1), (2), (3);
+INSERT IGNORE INTO t1 VALUES(2),(3),(4);
+Warnings:
+Warning 1062 Duplicate entry '2' for key 'PRIMARY'
+Warning 1062 Duplicate entry '3' for key 'PRIMARY'
+PREPARE stmt1 FROM "GET DIAGNOSTICS CONDITION 2 @var77= ERROR_INDEX";
+EXECUTE stmt1;
+SELECT @var77;
+@var77
+2
+DROP PROCEDURE proc1;
+DROP PREPARE stmt1;
+DROP TABLE t1;
+#
+# REPLACE STATEMENT
+#
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE);
+# Simple REPLACE statement
+REPLACE INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+REPLACE INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+GET DIAGNOSTICS CONDITION 1 @var78= ERROR_INDEX;
+Warnings:
+Error 1758 Invalid condition number
+SELECT @var78;
+@var78
+NULL
+REPLACE INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var79= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var80= ERROR_INDEX;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var79, @var80;
+@var79 @var80
+2 NULL
+REPLACE INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+ERROR 21S01: Column count doesn't match value count at row 3
+GET DIAGNOSTICS CONDITION 1 @var81= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var82= ERROR_INDEX;
+Warnings:
+Error 1136 Column count doesn't match value count at row 3
+Error 1758 Invalid condition number
+SELECT @var81, @var82;
+@var81 @var82
+3 NULL
+REPLACE INTO t1 VALUES (9,CAST(123 AS CHAR(1)),1.00109);
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var83= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var84= ERROR_INDEX;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var83, @var84;
+@var83 @var84
+1 NULL
+REPLACE INTO t1 VALUES ('x','foo',1.0203);
+ERROR 22007: Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+GET DIAGNOSTICS CONDITION 1 @var85= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var86= ERROR_INDEX;
+Warnings:
+Error 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+Error 1758 Invalid condition number
+SELECT @var85, @var86;
+@var85 @var86
+1 NULL
+REPLACE INTO t1 VALUES ((13,'m',1.0113));
+ERROR 21000: Operand should contain 1 column(s)
+GET DIAGNOSTICS CONDITION 1 @var87= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var88= ERROR_INDEX;
+Warnings:
+Error 1241 Operand should contain 1 column(s)
+Error 1758 Invalid condition number
+SELECT @var87, @var88;
+@var87 @var88
+1 NULL
+REPLACE INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (16/0,'p',1.0116);
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+GET DIAGNOSTICS CONDITION 1 @var89= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var90= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var91= ERROR_INDEX;
+Warnings:
+Warning 1365 Division by 0
+Warning 1048 Column 'id1' cannot be null
+Error 1758 Invalid condition number
+SELECT @var89, @var90, @var91;
+@var89 @var90 @var91
+3 3 NULL
+TRUNCATE TABLE t1;
+# REPLACE ... SET
+REPLACE INTO t1 SET id1=1, val1='a', d1=1.00101;
+REPLACE INTO t1 SET id1=2, val1='b', d1=1.00102;
+REPLACE INTO t1 SET id1=3, val1='c', d1=1.00103;
+REPLACE INTO t1 SET id1=1, val1='a', d1=1.00101;
+GET DIAGNOSTICS CONDITION 1 @var92= ERROR_INDEX;
+Warnings:
+Error 1758 Invalid condition number
+SELECT @var92;
+@var92
+NULL
+REPLACE INTO t1 SET id1=6, val1='f', d1=1.79769313486232e+308);
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var93= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var94= ERROR_INDEX;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var93, @var94;
+@var93 @var94
+1 NULL
+REPLACE INTO t1 SET id1=9, val1=CAST(123 AS CHAR(1)), d1=1.00109;
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var95= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var96= ERROR_INDEX;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var95, @var96;
+@var95 @var96
+1 NULL
+REPLACE INTO t1 SET id1='x', val1='foo', d1=1.0203;
+ERROR 22007: Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+GET DIAGNOSTICS CONDITION 1 @var97= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var98= ERROR_INDEX;
+Warnings:
+Error 1366 Incorrect integer value: 'x' for column `test`.`t1`.`id1` at row 1
+Error 1758 Invalid condition number
+SELECT @var97, @var98;
+@var97 @var98
+1 NULL
+REPLACE INTO t1 SET id1=3/0, val1='p', d1=1.0116;
+ERROR 22012: Division by 0
+GET DIAGNOSTICS CONDITION 1 @var99= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var100= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var101= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 4 @var102= ERROR_INDEX;
+Warnings:
+Error 1365 Division by 0
+Error 1048 Column 'id1' cannot be null
+Error 1105 Unknown error
+Error 1758 Invalid condition number
+SELECT @var99, @var100, @var101, @var102;
+@var99 @var100 @var101 @var102
+1 1 1 NULL
+TRUNCATE TABLE t1;
+DROP TABLE t1;
+DROP TABLE t2;
+# REPLACE ... SELECT
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+INSERT INTO t2 VALUES(1,'a',1.00101,PointFromText('POINT(20 10)')),
+(2,'b',1.00102,PointFromText('POINT(20 10)')),
+(3,'c',1.00103,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2;
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2 WHERE id2=1;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+GET DIAGNOSTICS CONDITION 1 @var103= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var104= ERROR_INDEX;
+Warnings:
+Error 1062 Duplicate entry '1' for key 'PRIMARY'
+Error 1758 Invalid condition number
+SELECT @var103, @var104;
+@var103 @var104
+1 NULL
+INSERT INTO t1 SELECT id2, val2, p2 from t2;
+ERROR 22007: Incorrect double value: '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x004@\x00\x00\x00\x00\x00\x00$@' for column `test`.`t1`.`d1` at row 1
+GET DIAGNOSTICS CONDITION 1 @var105= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var106= ERROR_INDEX;
+Warnings:
+Error 1366 Incorrect double value: '\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x004@\x00\x00\x00\x00\x00\x00$@' for column `test`.`t1`.`d1` at row 1
+Error 1758 Invalid condition number
+SELECT @var105, @var106;
+@var105 @var106
+1 NULL
+INSERT INTO t1 SELECT id2, val2 FROM t2;
+ERROR 21S01: Column count doesn't match value count at row 1
+GET DIAGNOSTICS CONDITION 1 @var107= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var108= ERROR_INDEX;
+Warnings:
+Error 1136 Column count doesn't match value count at row 1
+Error 1758 Invalid condition number
+SELECT @var107, @var108;
+@var107 @var108
+1 NULL
+INSERT INTO t2 VALUES(4,'a',1.00101,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, CAST(123 AS CHAR(1)), d2 FROM t2 WHERE id2=4;
+ERROR 22007: Truncated incorrect CHAR(1) value: '123'
+GET DIAGNOSTICS CONDITION 1 @var109= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var110= ERROR_INDEX;
+Warnings:
+Error 1292 Truncated incorrect CHAR(1) value: '123'
+Error 1758 Invalid condition number
+SELECT @var109, @var110;
+@var109 @var110
+1 NULL
+INSERT INTO t1 SELECT id2, val2, 1.79769313486232e+308 FROM t2;
+ERROR 22007: Illegal double '1.79769313486232e+308' value found during parsing
+GET DIAGNOSTICS CONDITION 1 @var111= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var112= ERROR_INDEX;
+Warnings:
+Error 1367 Illegal double '1.79769313486232e+308' value found during parsing
+Error 1758 Invalid condition number
+SELECT @var111, @var112;
+@var111 @var112
+1 NULL
+INSERT INTO t1 SELECT id2/0, val2, d2 FROM t2;
+ERROR 22012: Division by 0
+GET DIAGNOSTICS CONDITION 1 @var113= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var114= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var115= ERROR_INDEX;
+Warnings:
+Error 1365 Division by 0
+Error 1048 Column 'id1' cannot be null
+Error 1758 Invalid condition number
+SELECT @var113, @var114, @var115;
+@var113 @var114 @var115
+1 1 NULL
+DROP TABLE t1,t2;
+# Checking ERROR_INDEX in STORED PROCEDURE
+CREATE TABLE t1(id1 INT PRIMARY KEY);
+CREATE PROCEDURE proc1 ()
+BEGIN
+DECLARE var116 INT;
+REPLACE INTO t1 VALUES (1),(2);
+GET DIAGNOSTICS CONDITION 1 var116= ERROR_INDEX;
+SELECT var116;
+END;
+|
+CALL proc1();
+var116
+NULL
+Warnings:
+Error 1758 Invalid condition number
+TRUNCATE TABLE t1;
+# Checking ERROR_INDEX in PREPARED STATEMENTS
+REPLACE INTO t1 VALUES (1), (2), (3);
+PREPARE stmt1 FROM "GET DIAGNOSTICS CONDITION 2 @var117= ERROR_INDEX";
+EXECUTE stmt1;
+Warnings:
+Error 1758 Invalid condition number
+SELECT @var117;
+@var117
+NULL
+DROP PROCEDURE proc1;
+DROP PREPARE stmt1;
+DROP TABLE t1;
+#
+# Checking that error_index is only for errors with rows/values
+#
+# INSERT STATEMENT
+CREATE TABLE t1(id1 INT);
+CREATE TABLE t2(id2 INT);
+CREATE VIEW v AS SELECT t1.id1 AS A, t2.id2 AS b FROM t1,t2;
+INSERT INTO t1(id1, id1) VALUES (1,1);
+ERROR 42000: Column 'id1' specified twice
+GET DIAGNOSTICS CONDITION 1 @var118= ERROR_INDEX;
+SELECT @var118;
+@var118
+0
+CREATE FUNCTION f1() RETURNS INT
+BEGIN
+INSERT INTO t1 VALUES (1);
+RETURN 1;
+END |
+INSERT INTO t1 VALUES (1), (f1());
+ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
+GET DIAGNOSTICS CONDITION 1 @var119= ERROR_INDEX;
+SELECT @var119;
+@var119
+0
+INSERT INTO t1 VALUES (1) RETURNING id2;
+ERROR 42S22: Unknown column 'id2' in 'field list'
+GET DIAGNOSTICS CONDITION 1 @var120= ERROR_INDEX;
+SELECT @var120;
+@var120
+0
+INSERT INTO t1(id2) VALUES(1);
+ERROR 42S22: Unknown column 'id2' in 'field list'
+GET DIAGNOSTICS CONDITION 1 @var121= ERROR_INDEX;
+SELECT @var121;
+@var121
+0
+INSERT INTO v VALUES(1,2);
+ERROR HY000: Can not insert into join view 'test.v' without fields list
+GET DIAGNOSTICS CONDITION 1 @var122= ERROR_INDEX;
+SELECT @var122;
+@var122
+0
+INSERT INTO v(a,b) VALUES (1,2);
+ERROR HY000: Can not modify more than one base table through a join view 'test.v'
+GET DIAGNOSTICS CONDITION 1 @var123= ERROR_INDEX;
+SELECT @var123;
+@var123
+0
+# REPLACE STATEMENT
+REPLACE INTO t1(id1, id1) VALUES (1,1);
+ERROR 42000: Column 'id1' specified twice
+GET DIAGNOSTICS CONDITION 1 @var124= ERROR_INDEX;
+SELECT @var124;
+@var124
+0
+CREATE FUNCTION f2() RETURNS INT
+BEGIN
+REPLACE INTO t1 VALUES (1);
+RETURN 1;
+END |
+REPLACE INTO t1 VALUES (1), (f2());
+ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
+GET DIAGNOSTICS CONDITION 1 @var125= ERROR_INDEX;
+SELECT @var125;
+@var125
+0
+REPLACE INTO t1 VALUES (1) RETURNING id2;
+ERROR 42S22: Unknown column 'id2' in 'field list'
+GET DIAGNOSTICS CONDITION 1 @var126= ERROR_INDEX;
+SELECT @var126;
+@var126
+0
+REPLACE INTO t1(id2) VALUES(1);
+ERROR 42S22: Unknown column 'id2' in 'field list'
+GET DIAGNOSTICS CONDITION 1 @var127= ERROR_INDEX;
+SELECT @var127;
+@var127
+0
+REPLACE INTO v VALUES(1,2);
+ERROR HY000: Can not insert into join view 'test.v' without fields list
+GET DIAGNOSTICS CONDITION 1 @var128= ERROR_INDEX;
+SELECT @var128;
+@var128
+0
+REPLACE INTO v(a,b) VALUES (1,2);
+ERROR HY000: Can not modify more than one base table through a join view 'test.v'
+GET DIAGNOSTICS CONDITION 1 @var129= ERROR_INDEX;
+SELECT @var129;
+@var129
+0
+DROP TABLE t1,t2;
+DROP FUNCTION f1;
+DROP FUNCTION f2;
+DROP VIEW v;
diff --git a/mysql-test/main/get_diagnostics.test b/mysql-test/main/get_diagnostics.test
index d9faf184a62..6784256164d 100644
--- a/mysql-test/main/get_diagnostics.test
+++ b/mysql-test/main/get_diagnostics.test
@@ -851,3 +851,582 @@ FLUSH STATUS;
SHOW STATUS LIKE 'Com%get_diagnostics';
GET DIAGNOSTICS @var1 = NUMBER;
SHOW STATUS LIKE 'Com%get_diagnostics';
+
+--echo #
+--echo # MDEV-10075: Provide index of error causing error in array INSERT
+--echo #
+
+--echo #
+--echo # INSERT STATEMENT
+--echo #
+
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+
+
+--echo # Simple INSERT statement
+
+INSERT INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+--error ER_DUP_ENTRY
+INSERT INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+GET DIAGNOSTICS CONDITION 1 @var1= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var2= ERROR_INDEX;
+SELECT @var1, @var2;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+GET DIAGNOSTICS CONDITION 1 @var3= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var4= ERROR_INDEX;
+SELECT @var3, @var4;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+GET DIAGNOSTICS CONDITION 1 @var5= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var6= ERROR_INDEX;
+SELECT @var5, @var6;
+
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 VALUES (9,CAST(123 AS CHAR(1)),1.00109);
+GET DIAGNOSTICS CONDITION 1 @var7= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var8= ERROR_INDEX;
+SELECT @var7, @var8;
+
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+INSERT INTO t1 VALUES ('x','foo',1.0203);
+GET DIAGNOSTICS CONDITION 1 @var9= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var10= ERROR_INDEX;
+SELECT @var9, @var10;
+
+--error ER_OPERAND_COLUMNS
+INSERT INTO t1 VALUES ((13,'m',1.0113));
+GET DIAGNOSTICS CONDITION 1 @var11= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var12= ERROR_INDEX;
+SELECT @var11, @var12;
+
+INSERT INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (16/0,'p',1.0116);
+GET DIAGNOSTICS CONDITION 1 @var13= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var14= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var15= ERROR_INDEX;
+SELECT @var13, @var14, @var15;
+
+TRUNCATE TABLE t1;
+
+--echo # INSERT ... IGNORE
+
+INSERT IGNORE INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+INSERT IGNORE INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+GET DIAGNOSTICS CONDITION 1 @var16= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var17= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var18= ERROR_INDEX;
+SELECT @var16, @var17, @var18;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT IGNORE INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+GET DIAGNOSTICS CONDITION 1 @var19= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var20= ERROR_INDEX;
+SELECT @var19, @var20;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT IGNORE INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+GET DIAGNOSTICS CONDITION 1 @var21= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var22= ERROR_INDEX;
+SELECT @var21, @var22;
+
+INSERT IGNORE INTO t1 VALUES (9,CAST(123 AS CHAR(1)),1.00109);
+GET DIAGNOSTICS CONDITION 1 @var23= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var24= ERROR_INDEX;
+SELECT @var23, @var24;
+
+INSERT IGNORE INTO t1 VALUES ('x','foo',1.0203);
+GET DIAGNOSTICS CONDITION 1 @var25= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var26= ERROR_INDEX;
+SELECT @var25, @var26;
+
+--error ER_OPERAND_COLUMNS
+INSERT IGNORE INTO t1 VALUES ((13,'m',1.0113));
+GET DIAGNOSTICS CONDITION 1 @var27= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var28= ERROR_INDEX;
+SELECT @var27, @var28;
+
+INSERT IGNORE INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115),
+(16/0,'p',1.0116);
+GET DIAGNOSTICS CONDITION 1 @var29= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var30= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var31= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 4 @var32= ERROR_INDEX;
+SELECT @var29, @var30, @var31, @var32;
+
+TRUNCATE TABLE t1;
+
+--echo # INSERT ... SET
+
+INSERT INTO t1 SET id1=1, val1='a', d1=1.00101;
+INSERT INTO t1 SET id1=2, val1='b', d1=1.00102;
+INSERT INTO t1 SET id1=3, val1='c', d1=1.00103;
+
+--error ER_DUP_ENTRY
+INSERT INTO t1 SET id1=1, val1='a', d1=1.00101;
+GET DIAGNOSTICS CONDITION 1 @var33= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var34= ERROR_INDEX;
+SELECT @var33, @var34;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT INTO t1 SET id1=6, val1='f', d1=1.79769313486232e+308);
+GET DIAGNOSTICS CONDITION 1 @var35= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var36= ERROR_INDEX;
+SELECT @var35, @var36;
+
+
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 SET id1=9, val1=CAST(123 AS CHAR(1)), d1=1.00109;
+GET DIAGNOSTICS CONDITION 1 @var37= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var38= ERROR_INDEX;
+SELECT @var37, @var38;
+
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+INSERT INTO t1 SET id1='x', val1='foo', d1=1.0203;
+GET DIAGNOSTICS CONDITION 1 @var39= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var40= ERROR_INDEX;
+SELECT @var39, @var40;
+
+--error ER_DIVISION_BY_ZERO
+INSERT INTO t1 SET id1=3/0, val1='p', d1=1.0116;
+GET DIAGNOSTICS CONDITION 1 @var41= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var42= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var43= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 4 @var44= ERROR_INDEX;
+SELECT @var41, @var42, @var43, @var44;
+
+TRUNCATE TABLE t1;
+
+--echo # INSERT ... ON DUPLICATE KEY UPDATE
+
+INSERT INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+
+INSERT INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101)
+ON DUPLICATE KEY UPDATE val1='a', d1=1.00101;
+GET DIAGNOSTICS CONDITION 1 @var45= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var46= ERROR_INDEX;
+SELECT @var45, @var46;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT INTO t1 VALUES (5,'e',1.00105),(3,'f',1.79769313486232e+308)
+ON DUPLICATE KEY UPDATE val1='c';
+GET DIAGNOSTICS CONDITION 1 @var47= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var48= ERROR_INDEX;
+SELECT @var47, @var48;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT INTO t1 VALUES (5,'e',1.00105), (3,'i')
+ON DUPLICATE KEY UPDATE val1='c';
+GET DIAGNOSTICS CONDITION 1 @var49= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var50= ERROR_INDEX;
+SELECT @var49, @var50;
+
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 VALUES (3, CAST(123 AS CHAR(1)), 1.00103)
+ON DUPLICATE KEY UPDATE val1='c';
+GET DIAGNOSTICS CONDITION 1 @var51= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var52= ERROR_INDEX;
+SELECT @var51, @var52;
+
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+INSERT INTO t1 VALUES ('x','foo',1.0203)
+ON DUPLICATE KEY UPDATE val1='c';
+GET DIAGNOSTICS CONDITION 1 @var53= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var54= ERROR_INDEX;
+SELECT @var53, @var54;
+
+--error ER_OPERAND_COLUMNS
+INSERT INTO t1 VALUES ((13,'m',1.0113)) ON DUPLICATE KEY UPDATE val1='c';
+GET DIAGNOSTICS CONDITION 1 @var55= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var56= ERROR_INDEX;
+SELECT @var55, @var56;
+
+INSERT INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (2/0,'p',1.00102)
+ON DUPLICATE KEY UPDATE val1='b';
+GET DIAGNOSTICS CONDITION 1 @var57= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var58= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var59= ERROR_INDEX;
+SELECT @var57, @var58, @var59;
+
+--error ER_DUP_ENTRY
+INSERT INTO t1 VALUES (1,'e',1.0),(5,'e',1.0),(5,'f',1.7)
+ON DUPLICATE KEY UPDATE id1='1';
+GET DIAGNOSTICS CONDITION 1 @var60= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var61= ERROR_INDEX;
+SELECT @var60, @var61;
+
+TRUNCATE TABLE t1;
+
+DROP TABLE t1;
+DROP TABLE t2;
+
+--echo INSERT ... SELECT
+
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+
+INSERT INTO t2 VALUES(1,'a',1.00101,PointFromText('POINT(20 10)')),
+ (2,'b',1.00102,PointFromText('POINT(20 10)')),
+ (3,'c',1.00103,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2;
+
+--error ER_DUP_ENTRY
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2 WHERE id2=1;
+GET DIAGNOSTICS CONDITION 1 @var62= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var63= ERROR_INDEX;
+SELECT @var62, @var63;
+
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+INSERT INTO t1 SELECT id2, val2, p2 from t2;
+GET DIAGNOSTICS CONDITION 1 @var64= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var65= ERROR_INDEX;
+SELECT @var64, @var65;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT INTO t1 SELECT id2, val2 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var66= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var67= ERROR_INDEX;
+SELECT @var66, @var67;
+
+INSERT INTO t2 VALUES(4,'a',1.00101,PointFromText('POINT(20 10)'));
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 SELECT id2, CAST(123 AS CHAR(1)), d2 FROM t2 WHERE id2=4;
+GET DIAGNOSTICS CONDITION 1 @var68= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var69= ERROR_INDEX;
+SELECT @var68, @var69;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT INTO t1 SELECT id2, val2, 1.79769313486232e+308 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var70= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var71= ERROR_INDEX;
+SELECT @var70, @var71;
+
+
+--error ER_DIVISION_BY_ZERO
+INSERT INTO t1 SELECT id2/0, val2, d2 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var72= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var73= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var74= ERROR_INDEX;
+SELECT @var72, @var73, @var74;
+
+DROP TABLE t1,t2;
+
+--echo # Checking ERROR_INDEX in STORED PROCEDURE for INSERT
+
+CREATE TABLE t1(id1 INT PRIMARY KEY);
+
+DELIMITER |;
+
+CREATE PROCEDURE proc1 ()
+BEGIN
+
+ DECLARE var75 INT;
+ DECLARE var76 INT;
+
+ INSERT INTO t1 VALUES (1),(2);
+ INSERT IGNORE INTO t1 VALUES(2);
+
+ GET DIAGNOSTICS CONDITION 1 var75= ERROR_INDEX;
+ GET DIAGNOSTICS CONDITION 2 var76= ERROR_INDEX;
+
+ SELECT var75, var76;
+
+END;
+|
+
+DELIMITER ;|
+
+CALL proc1();
+TRUNCATE TABLE t1;
+
+--echo # Checking ERROR_INDEX in PREPARED STATEMENTS for INSERT
+
+INSERT INTO t1 VALUES (1), (2), (3);
+INSERT IGNORE INTO t1 VALUES(2),(3),(4);
+
+PREPARE stmt1 FROM "GET DIAGNOSTICS CONDITION 2 @var77= ERROR_INDEX";
+EXECUTE stmt1;
+SELECT @var77;
+
+DROP PROCEDURE proc1;
+DROP PREPARE stmt1;
+DROP TABLE t1;
+
+--echo #
+--echo # REPLACE STATEMENT
+--echo #
+
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE);
+
+
+--echo # Simple REPLACE statement
+
+REPLACE INTO t1 VALUES(1,'a',1.00101), (2,'b',1.00102), (3,'c',1.00103);
+REPLACE INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102);
+GET DIAGNOSTICS CONDITION 1 @var78= ERROR_INDEX;
+SELECT @var78;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+REPLACE INTO t1 VALUES (5,'e',1.00105),(6,'f',1.79769313486232e+308);
+GET DIAGNOSTICS CONDITION 1 @var79= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var80= ERROR_INDEX;
+SELECT @var79, @var80;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+REPLACE INTO t1 VALUES (7,'g',1.00107),(8,'h',1.00108),(9,'i'),(10,'j');
+GET DIAGNOSTICS CONDITION 1 @var81= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var82= ERROR_INDEX;
+SELECT @var81, @var82;
+
+--error ER_TRUNCATED_WRONG_VALUE
+REPLACE INTO t1 VALUES (9,CAST(123 AS CHAR(1)),1.00109);
+GET DIAGNOSTICS CONDITION 1 @var83= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var84= ERROR_INDEX;
+SELECT @var83, @var84;
+
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+REPLACE INTO t1 VALUES ('x','foo',1.0203);
+GET DIAGNOSTICS CONDITION 1 @var85= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var86= ERROR_INDEX;
+SELECT @var85, @var86;
+
+--error ER_OPERAND_COLUMNS
+REPLACE INTO t1 VALUES ((13,'m',1.0113));
+GET DIAGNOSTICS CONDITION 1 @var87= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var88= ERROR_INDEX;
+SELECT @var87, @var88;
+
+REPLACE INTO t1 VALUES (14,'n',1.0114), (15,'o',1.0115), (16/0,'p',1.0116);
+GET DIAGNOSTICS CONDITION 1 @var89= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var90= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var91= ERROR_INDEX;
+SELECT @var89, @var90, @var91;
+
+TRUNCATE TABLE t1;
+
+--echo # REPLACE ... SET
+
+REPLACE INTO t1 SET id1=1, val1='a', d1=1.00101;
+REPLACE INTO t1 SET id1=2, val1='b', d1=1.00102;
+REPLACE INTO t1 SET id1=3, val1='c', d1=1.00103;
+
+REPLACE INTO t1 SET id1=1, val1='a', d1=1.00101;
+GET DIAGNOSTICS CONDITION 1 @var92= ERROR_INDEX;
+SELECT @var92;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+REPLACE INTO t1 SET id1=6, val1='f', d1=1.79769313486232e+308);
+GET DIAGNOSTICS CONDITION 1 @var93= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var94= ERROR_INDEX;
+SELECT @var93, @var94;
+
+
+--error ER_TRUNCATED_WRONG_VALUE
+REPLACE INTO t1 SET id1=9, val1=CAST(123 AS CHAR(1)), d1=1.00109;
+GET DIAGNOSTICS CONDITION 1 @var95= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var96= ERROR_INDEX;
+SELECT @var95, @var96;
+
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+REPLACE INTO t1 SET id1='x', val1='foo', d1=1.0203;
+GET DIAGNOSTICS CONDITION 1 @var97= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var98= ERROR_INDEX;
+SELECT @var97, @var98;
+
+--error ER_DIVISION_BY_ZERO
+REPLACE INTO t1 SET id1=3/0, val1='p', d1=1.0116;
+GET DIAGNOSTICS CONDITION 1 @var99= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var100= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var101= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 4 @var102= ERROR_INDEX;
+SELECT @var99, @var100, @var101, @var102;
+
+TRUNCATE TABLE t1;
+
+DROP TABLE t1;
+DROP TABLE t2;
+
+--echo # REPLACE ... SELECT
+
+CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(10), d1 DOUBLE);
+CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(10), d2 DOUBLE, p2 POINT);
+
+
+INSERT INTO t2 VALUES(1,'a',1.00101,PointFromText('POINT(20 10)')),
+ (2,'b',1.00102,PointFromText('POINT(20 10)')),
+ (3,'c',1.00103,PointFromText('POINT(20 10)'));
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2;
+
+--error ER_DUP_ENTRY
+INSERT INTO t1 SELECT id2, val2, d2 FROM t2 WHERE id2=1;
+GET DIAGNOSTICS CONDITION 1 @var103= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var104= ERROR_INDEX;
+SELECT @var103, @var104;
+
+--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
+INSERT INTO t1 SELECT id2, val2, p2 from t2;
+GET DIAGNOSTICS CONDITION 1 @var105= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var106= ERROR_INDEX;
+SELECT @var105, @var106;
+
+--error ER_WRONG_VALUE_COUNT_ON_ROW
+INSERT INTO t1 SELECT id2, val2 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var107= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var108= ERROR_INDEX;
+SELECT @var107, @var108;
+
+INSERT INTO t2 VALUES(4,'a',1.00101,PointFromText('POINT(20 10)'));
+--error ER_TRUNCATED_WRONG_VALUE
+INSERT INTO t1 SELECT id2, CAST(123 AS CHAR(1)), d2 FROM t2 WHERE id2=4;
+GET DIAGNOSTICS CONDITION 1 @var109= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var110= ERROR_INDEX;
+SELECT @var109, @var110;
+
+--error ER_ILLEGAL_VALUE_FOR_TYPE
+INSERT INTO t1 SELECT id2, val2, 1.79769313486232e+308 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var111= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var112= ERROR_INDEX;
+SELECT @var111, @var112;
+
+
+--error ER_DIVISION_BY_ZERO
+INSERT INTO t1 SELECT id2/0, val2, d2 FROM t2;
+GET DIAGNOSTICS CONDITION 1 @var113= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 2 @var114= ERROR_INDEX;
+GET DIAGNOSTICS CONDITION 3 @var115= ERROR_INDEX;
+SELECT @var113, @var114, @var115;
+
+DROP TABLE t1,t2;
+
+--echo # Checking ERROR_INDEX in STORED PROCEDURE
+
+CREATE TABLE t1(id1 INT PRIMARY KEY);
+
+DELIMITER |;
+
+CREATE PROCEDURE proc1 ()
+BEGIN
+
+ DECLARE var116 INT;
+
+ REPLACE INTO t1 VALUES (1),(2);
+
+ GET DIAGNOSTICS CONDITION 1 var116= ERROR_INDEX;
+
+ SELECT var116;
+
+END;
+|
+
+DELIMITER ;|
+
+CALL proc1();
+TRUNCATE TABLE t1;
+
+--echo # Checking ERROR_INDEX in PREPARED STATEMENTS
+
+REPLACE INTO t1 VALUES (1), (2), (3);
+
+PREPARE stmt1 FROM "GET DIAGNOSTICS CONDITION 2 @var117= ERROR_INDEX";
+EXECUTE stmt1;
+SELECT @var117;
+
+DROP PROCEDURE proc1;
+DROP PREPARE stmt1;
+DROP TABLE t1;
+
+--echo #
+--echo # Checking that error_index is only for errors with rows/values
+--echo #
+
+--echo # INSERT STATEMENT
+
+CREATE TABLE t1(id1 INT);
+CREATE TABLE t2(id2 INT);
+CREATE VIEW v AS SELECT t1.id1 AS A, t2.id2 AS b FROM t1,t2;
+
+--error ER_FIELD_SPECIFIED_TWICE
+INSERT INTO t1(id1, id1) VALUES (1,1);
+GET DIAGNOSTICS CONDITION 1 @var118= ERROR_INDEX;
+SELECT @var118;
+
+delimiter |;
+CREATE FUNCTION f1() RETURNS INT
+BEGIN
+ INSERT INTO t1 VALUES (1);
+ RETURN 1;
+END |
+delimiter ;|
+
+--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
+INSERT INTO t1 VALUES (1), (f1());
+GET DIAGNOSTICS CONDITION 1 @var119= ERROR_INDEX;
+SELECT @var119;
+
+--error ER_BAD_FIELD_ERROR
+INSERT INTO t1 VALUES (1) RETURNING id2;
+GET DIAGNOSTICS CONDITION 1 @var120= ERROR_INDEX;
+SELECT @var120;
+
+--error ER_BAD_FIELD_ERROR
+INSERT INTO t1(id2) VALUES(1);
+GET DIAGNOSTICS CONDITION 1 @var121= ERROR_INDEX;
+SELECT @var121;
+
+--error ER_VIEW_NO_INSERT_FIELD_LIST
+INSERT INTO v VALUES(1,2);
+GET DIAGNOSTICS CONDITION 1 @var122= ERROR_INDEX;
+SELECT @var122;
+
+--error ER_VIEW_MULTIUPDATE
+INSERT INTO v(a,b) VALUES (1,2);
+GET DIAGNOSTICS CONDITION 1 @var123= ERROR_INDEX;
+SELECT @var123;
+
+--echo # REPLACE STATEMENT
+
+--error ER_FIELD_SPECIFIED_TWICE
+REPLACE INTO t1(id1, id1) VALUES (1,1);
+GET DIAGNOSTICS CONDITION 1 @var124= ERROR_INDEX;
+SELECT @var124;
+
+delimiter |;
+CREATE FUNCTION f2() RETURNS INT
+BEGIN
+ REPLACE INTO t1 VALUES (1);
+ RETURN 1;
+END |
+delimiter ;|
+
+--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
+REPLACE INTO t1 VALUES (1), (f2());
+GET DIAGNOSTICS CONDITION 1 @var125= ERROR_INDEX;
+SELECT @var125;
+
+--error ER_BAD_FIELD_ERROR
+REPLACE INTO t1 VALUES (1) RETURNING id2;
+GET DIAGNOSTICS CONDITION 1 @var126= ERROR_INDEX;
+SELECT @var126;
+
+--error ER_BAD_FIELD_ERROR
+REPLACE INTO t1(id2) VALUES(1);
+GET DIAGNOSTICS CONDITION 1 @var127= ERROR_INDEX;
+SELECT @var127;
+
+--error ER_VIEW_NO_INSERT_FIELD_LIST
+REPLACE INTO v VALUES(1,2);
+GET DIAGNOSTICS CONDITION 1 @var128= ERROR_INDEX;
+SELECT @var128;
+
+--error ER_VIEW_MULTIUPDATE
+REPLACE INTO v(a,b) VALUES (1,2);
+GET DIAGNOSTICS CONDITION 1 @var129= ERROR_INDEX;
+SELECT @var129;
+
+DROP TABLE t1,t2;
+DROP FUNCTION f1;
+DROP FUNCTION f2;
+DROP VIEW v;
diff --git a/sql/lex.h b/sql/lex.h
index 8643197e862..57d8d807909 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -222,6 +222,7 @@ SYMBOL symbols[] = {
{ "ENUM", SYM(ENUM)},
{ "ERROR", SYM(ERROR_SYM)},
{ "ERRORS", SYM(ERRORS)},
+ { "ERROR_INDEX", SYM(ERROR_INDEX_SYM)},
{ "ESCAPE", SYM(ESCAPE_SYM)},
{ "ESCAPED", SYM(ESCAPED)},
{ "EVENT", SYM(EVENT_SYM)},
diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc
index c4c19dd39f6..7170018c995 100644
--- a/sql/sp_rcontext.cc
+++ b/sql/sp_rcontext.cc
@@ -518,7 +518,7 @@ bool sp_rcontext::handle_sql_condition(THD *thd,
found_condition=
new (callers_arena->mem_root) Sql_condition(callers_arena->mem_root,
da->get_error_condition_identity(),
- da->message());
+ da->message(), 0);
}
}
else if (da->current_statement_warn_count())
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index c88bfc4c484..34d220aa27e 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -908,6 +908,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier)
org_charset= 0;
/* Restore THR_THD */
set_current_thd(old_THR_THD);
+ current_insert_index= 0;
}
@@ -1055,6 +1056,8 @@ Sql_condition* THD::raise_condition(uint sql_errno,
{
Diagnostics_area *da= get_stmt_da();
Sql_condition *cond= NULL;
+ ulonglong saved_error_index;
+
DBUG_ENTER("THD::raise_condition");
DBUG_ASSERT(level < Sql_condition::WARN_LEVEL_END);
@@ -1149,7 +1152,10 @@ Sql_condition* THD::raise_condition(uint sql_errno,
if (likely(!(is_fatal_error && (sql_errno == EE_OUTOFMEMORY ||
sql_errno == ER_OUTOFMEMORY))))
{
+ saved_error_index= this->current_insert_index;
+ this->current_insert_index= this->correct_error_index(sql_errno);
cond= da->push_warning(this, sql_errno, sqlstate, level, ucid, msg);
+ this->current_insert_index= saved_error_index;
}
DBUG_RETURN(cond);
}
diff --git a/sql/sql_class.h b/sql/sql_class.h
index e569fcd32d6..791e67b4f59 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -5502,6 +5502,29 @@ public:
{
lex= backup_lex;
}
+
+ /*
+ Stores the the processed record during INSERT/REPLACE. Used for assigning
+ value of error_index in case of warning or error.
+ */
+ ulonglong current_insert_index;
+
+ /*
+ Error may take place in prepare phase and it might not be because of
+ rows/values we are inserting into the table, it could be because of say
+ something like wrong field name. In such case we want to return 0
+ for error index.
+ */
+ ulonglong correct_error_index(uint error_no)
+ {
+ if (error_no == ER_FIELD_SPECIFIED_TWICE ||
+ error_no == ER_BAD_FIELD_ERROR ||
+ error_no == ER_VIEW_NO_INSERT_FIELD_LIST ||
+ error_no == ER_VIEW_MULTIUPDATE)
+ return 0;
+
+ return current_insert_index;
+ }
};
diff --git a/sql/sql_error.cc b/sql/sql_error.cc
index cef9e6cec00..6961f1b258e 100644
--- a/sql/sql_error.cc
+++ b/sql/sql_error.cc
@@ -672,7 +672,8 @@ Sql_condition *Warning_info::push_warning(THD *thd,
if (m_allow_unlimited_warnings ||
m_warn_list.elements() < thd->variables.max_error_count)
{
- cond= new (& m_warn_root) Sql_condition(& m_warn_root, *value, msg);
+ cond= new (& m_warn_root) Sql_condition(& m_warn_root, *value, msg,
+ thd->current_insert_index);
if (cond)
m_warn_list.push_back(cond);
}
diff --git a/sql/sql_error.h b/sql/sql_error.h
index 6b0d4d7749c..113b51454c6 100644
--- a/sql/sql_error.h
+++ b/sql/sql_error.h
@@ -396,7 +396,7 @@ private:
*/
Sql_condition()
:m_mem_root(NULL)
- { }
+ { error_index= 0; }
/**
Complete the Sql_condition initialisation.
@@ -419,6 +419,7 @@ private:
:m_mem_root(mem_root)
{
DBUG_ASSERT(mem_root != NULL);
+ error_index= 0;
}
Sql_condition(MEM_ROOT *mem_root, const Sql_user_condition_identity &ucid)
@@ -426,6 +427,7 @@ private:
m_mem_root(mem_root)
{
DBUG_ASSERT(mem_root != NULL);
+ error_index= 0;
}
/**
Constructor for a fixed message text.
@@ -436,7 +438,8 @@ private:
*/
Sql_condition(MEM_ROOT *mem_root,
const Sql_condition_identity &value,
- const char *msg)
+ const char *msg,
+ ulonglong current_error_index)
:Sql_condition_identity(value),
m_mem_root(mem_root)
{
@@ -444,6 +447,7 @@ private:
DBUG_ASSERT(value.get_sql_errno() != 0);
DBUG_ASSERT(msg != NULL);
set_builtin_message_text(msg);
+ error_index= current_error_index;
}
/** Destructor. */
@@ -497,6 +501,9 @@ private:
/** Memory root to use to hold condition item values. */
MEM_ROOT *m_mem_root;
+
+ /* Index of error for INSERT/REPLACE statement. */
+ ulonglong error_index;
};
///////////////////////////////////////////////////////////////////////////
diff --git a/sql/sql_get_diagnostics.cc b/sql/sql_get_diagnostics.cc
index 197bf5e7a00..0de1cde3c49 100644
--- a/sql/sql_get_diagnostics.cc
+++ b/sql/sql_get_diagnostics.cc
@@ -338,6 +338,8 @@ Condition_information_item::get_value(THD *thd, const Sql_condition *cond)
str.set_ascii(cond->get_sqlstate(), strlen(cond->get_sqlstate()));
value= make_utf8_string_item(thd, &str);
break;
+ case ERROR_INDEX:
+ value= new (thd->mem_root) Item_uint(thd, cond->error_index);
}
DBUG_RETURN(value);
diff --git a/sql/sql_get_diagnostics.h b/sql/sql_get_diagnostics.h
index f283aa5b2c6..69432f9cf86 100644
--- a/sql/sql_get_diagnostics.h
+++ b/sql/sql_get_diagnostics.h
@@ -254,7 +254,8 @@ public:
CURSOR_NAME,
MESSAGE_TEXT,
MYSQL_ERRNO,
- RETURNED_SQLSTATE
+ RETURNED_SQLSTATE,
+ ERROR_INDEX
};
/**
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index eaafb8d7742..7b2b820752c 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -711,6 +711,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
Name_resolution_context_state ctx_state;
SELECT_LEX *returning= thd->lex->has_returning() ? thd->lex->returning() : 0;
unsigned char *readbuff= NULL;
+ thd->current_insert_index= 0;
#ifndef EMBEDDED_LIBRARY
char *query= thd->query();
@@ -830,7 +831,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
while ((values= its++))
{
- counter++;
+ thd->current_insert_index= ++counter;
if (values->elements != value_count)
{
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), counter);
@@ -842,6 +843,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
switch_to_nullable_trigger_fields(*values, table);
}
its.rewind ();
+ thd->current_insert_index= 0;
/* Restore the current context. */
ctx_state.restore_state(context, table_list);
@@ -1008,6 +1010,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
while ((values= its++))
{
+ thd->current_insert_index++;
if (fields.elements || !value_count)
{
/*
@@ -1131,6 +1134,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
} while (bulk_parameters_iterations(thd));
values_loop_end:
+ thd->current_insert_index= 0;
free_underlaid_joins(thd, thd->lex->first_select_lex());
joins_freed= TRUE;
@@ -1606,6 +1610,8 @@ int mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
bool res= 0;
table_map map= 0;
TABLE *table;
+ thd->current_insert_index= 1;
+
DBUG_ENTER("mysql_prepare_insert");
DBUG_PRINT("enter", ("table_list: %p view: %d",
table_list, (int) insert_into_view));
@@ -1659,6 +1665,7 @@ int mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
if (!res)
res= setup_fields(thd, Ref_ptr_array(),
update_values, MARK_COLUMNS_READ, 0, NULL, 0);
+ thd->current_insert_index= 0;
if (!res && duplic == DUP_UPDATE)
{
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index b9d3eec5a60..d853b09b354 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -7978,6 +7978,7 @@ void mysql_parse(THD *thd, char *rawbuf, uint length,
LEX *lex= thd->lex;
bool err= parse_sql(thd, parser_state, NULL, true);
+ thd->current_insert_index= 0;
if (likely(!err))
{
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 09ad632dd98..4d92d46f9c2 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -1338,9 +1338,10 @@ static bool mysql_test_insert_common(Prepared_statement *stmt,
table_list->table_name.str));
goto error;
}
+ thd->current_insert_index= 0;
while ((values= its++))
{
- counter++;
+ thd->current_insert_index= ++counter;
if (values->elements != value_count)
{
my_error(ER_WRONG_VALUE_COUNT_ON_ROW, MYF(0), counter);
@@ -1350,6 +1351,7 @@ static bool mysql_test_insert_common(Prepared_statement *stmt,
*values, COLUMNS_READ, 0, NULL, 0))
goto error;
}
+ thd->current_insert_index= 0;
}
DBUG_RETURN(FALSE);
diff --git a/sql/sql_signal.cc b/sql/sql_signal.cc
index 8e973f9b0b3..5a085c99de7 100644
--- a/sql/sql_signal.cc
+++ b/sql/sql_signal.cc
@@ -419,7 +419,7 @@ bool Sql_cmd_resignal::execute(THD *thd)
DBUG_RETURN(result);
}
- Sql_condition signaled_err(thd->mem_root, *signaled, signaled->message);
+ Sql_condition signaled_err(thd->mem_root, *signaled, signaled->message, 0);
if (m_cond)
{
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 89e20165984..57201b22802 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -971,6 +971,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%token <kwd> MUTEX_SYM
%token <kwd> MYSQL_SYM
%token <kwd> MYSQL_ERRNO_SYM
+%token <kwd> ERROR_INDEX_SYM
%token <kwd> NAMES_SYM /* SQL-2003-N */
%token <kwd> NAME_SYM /* SQL-2003-N */
%token <kwd> NATIONAL_SYM /* SQL-2003-R */
@@ -3627,6 +3628,8 @@ condition_information_item_name:
{ $$= Condition_information_item::MYSQL_ERRNO; }
| RETURNED_SQLSTATE_SYM
{ $$= Condition_information_item::RETURNED_SQLSTATE; }
+ | ERROR_INDEX_SYM
+ { $$= Condition_information_item::ERROR_INDEX; }
;
sp_decl_ident:
@@ -12915,6 +12918,7 @@ insert_table:
//lex->field_list.empty();
lex->many_values.empty();
lex->insert_list=0;
+ thd->current_insert_index= lex->many_values.elements+1;
}
;
@@ -12924,11 +12928,14 @@ insert_field_spec:
| SET
{
LEX *lex=Lex;
+ ulonglong saved_current_insert_index= thd->current_insert_index;
if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item)) ||
unlikely(lex->many_values.push_back(lex->insert_list,
thd->mem_root)))
MYSQL_YYABORT;
lex->current_select->parsing_place= NO_MATTER;
+ if (saved_current_insert_index < lex->many_values.elements)
+ thd->current_insert_index++;
}
ident_eq_list
;
@@ -13009,6 +13016,7 @@ no_braces:
if (unlikely(lex->many_values.push_back(lex->insert_list,
thd->mem_root)))
MYSQL_YYABORT;
+ thd->current_insert_index++;
}
;
@@ -13024,6 +13032,7 @@ no_braces_with_names:
if (unlikely(lex->many_values.push_back(lex->insert_list,
thd->mem_root)))
MYSQL_YYABORT;
+ thd->current_insert_index++;
}
;
@@ -15652,6 +15661,7 @@ keyword_sp_var_and_label:
| INVOKER_SYM
| IMPORT
| INDEXES
+ | ERROR_INDEX_SYM
| INITIAL_SIZE_SYM
| IO_SYM
| IPC_SYM
diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c
index 8f4e2b2fdad..128215d01a7 100644
--- a/tests/mysql_client_test.c
+++ b/tests/mysql_client_test.c
@@ -21505,6 +21505,95 @@ static void test_cache_metadata()
mysql_stmt_close(stmt);
}
+void test_mdev_10075()
+{
+ MYSQL_STMT *stmt;
+ int rc;
+ MYSQL_RES *result;
+ MYSQL_BIND my_bind[1];
+ MYSQL_BIND my_bind2[1];
+
+ struct st_data {
+ unsigned long id;
+ char id_ind;
+ };
+
+ struct st_data data[]= {
+ {0, STMT_INDICATOR_NONE},
+ {1, STMT_INDICATOR_NONE},
+ {2, STMT_INDICATOR_NONE}
+ };
+
+ struct st_data data2[]= {
+ {3, STMT_INDICATOR_NONE},
+ {2, STMT_INDICATOR_NONE},
+ {4, STMT_INDICATOR_NONE}
+ };
+
+ myheader("test_mdev_10075");
+
+ rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
+ myquery(rc);
+
+ rc= mysql_query(mysql, "CREATE TABLE t1(id INT PRIMARY KEY)");
+ myquery(rc);
+
+ /* insert by prepare */
+ stmt= mysql_simple_prepare(mysql,
+ "INSERT INTO t1 VALUES(?)");
+ check_stmt(stmt);
+ verify_param_count(stmt, 1);
+
+ /* bzero bind structure */
+ bzero((char*) my_bind, sizeof(my_bind));
+ my_bind[0].buffer_type= MYSQL_TYPE_LONG;
+ my_bind[0].buffer= (void *)&data[0].id;
+
+ rc= mysql_stmt_bind_param(stmt, my_bind);
+ check_execute(stmt, rc);
+
+ /* Set array size, row size and bind the parameter */
+ mysql_stmt_bind_param(stmt, my_bind);
+
+ rc= mysql_stmt_execute(stmt);
+ check_execute(stmt, rc);
+
+ mysql_stmt_close(stmt);
+
+ stmt= mysql_simple_prepare(mysql,
+ "INSERT IGNORE INTO t1 VALUES(?)");
+ check_stmt(stmt);
+ verify_param_count(stmt, 1);
+
+ /* bzero bind structure */
+ bzero((char*) my_bind2, sizeof(my_bind2));
+ my_bind2[0].buffer_type= MYSQL_TYPE_LONG;
+ my_bind2[0].buffer= (void *)&data2[0].id;
+
+ rc= mysql_stmt_bind_param(stmt, my_bind2);
+ check_execute(stmt, rc);
+
+ mysql_stmt_bind_param(stmt, my_bind2);
+
+ rc= mysql_stmt_execute(stmt);
+ check_execute(stmt, rc);
+
+ mysql_stmt_close(stmt);
+
+ rc= mysql_query(mysql, "GET DIAGNOSTICS CONDITION 1 @var1 = ERROR_INDEX");
+ myquery(rc);
+
+ rc= mysql_query(mysql, "SELECT @var1");
+ myquery(rc);
+
+ result= mysql_store_result(mysql);
+ mytest(result);
+
+ rc= my_process_result_set(result);
+ DIE_UNLESS(rc == 1);
+
+ mysql_free_result(result);
+}
static struct my_tests_st my_tests[]= {
{ "test_mdev_26145", test_mdev_26145 },
@@ -21809,6 +21898,7 @@ static struct my_tests_st my_tests[]= {
{ "test_mdev20261", test_mdev20261 },
{ "test_execute_direct", test_execute_direct },
{ "test_cache_metadata", test_cache_metadata},
+ { "test_mdev_10075", test_mdev_10075},
{ 0, 0 }
};