[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