Skip to content

Commit ff227f8

Browse files
ImeevMAkyukhin
authored andcommitted
sql: fix type calculation for DATETIME arithmetic
After this correction DATETIME arithmetic result type will be calculated correctly. Before this fix the type returned in the metadata was "scalar". Follow-up tarantool#6773 NO_DOC=Bugfix NO_CHANGELOG=Bugfix
1 parent 009f494 commit ff227f8

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

src/box/sql/expr.c

+6
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,12 @@ sql_type_result(enum field_type lhs, enum field_type rhs)
417417
rhs == FIELD_TYPE_UNSIGNED);
418418
return FIELD_TYPE_UNSIGNED;
419419
}
420+
if ((lhs == FIELD_TYPE_DATETIME && rhs == FIELD_TYPE_DATETIME) ||
421+
(lhs == FIELD_TYPE_INTERVAL && rhs == FIELD_TYPE_INTERVAL))
422+
return FIELD_TYPE_INTERVAL;
423+
if ((lhs == FIELD_TYPE_INTERVAL && rhs == FIELD_TYPE_DATETIME) ||
424+
(lhs == FIELD_TYPE_DATETIME && rhs == FIELD_TYPE_INTERVAL))
425+
return FIELD_TYPE_DATETIME;
420426
return FIELD_TYPE_SCALAR;
421427
}
422428

test/sql-luatest/datetime_test.lua

+44
Original file line numberDiff line numberDiff line change
@@ -2860,3 +2860,47 @@ g.test_datetime_34_3 = function()
28602860
t.assert_equals(box.execute(sql).rows, {{dt1}})
28612861
end)
28622862
end
2863+
2864+
-- Properly compute type of result of DATETIME arithmetic.
2865+
g.test_datetime_35 = function()
2866+
g.server:exec(function()
2867+
local t = require('luatest')
2868+
local dt = require('datetime')
2869+
local dt1 = dt.new({year = 1})
2870+
local itv1 = dt.interval.new({year = 1})
2871+
2872+
box.execute([[CREATE TABLE t(dt DATETIME PRIMARY KEY, itv INTERVAL);]])
2873+
box.execute([[INSERT INTO t VALUES (?, ?);]], {dt1, itv1})
2874+
2875+
local sql = [[SELECT typeof(dt - dt) FROM t;]]
2876+
t.assert_equals(box.execute(sql).rows, {{'interval'}})
2877+
2878+
sql = [[SELECT dt - dt FROM t;]]
2879+
t.assert_equals(box.execute(sql).metadata[1].type, 'interval')
2880+
2881+
sql = [[SELECT typeof(dt - itv) FROM t;]]
2882+
t.assert_equals(box.execute(sql).rows, {{'datetime'}})
2883+
2884+
sql = [[SELECT dt - itv FROM t;]]
2885+
t.assert_equals(box.execute(sql).metadata[1].type, 'datetime')
2886+
2887+
sql = [[SELECT typeof(dt + itv) FROM t;]]
2888+
t.assert_equals(box.execute(sql).rows, {{'datetime'}})
2889+
2890+
sql = [[SELECT dt + itv FROM t;]]
2891+
t.assert_equals(box.execute(sql).metadata[1].type, 'datetime')
2892+
2893+
sql = [[SELECT typeof(itv - itv) FROM t;]]
2894+
t.assert_equals(box.execute(sql).rows, {{'interval'}})
2895+
2896+
sql = [[SELECT itv - itv FROM t;]]
2897+
t.assert_equals(box.execute(sql).metadata[1].type, 'interval')
2898+
2899+
sql = [[SELECT typeof(itv + itv) FROM t;]]
2900+
t.assert_equals(box.execute(sql).rows, {{'interval'}})
2901+
2902+
sql = [[SELECT itv + itv FROM t;]]
2903+
t.assert_equals(box.execute(sql).metadata[1].type, 'interval')
2904+
box.execute([[DROP TABLE t;]])
2905+
end)
2906+
end

0 commit comments

Comments
 (0)