From db164ed9c4e0767145bd762384ed7c77b75543cf Mon Sep 17 00:00:00 2001 From: srlch <111035020+srlch@users.noreply.github.com> Date: Fri, 11 Oct 2024 19:23:24 +0800 Subject: [PATCH] [BugFix] Fix analyzer exception for generated column rewrite (#51755) Signed-off-by: srlch (cherry picked from commit f02fabf12002f49d702f20623bac79eadba522ab) --- .../starrocks/sql/analyzer/QueryAnalyzer.java | 12 +++-- .../R/test_generated_column_rewrite | 48 +++++++++++++++++++ .../T/test_generated_column_rewrite | 38 +++++++++++++++ 3 files changed, 94 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java b/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java index b7dac95b89a1d..fe65323c60c1e 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java +++ b/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java @@ -193,19 +193,23 @@ private void reAnalyzeExpressionBasedOnCurrentScope(SelectRelation childSelectRe } // 3. analyze generated column expression based on current scope + Map analyzedGeneratedExprToColumnRef = new HashMap<>(); for (Map.Entry entry : generatedExprToColumnRef.entrySet()) { entry.getKey().reset(); entry.getValue().reset(); - + try { ExpressionAnalyzer.analyzeExpression(entry.getKey(), new AnalyzeState(), scope, session); ExpressionAnalyzer.analyzeExpression(entry.getValue(), new AnalyzeState(), scope, session); } catch (Exception ignore) { - // ignore generated column rewrite if hit any exception - generatedExprToColumnRef.clear(); + // skip this generated column rewrite if hit any exception + // some exception is reasonable because some of illegal generated column + // rewrite will be rejected by ananlyzer exception. + continue; } + analyzedGeneratedExprToColumnRef.put(entry.getKey(), entry.getValue()); } - resultGeneratedExprToColumnRef.putAll(generatedExprToColumnRef); + resultGeneratedExprToColumnRef.putAll(analyzedGeneratedExprToColumnRef); } @Override diff --git a/test/sql/test_materialized_column/R/test_generated_column_rewrite b/test/sql/test_materialized_column/R/test_generated_column_rewrite index 95a0b2ba2613d..0f76fb99137ec 100644 --- a/test/sql/test_materialized_column/R/test_generated_column_rewrite +++ b/test/sql/test_materialized_column/R/test_generated_column_rewrite @@ -242,4 +242,52 @@ None -- !result DROP table t_generated_column_complex_rewrite_3; -- result: +-- !result +CREATE TABLE `t_generated_column_complex_rewrite_4` ( + `pday` int(11) NOT NULL COMMENT "" +) ENGINE=OLAP +PRIMARY KEY(`pday`) +PARTITION BY (`pday`) +DISTRIBUTED BY HASH(`pday`) +PROPERTIES ( +"compression" = "LZ4", +"enable_persistent_index" = "true", +"fast_schema_evolution" = "true", +"replicated_storage" = "true", +"replication_num" = "1" +); +-- result: +-- !result +CREATE TABLE `t_generated_column_complex_rewrite_5` ( + `id` bigint(20) NOT NULL COMMENT "", + `json_string` varchar(1048576) NOT NULL COMMENT "", + `col1` varchar(65533) NULL AS get_json_string(`json_string`, 'a') COMMENT "", + `col2` varchar(65533) NULL AS get_json_string(`json_string`, 'b') COMMENT "" +) ENGINE=OLAP +PRIMARY KEY(`id`) +DISTRIBUTED BY HASH(`id`) +PROPERTIES ( +"compression" = "LZ4", +"enable_persistent_index" = "true", +"fast_schema_evolution" = "true", +"replicated_storage" = "true", +"replication_num" = "1" +); +-- result: +-- !result +INSERT INTO t_generated_column_complex_rewrite_4 values (1); +-- result: +-- !result +INSERT INTO t_generated_column_complex_rewrite_5 values (1,"{\"a\" : \"b\"}"); +-- result: +-- !result +select * from (select t4.* from t_generated_column_complex_rewrite_4 as t4 left join t_generated_column_complex_rewrite_5 as t5 on t4.pday = t5.id) result; +-- result: +1 +-- !result +DROP TABLE t_generated_column_complex_rewrite_4; +-- result: +-- !result +DROP TABLE t_generated_column_complex_rewrite_5; +-- result: -- !result \ No newline at end of file diff --git a/test/sql/test_materialized_column/T/test_generated_column_rewrite b/test/sql/test_materialized_column/T/test_generated_column_rewrite index 14f92e4a9193f..7e76e806ce32e 100644 --- a/test/sql/test_materialized_column/T/test_generated_column_rewrite +++ b/test/sql/test_materialized_column/T/test_generated_column_rewrite @@ -110,3 +110,41 @@ PROPERTIES ( INSERT INTO t_generated_column_complex_rewrite_3 VALUES (1); function: assert_explain_contains('SELECT COUNT(*) FROM t_generated_column_complex_rewrite_3 WHERE cast(id + 10 as string) IS NOT NULL', 'col') DROP table t_generated_column_complex_rewrite_3; + +CREATE TABLE `t_generated_column_complex_rewrite_4` ( + `pday` int(11) NOT NULL COMMENT "" +) ENGINE=OLAP +PRIMARY KEY(`pday`) +PARTITION BY (`pday`) +DISTRIBUTED BY HASH(`pday`) +PROPERTIES ( +"compression" = "LZ4", +"enable_persistent_index" = "true", +"fast_schema_evolution" = "true", +"replicated_storage" = "true", +"replication_num" = "1" +); + +CREATE TABLE `t_generated_column_complex_rewrite_5` ( + `id` bigint(20) NOT NULL COMMENT "", + `json_string` varchar(1048576) NOT NULL COMMENT "", + `col1` varchar(65533) NULL AS get_json_string(`json_string`, 'a') COMMENT "", + `col2` varchar(65533) NULL AS get_json_string(`json_string`, 'b') COMMENT "" +) ENGINE=OLAP +PRIMARY KEY(`id`) +DISTRIBUTED BY HASH(`id`) +PROPERTIES ( +"compression" = "LZ4", +"enable_persistent_index" = "true", +"fast_schema_evolution" = "true", +"replicated_storage" = "true", +"replication_num" = "1" +); + +INSERT INTO t_generated_column_complex_rewrite_4 values (1); +INSERT INTO t_generated_column_complex_rewrite_5 values (1,"{\"a\" : \"b\"}"); + +select * from (select t4.* from t_generated_column_complex_rewrite_4 as t4 left join t_generated_column_complex_rewrite_5 as t5 on t4.pday = t5.id) result; + +DROP TABLE t_generated_column_complex_rewrite_4; +DROP TABLE t_generated_column_complex_rewrite_5;