Skip to content

Commit cc9cfec

Browse files
author
Alexander Barkov
committed
MDEV-8865 Wrong field type or metadata for COALESCE(signed_int_column, unsigned_int_column)
Item_func_hybrid_field_type did not return correct field_type(), cmp_type() and result_type() in some cases, because cached_result_type and cached_field_type were set in independent pieces of the code and did not properly match to each other. Fix: - Removing Item_func_hybrid_result_type - Deriving Item_func_hybrid_field_type directly from Item_func - Introducing a new class Type_handler which guarantees that field_type(), cmp_type() and result_type() are always properly synchronized and using the new class in Item_func_hybrid_field_type.
1 parent 09b87d6 commit cc9cfec

File tree

12 files changed

+2084
-157
lines changed

12 files changed

+2084
-157
lines changed

libmysqld/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
104104
../sql/sql_explain.cc ../sql/sql_explain.h
105105
../sql/sql_analyze_stmt.cc ../sql/sql_analyze_stmt.h
106106
../sql/compat56.cc
107+
../sql/sql_type.cc ../sql/sql_type.h
107108
../sql/table_cache.cc ../sql/mf_iocache_encr.cc
108109
../sql/item_inetfunc.cc
109110
../sql/wsrep_dummy.cc ../sql/encryption.cc
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# "mtr --ps" returns different values in "Max length"
2+
--disable_ps_protocol
3+
--enable_metadata
4+
--vertical_results
5+
SELECT
6+
a AS ___________a,
7+
CASE WHEN a IS NOT NULL THEN a END AS case_______a,
8+
CASE WHEN a IS NOT NULL THEN a ELSE a END AS case_____a_a,
9+
COALESCE(a) AS coalesce___a,
10+
COALESCE(a, a) AS coalesce_a_a,
11+
IF(a IS NULL, a, a) AS if_______a_a,
12+
IFNULL(a, a) AS ifnull___a_a,
13+
LEAST(a, a) AS least____a_a,
14+
GREATEST(a, a) AS greatest_a_a,
15+
b AS ___________b,
16+
CASE WHEN a IS NOT NULL THEN b END AS case_______b,
17+
CASE WHEN a IS NOT NULL THEN b ELSE b END AS case_____b_b,
18+
COALESCE(b) AS coalesce___b,
19+
COALESCE(b, b) AS coalesce_b_b,
20+
IF(a IS NULL, b, b) AS if_______b_b,
21+
IFNULL(b, b) AS ifnull___b_b,
22+
LEAST(b, b) AS least____b_b,
23+
GREATEST(b, b) AS greatest_b_b
24+
FROM t1;
25+
SELECT
26+
CASE WHEN a IS NOT NULL THEN a ELSE b END AS case_____a_b,
27+
CASE WHEN a IS NOT NULL THEN b ELSE a END AS case_____b_a,
28+
COALESCE(a, b) AS coalesce_a_b,
29+
COALESCE(b, a) AS coalesce_b_a,
30+
IF(a IS NULL, a, b) AS if_______a_b,
31+
IF(a IS NULL, b, a) AS if_______b_a,
32+
IFNULL(a, b) AS ifnull___a_b,
33+
IFNULL(b, a) AS ifnull___b_a,
34+
LEAST(a, b) AS least____a_b,
35+
LEAST(b, a) AS least____b_a,
36+
GREATEST(a, b) AS greatest_a_b,
37+
GREATEST(b, a) AS greatest_b_a
38+
FROM t1;
39+
--horizontal_results
40+
--disable_metadata
41+
--enable_ps_protocol
42+
CREATE TABLE t2 AS
43+
SELECT
44+
a AS ___________a,
45+
CASE WHEN a IS NOT NULL THEN a END AS case_______a,
46+
CASE WHEN a IS NOT NULL THEN a ELSE a END AS case_____a_a,
47+
COALESCE(a) AS coalesce___a,
48+
COALESCE(a, a) AS coalesce_a_a,
49+
IF(a IS NULL, a, a) AS if_______a_a,
50+
IFNULL(a, a) AS ifnull___a_a,
51+
LEAST(a, a) AS least____a_a,
52+
GREATEST(a, a) AS greatest_a_a,
53+
b AS ___________b,
54+
CASE WHEN a IS NOT NULL THEN b END AS case_______b,
55+
CASE WHEN a IS NOT NULL THEN b ELSE b END AS case_____b_b,
56+
COALESCE(b) AS coalesce___b,
57+
COALESCE(b, b) AS coalesce_b_b,
58+
IF(a IS NULL, b, b) AS if_______b_b,
59+
IFNULL(b, b) AS ifnull___b_b,
60+
LEAST(b, b) AS least____b_b,
61+
GREATEST(b, b) AS greatest_b_b
62+
FROM t1;
63+
SHOW CREATE TABLE t2;
64+
DROP TABLE t2;
65+
CREATE TABLE t2 AS
66+
SELECT
67+
CASE WHEN a IS NOT NULL THEN a ELSE b END AS case_____a_b,
68+
CASE WHEN a IS NOT NULL THEN b ELSE a END AS case_____b_a,
69+
COALESCE(a, b) AS coalesce_a_b,
70+
COALESCE(b, a) AS coalesce_b_a,
71+
IF(a IS NULL, a, b) AS if_______a_b,
72+
IF(a IS NULL, b, a) AS if_______b_a,
73+
IFNULL(a, b) AS ifnull___a_b,
74+
IFNULL(b, a) AS ifnull___b_a,
75+
LEAST(a, b) AS least____a_b,
76+
LEAST(b, a) AS least____b_a,
77+
GREATEST(a, b) AS greatest_a_b,
78+
GREATEST(b, a) AS greatest_b_a
79+
FROM t1;
80+
SHOW CREATE TABLE t2;
81+
DROP TABLE t2;

0 commit comments

Comments
 (0)