mirror of
https://github.com/apache/impala.git
synced 2026-02-01 21:00:29 -05:00
Expression substitution recreates cast expressions without considering the compatibility level introduced by IMPALA-10173. In unsafe mode, the recreation causes IllegalStateException. This change fixes this behavior by storing the compatibility level in each CastExpr, and reusing it when the expression substitution recreates the cast expression. For example: 'select "1", "1" union select 1, "1"' Also, Set operation's common type calculations did not distinguish compatibility levels for each column slot, if one column slot's common type was considered unsafe, every other slot was treated as unsafe. This change fixes this behavior by reinitializing the compatibility level for every column slot, enabling cases where one column slot contains unsafely casted constant values and another contains non-constant expressions with regular casts. These queries failed before this change with 'Unsafe implicit cast is prohibited for non-const expression' error. For example: 'select "1", 1 union select 1, int_col from unsafe_insert' Tests: - test cases added to insert-unsafe.test Change-Id: I39d13f177482f74ec39570118adab609444c6929 Reviewed-on: http://gerrit.cloudera.org:8080/20184 Reviewed-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com> Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
225 lines
7.4 KiB
Plaintext
225 lines
7.4 KiB
Plaintext
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select 1.0 union select int_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: int_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select 1 union select int_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: int_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select int_col from unsafe_insert union select 1;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: int_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select 1 union select string_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: string_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select 1 union select 2;
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select 1;
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) values (10.0);
|
|
---- CATCH
|
|
AnalysisException: Target table '$DATABASE.unsafe_insert' is incompatible with source expressions.
|
|
Expression '10.0' (type: DECIMAL(3,1)) is not compatible with column 'string_col' (type: STRING)
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) values (100), (1000), (1000.0);
|
|
---- CATCH
|
|
AnalysisException: Target table '$DATABASE.unsafe_insert' is incompatible with source expressions.
|
|
Expression '100' (type: DECIMAL(6,1)) is not compatible with column 'string_col' (type: STRING)
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) values (cast(100 as TINYINT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) values (cast(100 as SMALLINT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) values (cast(100 as FLOAT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) values (cast(100 as DOUBLE));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) values (cast(100 as INT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) values (cast(100 as BIGINT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(varchar_col) values (cast(100 as TINYINT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(varchar_col) values (cast(100 as SMALLINT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(varchar_col) values (cast(100 as FLOAT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(varchar_col) values (cast(100 as DOUBLE));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(varchar_col) values (cast(100 as INT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(varchar_col) values (cast(100 as BIGINT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(char_col) values (cast(100 as TINYINT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(char_col) values (cast(100 as SMALLINT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(char_col) values (cast(100 as FLOAT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(char_col) values (cast(100 as DOUBLE));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(char_col) values (cast(100 as INT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(char_col) values (cast(100 as BIGINT));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(float_col) values ("100");
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(bigint_col) values ("100");
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(smallint_col) values ("100");
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(tinyint_col) values ("100");
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(int_col) values ("100");
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(double_col) values ("100");
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(float_col) values (cast("100" as VARCHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(bigint_col) values (cast("100" as VARCHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(smallint_col) values (cast("100" as VARCHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(tinyint_col) values (cast("100" as VARCHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(int_col) values (cast("100" as VARCHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(double_col) values (cast("100" as VARCHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(float_col) values (cast("100" as CHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(bigint_col) values (cast("100" as CHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(smallint_col) values (cast("100" as CHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(tinyint_col) values (cast("100" as CHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(int_col) values (cast("100" as CHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(double_col) values (cast("100" as CHAR(10)));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(char_col) values (cast("100" as STRING));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(varchar_col) values (cast("100" as STRING));
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(float_col) values ("100"), (15629);
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(bigint_col) select string_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: string_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select smallint_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: smallint_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(tinyint_col) select string_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: string_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select tinyint_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: tinyint_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select int_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: int_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(int_col) select string_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: string_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(smallint_col) select string_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: string_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(float_col) select string_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: string_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select double_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: double_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select bigint_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: bigint_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(string_col) select float_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: float_col
|
|
====
|
|
---- QUERY
|
|
INSERT INTO unsafe_insert(double_col) select string_col from unsafe_insert;
|
|
---- CATCH
|
|
AnalysisException: Unsafe implicit cast is prohibited for non-const expression: string_col
|
|
====
|
|
---- QUERY
|
|
# Mixing unsafe and regular compatibility on column level, unsafe union between 1 and "1"
|
|
# regular union between column 'string_col' and "100".
|
|
INSERT INTO unsafe_insert(int_col, string_col) select 1, string_col from unsafe_insert union select "1", "100";
|
|
====
|
|
---- QUERY
|
|
# Regression test for expression substitution on unsafe casts.
|
|
INSERT INTO unsafe_insert(int_col, string_col) select "1", "1" from unsafe_insert union select 1, "1";
|
|
==== |