Files
impala/testdata/workloads/functional-query/queries/QueryTest/insert-unsafe.test
Peter Rozsa a570ee866e IMPALA-10173: (Addendum) Fix substitution for unsafe expressions, column-level compatibility check
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>
2023-07-27 20:49:07 +00:00

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";
====