diff options
-rw-r--r-- | mysql-test/main/get_diagnostics.result | 763 | ||||
-rw-r--r-- | mysql-test/main/get_diagnostics.test | 579 | ||||
-rw-r--r-- | sql/lex.h | 1 | ||||
-rw-r--r-- | sql/sp_rcontext.cc | 2 | ||||
-rw-r--r-- | sql/sql_class.cc | 6 | ||||
-rw-r--r-- | sql/sql_class.h | 23 | ||||
-rw-r--r-- | sql/sql_error.cc | 3 | ||||
-rw-r--r-- | sql/sql_error.h | 11 | ||||
-rw-r--r-- | sql/sql_get_diagnostics.cc | 2 | ||||
-rw-r--r-- | sql/sql_get_diagnostics.h | 3 | ||||
-rw-r--r-- | sql/sql_insert.cc | 9 | ||||
-rw-r--r-- | sql/sql_parse.cc | 1 | ||||
-rw-r--r-- | sql/sql_prepare.cc | 4 | ||||
-rw-r--r-- | sql/sql_signal.cc | 2 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 10 | ||||
-rw-r--r-- | tests/mysql_client_test.c | 90 |
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 } }; |