diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c index decb42b973d5e436f9d995abcec5a2dd360638bc..79b06078665a244fa93d97a1591521c1f9e4bfe8 100644 --- a/src/box/sql/expr.c +++ b/src/box/sql/expr.c @@ -417,6 +417,12 @@ sql_type_result(enum field_type lhs, enum field_type rhs) rhs == FIELD_TYPE_UNSIGNED); return FIELD_TYPE_UNSIGNED; } + if ((lhs == FIELD_TYPE_DATETIME && rhs == FIELD_TYPE_DATETIME) || + (lhs == FIELD_TYPE_INTERVAL && rhs == FIELD_TYPE_INTERVAL)) + return FIELD_TYPE_INTERVAL; + if ((lhs == FIELD_TYPE_INTERVAL && rhs == FIELD_TYPE_DATETIME) || + (lhs == FIELD_TYPE_DATETIME && rhs == FIELD_TYPE_INTERVAL)) + return FIELD_TYPE_DATETIME; return FIELD_TYPE_SCALAR; } diff --git a/test/sql-luatest/datetime_test.lua b/test/sql-luatest/datetime_test.lua index ad04e4adecf93fd0438bc49d31e32cef4acd182d..70bdd6ad4d2e029ca9b3486e315d6afc086d7593 100644 --- a/test/sql-luatest/datetime_test.lua +++ b/test/sql-luatest/datetime_test.lua @@ -2860,3 +2860,47 @@ g.test_datetime_34_3 = function() t.assert_equals(box.execute(sql).rows, {{dt1}}) end) end + +-- Properly compute type of result of DATETIME arithmetic. +g.test_datetime_35 = function() + g.server:exec(function() + local t = require('luatest') + local dt = require('datetime') + local dt1 = dt.new({year = 1}) + local itv1 = dt.interval.new({year = 1}) + + box.execute([[CREATE TABLE t(dt DATETIME PRIMARY KEY, itv INTERVAL);]]) + box.execute([[INSERT INTO t VALUES (?, ?);]], {dt1, itv1}) + + local sql = [[SELECT typeof(dt - dt) FROM t;]] + t.assert_equals(box.execute(sql).rows, {{'interval'}}) + + sql = [[SELECT dt - dt FROM t;]] + t.assert_equals(box.execute(sql).metadata[1].type, 'interval') + + sql = [[SELECT typeof(dt - itv) FROM t;]] + t.assert_equals(box.execute(sql).rows, {{'datetime'}}) + + sql = [[SELECT dt - itv FROM t;]] + t.assert_equals(box.execute(sql).metadata[1].type, 'datetime') + + sql = [[SELECT typeof(dt + itv) FROM t;]] + t.assert_equals(box.execute(sql).rows, {{'datetime'}}) + + sql = [[SELECT dt + itv FROM t;]] + t.assert_equals(box.execute(sql).metadata[1].type, 'datetime') + + sql = [[SELECT typeof(itv - itv) FROM t;]] + t.assert_equals(box.execute(sql).rows, {{'interval'}}) + + sql = [[SELECT itv - itv FROM t;]] + t.assert_equals(box.execute(sql).metadata[1].type, 'interval') + + sql = [[SELECT typeof(itv + itv) FROM t;]] + t.assert_equals(box.execute(sql).rows, {{'interval'}}) + + sql = [[SELECT itv + itv FROM t;]] + t.assert_equals(box.execute(sql).metadata[1].type, 'interval') + box.execute([[DROP TABLE t;]]) + end) +end