[tarantool-patches] [PATCH v1 1/1] sql: Fix UPDATE for types unknown to SQL.

imeevma at tarantool.org imeevma at tarantool.org
Fri Jun 28 18:34:23 MSK 2019


Before this patch, UPDATE throwed an error when executed on a
tuple with types unknown to SQL. This patch fixes the problem in
case the fields with unknown types are not updated.

Closes #4189
---
https://github.com/tarantool/tarantool/issues/4189
https://github.com/tarantool/tarantool/tree/imeevma/gh-4189-field-type-conversion-error

 src/box/sql/vdbe.c      | 25 +++++++++++++++++++++++++
 test/sql/types.result   | 43 +++++++++++++++++++++++++++++++++++++++++++
 test/sql/types.test.lua | 17 +++++++++++++++++
 3 files changed, 85 insertions(+)

diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
index c8887f9..8ddc29d 100644
--- a/src/box/sql/vdbe.c
+++ b/src/box/sql/vdbe.c
@@ -294,6 +294,20 @@ mem_apply_numeric_type(struct Mem *record)
  * SCALAR:
  *    Mem is unchanged, but flag is set to BLOB.
  *
+ * BOOLEAN:
+ *    If memory holds BOOLEAN no actions take place.
+ *
+ * ANY:
+ *    Mem is unchanged, no actions take place.
+ *
+ * MAP:
+ *    If memory holds value with SQL_SUBTYPE_MSGPACK subtype and
+ *    data has MP_MAP type, no actions take place.
+ *
+ * ARRAY:
+ *    If memory holds value with SQL_SUBTYPE_MSGPACK subtype and
+ *    data has MP_ARRAY type, no actions take place.
+ *
  * @param record The value to apply type to.
  * @param type The type to be applied.
  */
@@ -337,8 +351,19 @@ mem_apply_type(struct Mem *record, enum field_type type)
 		}
 		record->flags &= ~(MEM_Real | MEM_Int);
 		return 0;
+	case FIELD_TYPE_ANY:
 	case FIELD_TYPE_SCALAR:
 		return 0;
+	case FIELD_TYPE_MAP:
+		if (record->subtype == SQL_SUBTYPE_MSGPACK &&
+		    mp_typeof(*record->z) == MP_MAP)
+			return 0;
+		return -1;
+	case FIELD_TYPE_ARRAY:
+		if (record->subtype == SQL_SUBTYPE_MSGPACK &&
+		    mp_typeof(*record->z) == MP_ARRAY)
+			return 0;
+		return -1;
 	default:
 		return -1;
 	}
diff --git a/test/sql/types.result b/test/sql/types.result
index cdfb1e7..5cc7f16 100644
--- a/test/sql/types.result
+++ b/test/sql/types.result
@@ -966,3 +966,46 @@ box.execute('SELECT ?', {true})
   rows:
   - [true]
 ...
+--
+-- gh-4189: Update throws an error when executed on a tuple with
+-- types unknown to SQL.
+--
+format = {}
+---
+...
+format[1] = {type = 'integer', name = 'I'}
+---
+...
+format[2] = {type = 'boolean', name = 'B'}
+---
+...
+format[3] = {type = 'array', name = 'F1'}
+---
+...
+format[4] = {type = 'map', name = 'F2'}
+---
+...
+format[5] = {type = 'any', name = 'F3'}
+---
+...
+s = box.schema.space.create('T', {format = format})
+---
+...
+ii = s:create_index('ii')
+---
+...
+s:insert({1, true, {1, 2}, {a = 3}, 'asd'})
+---
+- [1, true, [1, 2], {'a': 3}, 'asd']
+...
+box.execute('UPDATE t SET b = false WHERE i = 1;')
+---
+- row_count: 1
+...
+s:select()
+---
+- - [1, false, [1, 2], {'a': 3}, 'asd']
+...
+s:drop()
+---
+...
diff --git a/test/sql/types.test.lua b/test/sql/types.test.lua
index ae1a0ab..d33314a 100644
--- a/test/sql/types.test.lua
+++ b/test/sql/types.test.lua
@@ -234,3 +234,20 @@ box.execute('SELECT \'9223372036854\' + 1;')
 
 -- Fix BOOLEAN bindings.
 box.execute('SELECT ?', {true})
+
+--
+-- gh-4189: Update throws an error when executed on a tuple with
+-- types unknown to SQL.
+--
+format = {}
+format[1] = {type = 'integer', name = 'I'}
+format[2] = {type = 'boolean', name = 'B'}
+format[3] = {type = 'array', name = 'F1'}
+format[4] = {type = 'map', name = 'F2'}
+format[5] = {type = 'any', name = 'F3'}
+s = box.schema.space.create('T', {format = format})
+ii = s:create_index('ii')
+s:insert({1, true, {1, 2}, {a = 3}, 'asd'})
+box.execute('UPDATE t SET b = false WHERE i = 1;')
+s:select()
+s:drop()
-- 
2.7.4





More information about the Tarantool-patches mailing list