From d6f0507d305ef7b34750b1950e1934d8b28e8926 Mon Sep 17 00:00:00 2001 From: cyan-zheng Date: Thu, 25 Jun 2026 16:40:45 +0800 Subject: [PATCH 1/6] HIVE-29059: SHOW CREATE TABLE ignores all strings after tab character for views --- .../create/show/ShowCreateTableOperation.java | 2 +- .../show_create_table_tab_view.q | 46 ++++ .../llap/show_create_table_tab_view.q.out | 223 ++++++++++++++++++ 3 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 ql/src/test/queries/clientpositive/show_create_table_tab_view.q create mode 100644 ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java index 7b8cc1f2ba49..6dec91cb174f 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java @@ -54,7 +54,7 @@ public int execute() throws HiveException { DDLPlanUtils ddlObj = new DDLPlanUtils(); String command; if (table.isView()) { - command = ddlObj.getCreateViewCommand(table, desc.isRelative()); + command = ddlObj.getCreateViewCommand(table, desc.isRelative()).replace("\t", "\\t"); } else { List commands = new ArrayList<>(); commands.add(ddlObj.getCreateTableCommand(table, desc.isRelative())); diff --git a/ql/src/test/queries/clientpositive/show_create_table_tab_view.q b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q new file mode 100644 index 000000000000..fb149f52a29f --- /dev/null +++ b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q @@ -0,0 +1,46 @@ +-- Test SHOW CREATE TABLE when view is expanded text contains a tab (HIVE-29059). +-- IDE may replace tabs with spaces during edit. +-- This test qfile requires actual tabs instead of soft tabs/spaces to function properly + +DROP VIEW IF EXISTS hive_29059_v; +DROP VIEW IF EXISTS hive_29059_v2; +DROP VIEW IF EXISTS hive_29059_v3; +DROP VIEW IF EXISTS hive_29059_v4; +DROP VIEW IF EXISTS hive_29059_v5; +DROP TABLE IF EXISTS hive_29059_src; +CREATE TABLE hive_29059_src (val1 string COMMENT 'val 1', + val2 string COMMENT 'val + 2', + val3 string); +INSERT INTO hive_29059_src VALUES ('a1', 'b1', 'c1'); + +-- Create view from source table with tab in the WHERE clause +CREATE VIEW hive_29059_v AS SELECT * FROM hive_29059_src + WHERE val1 = 'a1' + AND val2 = 'b1'; +SHOW CREATE TABLE hive_29059_v; + +-- Make sure show create table for non-view tables don't break +SHOW CREATE TABLE hive_29059_src; + +-- Create view with TAB in string literal +CREATE VIEW hive_29059_v2 AS SELECT 'before + after' AS col1; +SHOW CREATE TABLE hive_29059_v2; + +CREATE VIEW hive_29059_v3 AS SELECT ' a b c ' AS col1; +SHOW CREATE TABLE hive_29059_v3; + +CREATE VIEW hive_29059_v4 AS SELECT 'a\\tb\tc' AS col1; +SHOW CREATE TABLE hive_29059_v4; + +CREATE VIEW hive_29059_v5 AS SELECT val1 FROM hive_29059_src WHERE val1 LIKE 'a% '; +SHOW CREATE TABLE hive_29059_v5; + + +DROP VIEW IF EXISTS hive_29059_v; +DROP VIEW IF EXISTS hive_29059_v2; +DROP VIEW IF EXISTS hive_29059_v3; +DROP VIEW IF EXISTS hive_29059_v4; +DROP VIEW IF EXISTS hive_29059_v5; +DROP TABLE IF EXISTS hive_29059_src; diff --git a/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out new file mode 100644 index 000000000000..5e089ad9306d --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out @@ -0,0 +1,223 @@ +PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v +PREHOOK: type: DROPVIEW +POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v +POSTHOOK: type: DROPVIEW +PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v2 +PREHOOK: type: DROPVIEW +POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v2 +POSTHOOK: type: DROPVIEW +PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v3 +PREHOOK: type: DROPVIEW +POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v3 +POSTHOOK: type: DROPVIEW +PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v4 +PREHOOK: type: DROPVIEW +POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v4 +POSTHOOK: type: DROPVIEW +PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v5 +PREHOOK: type: DROPVIEW +POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v5 +POSTHOOK: type: DROPVIEW +PREHOOK: query: DROP TABLE IF EXISTS hive_29059_src +PREHOOK: type: DROPTABLE +PREHOOK: Output: database:default +POSTHOOK: query: DROP TABLE IF EXISTS hive_29059_src +POSTHOOK: type: DROPTABLE +POSTHOOK: Output: database:default +PREHOOK: query: CREATE TABLE hive_29059_src (val1 string COMMENT 'val 1', + val2 string COMMENT 'val + 2', + val3 string) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@hive_29059_src +POSTHOOK: query: CREATE TABLE hive_29059_src (val1 string COMMENT 'val 1', + val2 string COMMENT 'val + 2', + val3 string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@hive_29059_src +PREHOOK: query: INSERT INTO hive_29059_src VALUES ('a1', 'b1', 'c1') +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@hive_29059_src +POSTHOOK: query: INSERT INTO hive_29059_src VALUES ('a1', 'b1', 'c1') +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@hive_29059_src +POSTHOOK: Lineage: hive_29059_src.val1 SCRIPT [] +POSTHOOK: Lineage: hive_29059_src.val2 SCRIPT [] +POSTHOOK: Lineage: hive_29059_src.val3 SCRIPT [] +PREHOOK: query: CREATE VIEW hive_29059_v AS SELECT * FROM hive_29059_src + WHERE val1 = 'a1' + AND val2 = 'b1' +PREHOOK: type: CREATEVIEW +PREHOOK: Input: default@hive_29059_src +PREHOOK: Output: database:default +PREHOOK: Output: default@hive_29059_v +POSTHOOK: query: CREATE VIEW hive_29059_v AS SELECT * FROM hive_29059_src + WHERE val1 = 'a1' + AND val2 = 'b1' +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: default@hive_29059_src +POSTHOOK: Output: database:default +POSTHOOK: Output: default@hive_29059_v +POSTHOOK: Lineage: hive_29059_v.val1 SIMPLE [] +POSTHOOK: Lineage: hive_29059_v.val2 SIMPLE [] +POSTHOOK: Lineage: hive_29059_v.val3 SIMPLE [(hive_29059_src)hive_29059_src.FieldSchema(name:val3, type:string, comment:null), ] +PREHOOK: query: SHOW CREATE TABLE hive_29059_v +PREHOOK: type: SHOW_CREATETABLE +PREHOOK: Input: default@hive_29059_v +POSTHOOK: query: SHOW CREATE TABLE hive_29059_v +POSTHOOK: type: SHOW_CREATETABLE +POSTHOOK: Input: default@hive_29059_v +CREATE VIEW `hive_29059_v` AS SELECT `hive_29059_src`.`val1`, `hive_29059_src`.`val2`, `hive_29059_src`.`val3` FROM `default`.`hive_29059_src` +\tWHERE `hive_29059_src`.`val1`\t= 'a1' +\tAND `hive_29059_src`.`val2`\t= 'b1' +PREHOOK: query: SHOW CREATE TABLE hive_29059_src +PREHOOK: type: SHOW_CREATETABLE +PREHOOK: Input: default@hive_29059_src +POSTHOOK: query: SHOW CREATE TABLE hive_29059_src +POSTHOOK: type: SHOW_CREATETABLE +POSTHOOK: Input: default@hive_29059_src +CREATE TABLE `hive_29059_src`( + `val1` string COMMENT 'val\t1', + `val2` string COMMENT 'val\n 2', + `val3` string) +ROW FORMAT SERDE + 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' +STORED AS INPUTFORMAT + 'org.apache.hadoop.mapred.TextInputFormat' +OUTPUTFORMAT + 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' +LOCATION +#### A masked pattern was here #### +TBLPROPERTIES ( + 'bucketing_version'='2', +#### A masked pattern was here #### +PREHOOK: query: CREATE VIEW hive_29059_v2 AS SELECT 'before + after' AS col1 +PREHOOK: type: CREATEVIEW +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: database:default +PREHOOK: Output: default@hive_29059_v2 +POSTHOOK: query: CREATE VIEW hive_29059_v2 AS SELECT 'before + after' AS col1 +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: database:default +POSTHOOK: Output: default@hive_29059_v2 +POSTHOOK: Lineage: hive_29059_v2.col1 SIMPLE [] +PREHOOK: query: SHOW CREATE TABLE hive_29059_v2 +PREHOOK: type: SHOW_CREATETABLE +PREHOOK: Input: default@hive_29059_v2 +POSTHOOK: query: SHOW CREATE TABLE hive_29059_v2 +POSTHOOK: type: SHOW_CREATETABLE +POSTHOOK: Input: default@hive_29059_v2 +CREATE VIEW `hive_29059_v2` AS SELECT 'before +\tafter' AS `col1` +PREHOOK: query: CREATE VIEW hive_29059_v3 AS SELECT ' a b c ' AS col1 +PREHOOK: type: CREATEVIEW +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: database:default +PREHOOK: Output: default@hive_29059_v3 +POSTHOOK: query: CREATE VIEW hive_29059_v3 AS SELECT ' a b c ' AS col1 +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: database:default +POSTHOOK: Output: default@hive_29059_v3 +POSTHOOK: Lineage: hive_29059_v3.col1 SIMPLE [] +PREHOOK: query: SHOW CREATE TABLE hive_29059_v3 +PREHOOK: type: SHOW_CREATETABLE +PREHOOK: Input: default@hive_29059_v3 +POSTHOOK: query: SHOW CREATE TABLE hive_29059_v3 +POSTHOOK: type: SHOW_CREATETABLE +POSTHOOK: Input: default@hive_29059_v3 +CREATE VIEW `hive_29059_v3` AS SELECT '\ta\t\tb \tc\t\t' AS `col1` +PREHOOK: query: CREATE VIEW hive_29059_v4 AS SELECT 'a\\tb\tc' AS col1 +PREHOOK: type: CREATEVIEW +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: database:default +PREHOOK: Output: default@hive_29059_v4 +POSTHOOK: query: CREATE VIEW hive_29059_v4 AS SELECT 'a\\tb\tc' AS col1 +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: database:default +POSTHOOK: Output: default@hive_29059_v4 +POSTHOOK: Lineage: hive_29059_v4.col1 SIMPLE [] +PREHOOK: query: SHOW CREATE TABLE hive_29059_v4 +PREHOOK: type: SHOW_CREATETABLE +PREHOOK: Input: default@hive_29059_v4 +POSTHOOK: query: SHOW CREATE TABLE hive_29059_v4 +POSTHOOK: type: SHOW_CREATETABLE +POSTHOOK: Input: default@hive_29059_v4 +CREATE VIEW `hive_29059_v4` AS SELECT 'a\\tb\tc' AS `col1` +PREHOOK: query: CREATE VIEW hive_29059_v5 AS SELECT val1 FROM hive_29059_src WHERE val1 LIKE 'a% ' +PREHOOK: type: CREATEVIEW +PREHOOK: Input: default@hive_29059_src +PREHOOK: Output: database:default +PREHOOK: Output: default@hive_29059_v5 +POSTHOOK: query: CREATE VIEW hive_29059_v5 AS SELECT val1 FROM hive_29059_src WHERE val1 LIKE 'a% ' +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: default@hive_29059_src +POSTHOOK: Output: database:default +POSTHOOK: Output: default@hive_29059_v5 +POSTHOOK: Lineage: hive_29059_v5.val1 SIMPLE [(hive_29059_src)hive_29059_src.FieldSchema(name:val1, type:string, comment:val 1), ] +PREHOOK: query: SHOW CREATE TABLE hive_29059_v5 +PREHOOK: type: SHOW_CREATETABLE +PREHOOK: Input: default@hive_29059_v5 +POSTHOOK: query: SHOW CREATE TABLE hive_29059_v5 +POSTHOOK: type: SHOW_CREATETABLE +POSTHOOK: Input: default@hive_29059_v5 +CREATE VIEW `hive_29059_v5` AS SELECT `hive_29059_src`.`val1` FROM `default`.`hive_29059_src` WHERE `hive_29059_src`.`val1` LIKE 'a%\t' +PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@hive_29059_v +PREHOOK: Output: default@hive_29059_v +POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@hive_29059_v +POSTHOOK: Output: default@hive_29059_v +PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v2 +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@hive_29059_v2 +PREHOOK: Output: default@hive_29059_v2 +POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v2 +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@hive_29059_v2 +POSTHOOK: Output: default@hive_29059_v2 +PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v3 +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@hive_29059_v3 +PREHOOK: Output: default@hive_29059_v3 +POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v3 +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@hive_29059_v3 +POSTHOOK: Output: default@hive_29059_v3 +PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v4 +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@hive_29059_v4 +PREHOOK: Output: default@hive_29059_v4 +POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v4 +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@hive_29059_v4 +POSTHOOK: Output: default@hive_29059_v4 +PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v5 +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@hive_29059_v5 +PREHOOK: Output: default@hive_29059_v5 +POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v5 +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@hive_29059_v5 +POSTHOOK: Output: default@hive_29059_v5 +PREHOOK: query: DROP TABLE IF EXISTS hive_29059_src +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@hive_29059_src +PREHOOK: Output: database:default +PREHOOK: Output: default@hive_29059_src +POSTHOOK: query: DROP TABLE IF EXISTS hive_29059_src +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@hive_29059_src +POSTHOOK: Output: database:default +POSTHOOK: Output: default@hive_29059_src From 061c16425bb4fe37991639bd5360bcbe78b3c70f Mon Sep 17 00:00:00 2001 From: cyan-zheng Date: Mon, 29 Jun 2026 11:33:44 +1000 Subject: [PATCH 2/6] HIVE-29059: address review feedbacks on show_create_table_tab_view.q testcases --- .../resources/testconfiguration.properties | 1 + .../show_create_table_tab_view.q | 44 +--- .../llap/show_create_table_tab_view.q.out | 226 ++++++------------ 3 files changed, 89 insertions(+), 182 deletions(-) diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties index b4441518a64a..d94f5d99d1b3 100644 --- a/itests/src/test/resources/testconfiguration.properties +++ b/itests/src/test/resources/testconfiguration.properties @@ -177,6 +177,7 @@ minillap.query.files=\ script_pipe.q,\ scriptfile1.q,\ select_transform_hint.q,\ + show_create_table_tab_view.q,\ skip_header_footer_aggr.q,\ skip_header_footer_proj.q,\ str_to_map.q,\ diff --git a/ql/src/test/queries/clientpositive/show_create_table_tab_view.q b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q index fb149f52a29f..5605c05c9476 100644 --- a/ql/src/test/queries/clientpositive/show_create_table_tab_view.q +++ b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q @@ -1,46 +1,28 @@ --- Test SHOW CREATE TABLE when view is expanded text contains a tab (HIVE-29059). --- IDE may replace tabs with spaces during edit. --- This test qfile requires actual tabs instead of soft tabs/spaces to function properly - -DROP VIEW IF EXISTS hive_29059_v; -DROP VIEW IF EXISTS hive_29059_v2; -DROP VIEW IF EXISTS hive_29059_v3; -DROP VIEW IF EXISTS hive_29059_v4; -DROP VIEW IF EXISTS hive_29059_v5; -DROP TABLE IF EXISTS hive_29059_src; -CREATE TABLE hive_29059_src (val1 string COMMENT 'val 1', +CREATE TABLE showcrt_tab_src (val1 string COMMENT 'val 1', val2 string COMMENT 'val 2', val3 string); -INSERT INTO hive_29059_src VALUES ('a1', 'b1', 'c1'); +INSERT INTO showcrt_tab_src VALUES ('a1', 'b1', 'c1'); -- Create view from source table with tab in the WHERE clause -CREATE VIEW hive_29059_v AS SELECT * FROM hive_29059_src +CREATE VIEW showcrt_tab_src_v AS SELECT * FROM showcrt_tab_src WHERE val1 = 'a1' AND val2 = 'b1'; -SHOW CREATE TABLE hive_29059_v; +SHOW CREATE TABLE showcrt_tab_src_v; -- Make sure show create table for non-view tables don't break -SHOW CREATE TABLE hive_29059_src; +SHOW CREATE TABLE showcrt_tab_src; -- Create view with TAB in string literal -CREATE VIEW hive_29059_v2 AS SELECT 'before +CREATE VIEW showcrt_tab_src_v2 AS SELECT 'before after' AS col1; -SHOW CREATE TABLE hive_29059_v2; - -CREATE VIEW hive_29059_v3 AS SELECT ' a b c ' AS col1; -SHOW CREATE TABLE hive_29059_v3; - -CREATE VIEW hive_29059_v4 AS SELECT 'a\\tb\tc' AS col1; -SHOW CREATE TABLE hive_29059_v4; +SHOW CREATE TABLE showcrt_tab_src_v2; -CREATE VIEW hive_29059_v5 AS SELECT val1 FROM hive_29059_src WHERE val1 LIKE 'a% '; -SHOW CREATE TABLE hive_29059_v5; +CREATE VIEW showcrt_tab_src_v3 AS SELECT ' a b c ' AS col1; +SHOW CREATE TABLE showcrt_tab_src_v3; +CREATE VIEW showcrt_tab_src_v4 AS SELECT 'a\\tb\tc' AS col1; +SHOW CREATE TABLE showcrt_tab_src_v4; -DROP VIEW IF EXISTS hive_29059_v; -DROP VIEW IF EXISTS hive_29059_v2; -DROP VIEW IF EXISTS hive_29059_v3; -DROP VIEW IF EXISTS hive_29059_v4; -DROP VIEW IF EXISTS hive_29059_v5; -DROP TABLE IF EXISTS hive_29059_src; +CREATE VIEW showcrt_tab_src_v5 AS SELECT val1 FROM showcrt_tab_src WHERE val1 LIKE 'a% '; +SHOW CREATE TABLE showcrt_tab_src_v5; diff --git a/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out index 5e089ad9306d..df41a147cf17 100644 --- a/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out +++ b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out @@ -1,87 +1,61 @@ -PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v -PREHOOK: type: DROPVIEW -POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v -POSTHOOK: type: DROPVIEW -PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v2 -PREHOOK: type: DROPVIEW -POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v2 -POSTHOOK: type: DROPVIEW -PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v3 -PREHOOK: type: DROPVIEW -POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v3 -POSTHOOK: type: DROPVIEW -PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v4 -PREHOOK: type: DROPVIEW -POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v4 -POSTHOOK: type: DROPVIEW -PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v5 -PREHOOK: type: DROPVIEW -POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v5 -POSTHOOK: type: DROPVIEW -PREHOOK: query: DROP TABLE IF EXISTS hive_29059_src -PREHOOK: type: DROPTABLE -PREHOOK: Output: database:default -POSTHOOK: query: DROP TABLE IF EXISTS hive_29059_src -POSTHOOK: type: DROPTABLE -POSTHOOK: Output: database:default -PREHOOK: query: CREATE TABLE hive_29059_src (val1 string COMMENT 'val 1', +PREHOOK: query: CREATE TABLE showcrt_tab_src (val1 string COMMENT 'val 1', val2 string COMMENT 'val 2', val3 string) PREHOOK: type: CREATETABLE PREHOOK: Output: database:default -PREHOOK: Output: default@hive_29059_src -POSTHOOK: query: CREATE TABLE hive_29059_src (val1 string COMMENT 'val 1', +PREHOOK: Output: default@showcrt_tab_src +POSTHOOK: query: CREATE TABLE showcrt_tab_src (val1 string COMMENT 'val 1', val2 string COMMENT 'val 2', val3 string) POSTHOOK: type: CREATETABLE POSTHOOK: Output: database:default -POSTHOOK: Output: default@hive_29059_src -PREHOOK: query: INSERT INTO hive_29059_src VALUES ('a1', 'b1', 'c1') +POSTHOOK: Output: default@showcrt_tab_src +PREHOOK: query: INSERT INTO showcrt_tab_src VALUES ('a1', 'b1', 'c1') PREHOOK: type: QUERY PREHOOK: Input: _dummy_database@_dummy_table -PREHOOK: Output: default@hive_29059_src -POSTHOOK: query: INSERT INTO hive_29059_src VALUES ('a1', 'b1', 'c1') +PREHOOK: Output: default@showcrt_tab_src +POSTHOOK: query: INSERT INTO showcrt_tab_src VALUES ('a1', 'b1', 'c1') POSTHOOK: type: QUERY POSTHOOK: Input: _dummy_database@_dummy_table -POSTHOOK: Output: default@hive_29059_src -POSTHOOK: Lineage: hive_29059_src.val1 SCRIPT [] -POSTHOOK: Lineage: hive_29059_src.val2 SCRIPT [] -POSTHOOK: Lineage: hive_29059_src.val3 SCRIPT [] -PREHOOK: query: CREATE VIEW hive_29059_v AS SELECT * FROM hive_29059_src +POSTHOOK: Output: default@showcrt_tab_src +POSTHOOK: Lineage: showcrt_tab_src.val1 SCRIPT [] +POSTHOOK: Lineage: showcrt_tab_src.val2 SCRIPT [] +POSTHOOK: Lineage: showcrt_tab_src.val3 SCRIPT [] +PREHOOK: query: CREATE VIEW showcrt_tab_src_v AS SELECT * FROM showcrt_tab_src WHERE val1 = 'a1' AND val2 = 'b1' PREHOOK: type: CREATEVIEW -PREHOOK: Input: default@hive_29059_src +PREHOOK: Input: default@showcrt_tab_src PREHOOK: Output: database:default -PREHOOK: Output: default@hive_29059_v -POSTHOOK: query: CREATE VIEW hive_29059_v AS SELECT * FROM hive_29059_src +PREHOOK: Output: default@showcrt_tab_src_v +POSTHOOK: query: CREATE VIEW showcrt_tab_src_v AS SELECT * FROM showcrt_tab_src WHERE val1 = 'a1' AND val2 = 'b1' POSTHOOK: type: CREATEVIEW -POSTHOOK: Input: default@hive_29059_src +POSTHOOK: Input: default@showcrt_tab_src POSTHOOK: Output: database:default -POSTHOOK: Output: default@hive_29059_v -POSTHOOK: Lineage: hive_29059_v.val1 SIMPLE [] -POSTHOOK: Lineage: hive_29059_v.val2 SIMPLE [] -POSTHOOK: Lineage: hive_29059_v.val3 SIMPLE [(hive_29059_src)hive_29059_src.FieldSchema(name:val3, type:string, comment:null), ] -PREHOOK: query: SHOW CREATE TABLE hive_29059_v +POSTHOOK: Output: default@showcrt_tab_src_v +POSTHOOK: Lineage: showcrt_tab_src_v.val1 SIMPLE [] +POSTHOOK: Lineage: showcrt_tab_src_v.val2 SIMPLE [] +POSTHOOK: Lineage: showcrt_tab_src_v.val3 SIMPLE [(showcrt_tab_src)showcrt_tab_src.FieldSchema(name:val3, type:string, comment:null), ] +PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v PREHOOK: type: SHOW_CREATETABLE -PREHOOK: Input: default@hive_29059_v -POSTHOOK: query: SHOW CREATE TABLE hive_29059_v +PREHOOK: Input: default@showcrt_tab_src_v +POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v POSTHOOK: type: SHOW_CREATETABLE -POSTHOOK: Input: default@hive_29059_v -CREATE VIEW `hive_29059_v` AS SELECT `hive_29059_src`.`val1`, `hive_29059_src`.`val2`, `hive_29059_src`.`val3` FROM `default`.`hive_29059_src` -\tWHERE `hive_29059_src`.`val1`\t= 'a1' -\tAND `hive_29059_src`.`val2`\t= 'b1' -PREHOOK: query: SHOW CREATE TABLE hive_29059_src +POSTHOOK: Input: default@showcrt_tab_src_v +CREATE VIEW `showcrt_tab_src_v` AS SELECT `showcrt_tab_src`.`val1`, `showcrt_tab_src`.`val2`, `showcrt_tab_src`.`val3` FROM `default`.`showcrt_tab_src` +\tWHERE `showcrt_tab_src`.`val1`\t= 'a1' +\tAND `showcrt_tab_src`.`val2`\t= 'b1' +PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src PREHOOK: type: SHOW_CREATETABLE -PREHOOK: Input: default@hive_29059_src -POSTHOOK: query: SHOW CREATE TABLE hive_29059_src +PREHOOK: Input: default@showcrt_tab_src +POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src POSTHOOK: type: SHOW_CREATETABLE -POSTHOOK: Input: default@hive_29059_src -CREATE TABLE `hive_29059_src`( +POSTHOOK: Input: default@showcrt_tab_src +CREATE TABLE `showcrt_tab_src`( `val1` string COMMENT 'val\t1', `val2` string COMMENT 'val\n 2', `val3` string) @@ -92,132 +66,82 @@ STORED AS INPUTFORMAT OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION -#### A masked pattern was here #### + 'hdfs://### HDFS PATH ###' TBLPROPERTIES ( 'bucketing_version'='2', #### A masked pattern was here #### -PREHOOK: query: CREATE VIEW hive_29059_v2 AS SELECT 'before +PREHOOK: query: CREATE VIEW showcrt_tab_src_v2 AS SELECT 'before after' AS col1 PREHOOK: type: CREATEVIEW PREHOOK: Input: _dummy_database@_dummy_table PREHOOK: Output: database:default -PREHOOK: Output: default@hive_29059_v2 -POSTHOOK: query: CREATE VIEW hive_29059_v2 AS SELECT 'before +PREHOOK: Output: default@showcrt_tab_src_v2 +POSTHOOK: query: CREATE VIEW showcrt_tab_src_v2 AS SELECT 'before after' AS col1 POSTHOOK: type: CREATEVIEW POSTHOOK: Input: _dummy_database@_dummy_table POSTHOOK: Output: database:default -POSTHOOK: Output: default@hive_29059_v2 -POSTHOOK: Lineage: hive_29059_v2.col1 SIMPLE [] -PREHOOK: query: SHOW CREATE TABLE hive_29059_v2 +POSTHOOK: Output: default@showcrt_tab_src_v2 +POSTHOOK: Lineage: showcrt_tab_src_v2.col1 SIMPLE [] +PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v2 PREHOOK: type: SHOW_CREATETABLE -PREHOOK: Input: default@hive_29059_v2 -POSTHOOK: query: SHOW CREATE TABLE hive_29059_v2 +PREHOOK: Input: default@showcrt_tab_src_v2 +POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v2 POSTHOOK: type: SHOW_CREATETABLE -POSTHOOK: Input: default@hive_29059_v2 -CREATE VIEW `hive_29059_v2` AS SELECT 'before +POSTHOOK: Input: default@showcrt_tab_src_v2 +CREATE VIEW `showcrt_tab_src_v2` AS SELECT 'before \tafter' AS `col1` -PREHOOK: query: CREATE VIEW hive_29059_v3 AS SELECT ' a b c ' AS col1 +PREHOOK: query: CREATE VIEW showcrt_tab_src_v3 AS SELECT ' a b c ' AS col1 PREHOOK: type: CREATEVIEW PREHOOK: Input: _dummy_database@_dummy_table PREHOOK: Output: database:default -PREHOOK: Output: default@hive_29059_v3 -POSTHOOK: query: CREATE VIEW hive_29059_v3 AS SELECT ' a b c ' AS col1 +PREHOOK: Output: default@showcrt_tab_src_v3 +POSTHOOK: query: CREATE VIEW showcrt_tab_src_v3 AS SELECT ' a b c ' AS col1 POSTHOOK: type: CREATEVIEW POSTHOOK: Input: _dummy_database@_dummy_table POSTHOOK: Output: database:default -POSTHOOK: Output: default@hive_29059_v3 -POSTHOOK: Lineage: hive_29059_v3.col1 SIMPLE [] -PREHOOK: query: SHOW CREATE TABLE hive_29059_v3 +POSTHOOK: Output: default@showcrt_tab_src_v3 +POSTHOOK: Lineage: showcrt_tab_src_v3.col1 SIMPLE [] +PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v3 PREHOOK: type: SHOW_CREATETABLE -PREHOOK: Input: default@hive_29059_v3 -POSTHOOK: query: SHOW CREATE TABLE hive_29059_v3 +PREHOOK: Input: default@showcrt_tab_src_v3 +POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v3 POSTHOOK: type: SHOW_CREATETABLE -POSTHOOK: Input: default@hive_29059_v3 -CREATE VIEW `hive_29059_v3` AS SELECT '\ta\t\tb \tc\t\t' AS `col1` -PREHOOK: query: CREATE VIEW hive_29059_v4 AS SELECT 'a\\tb\tc' AS col1 +POSTHOOK: Input: default@showcrt_tab_src_v3 +CREATE VIEW `showcrt_tab_src_v3` AS SELECT '\ta\t\tb \tc\t\t' AS `col1` +PREHOOK: query: CREATE VIEW showcrt_tab_src_v4 AS SELECT 'a\\tb\tc' AS col1 PREHOOK: type: CREATEVIEW PREHOOK: Input: _dummy_database@_dummy_table PREHOOK: Output: database:default -PREHOOK: Output: default@hive_29059_v4 -POSTHOOK: query: CREATE VIEW hive_29059_v4 AS SELECT 'a\\tb\tc' AS col1 +PREHOOK: Output: default@showcrt_tab_src_v4 +POSTHOOK: query: CREATE VIEW showcrt_tab_src_v4 AS SELECT 'a\\tb\tc' AS col1 POSTHOOK: type: CREATEVIEW POSTHOOK: Input: _dummy_database@_dummy_table POSTHOOK: Output: database:default -POSTHOOK: Output: default@hive_29059_v4 -POSTHOOK: Lineage: hive_29059_v4.col1 SIMPLE [] -PREHOOK: query: SHOW CREATE TABLE hive_29059_v4 +POSTHOOK: Output: default@showcrt_tab_src_v4 +POSTHOOK: Lineage: showcrt_tab_src_v4.col1 SIMPLE [] +PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v4 PREHOOK: type: SHOW_CREATETABLE -PREHOOK: Input: default@hive_29059_v4 -POSTHOOK: query: SHOW CREATE TABLE hive_29059_v4 +PREHOOK: Input: default@showcrt_tab_src_v4 +POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v4 POSTHOOK: type: SHOW_CREATETABLE -POSTHOOK: Input: default@hive_29059_v4 -CREATE VIEW `hive_29059_v4` AS SELECT 'a\\tb\tc' AS `col1` -PREHOOK: query: CREATE VIEW hive_29059_v5 AS SELECT val1 FROM hive_29059_src WHERE val1 LIKE 'a% ' +POSTHOOK: Input: default@showcrt_tab_src_v4 +CREATE VIEW `showcrt_tab_src_v4` AS SELECT 'a\\tb\tc' AS `col1` +PREHOOK: query: CREATE VIEW showcrt_tab_src_v5 AS SELECT val1 FROM showcrt_tab_src WHERE val1 LIKE 'a% ' PREHOOK: type: CREATEVIEW -PREHOOK: Input: default@hive_29059_src +PREHOOK: Input: default@showcrt_tab_src PREHOOK: Output: database:default -PREHOOK: Output: default@hive_29059_v5 -POSTHOOK: query: CREATE VIEW hive_29059_v5 AS SELECT val1 FROM hive_29059_src WHERE val1 LIKE 'a% ' +PREHOOK: Output: default@showcrt_tab_src_v5 +POSTHOOK: query: CREATE VIEW showcrt_tab_src_v5 AS SELECT val1 FROM showcrt_tab_src WHERE val1 LIKE 'a% ' POSTHOOK: type: CREATEVIEW -POSTHOOK: Input: default@hive_29059_src +POSTHOOK: Input: default@showcrt_tab_src POSTHOOK: Output: database:default -POSTHOOK: Output: default@hive_29059_v5 -POSTHOOK: Lineage: hive_29059_v5.val1 SIMPLE [(hive_29059_src)hive_29059_src.FieldSchema(name:val1, type:string, comment:val 1), ] -PREHOOK: query: SHOW CREATE TABLE hive_29059_v5 +POSTHOOK: Output: default@showcrt_tab_src_v5 +POSTHOOK: Lineage: showcrt_tab_src_v5.val1 SIMPLE [(showcrt_tab_src)showcrt_tab_src.FieldSchema(name:val1, type:string, comment:val 1), ] +PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v5 PREHOOK: type: SHOW_CREATETABLE -PREHOOK: Input: default@hive_29059_v5 -POSTHOOK: query: SHOW CREATE TABLE hive_29059_v5 +PREHOOK: Input: default@showcrt_tab_src_v5 +POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v5 POSTHOOK: type: SHOW_CREATETABLE -POSTHOOK: Input: default@hive_29059_v5 -CREATE VIEW `hive_29059_v5` AS SELECT `hive_29059_src`.`val1` FROM `default`.`hive_29059_src` WHERE `hive_29059_src`.`val1` LIKE 'a%\t' -PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v -PREHOOK: type: DROPVIEW -PREHOOK: Input: default@hive_29059_v -PREHOOK: Output: default@hive_29059_v -POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v -POSTHOOK: type: DROPVIEW -POSTHOOK: Input: default@hive_29059_v -POSTHOOK: Output: default@hive_29059_v -PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v2 -PREHOOK: type: DROPVIEW -PREHOOK: Input: default@hive_29059_v2 -PREHOOK: Output: default@hive_29059_v2 -POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v2 -POSTHOOK: type: DROPVIEW -POSTHOOK: Input: default@hive_29059_v2 -POSTHOOK: Output: default@hive_29059_v2 -PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v3 -PREHOOK: type: DROPVIEW -PREHOOK: Input: default@hive_29059_v3 -PREHOOK: Output: default@hive_29059_v3 -POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v3 -POSTHOOK: type: DROPVIEW -POSTHOOK: Input: default@hive_29059_v3 -POSTHOOK: Output: default@hive_29059_v3 -PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v4 -PREHOOK: type: DROPVIEW -PREHOOK: Input: default@hive_29059_v4 -PREHOOK: Output: default@hive_29059_v4 -POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v4 -POSTHOOK: type: DROPVIEW -POSTHOOK: Input: default@hive_29059_v4 -POSTHOOK: Output: default@hive_29059_v4 -PREHOOK: query: DROP VIEW IF EXISTS hive_29059_v5 -PREHOOK: type: DROPVIEW -PREHOOK: Input: default@hive_29059_v5 -PREHOOK: Output: default@hive_29059_v5 -POSTHOOK: query: DROP VIEW IF EXISTS hive_29059_v5 -POSTHOOK: type: DROPVIEW -POSTHOOK: Input: default@hive_29059_v5 -POSTHOOK: Output: default@hive_29059_v5 -PREHOOK: query: DROP TABLE IF EXISTS hive_29059_src -PREHOOK: type: DROPTABLE -PREHOOK: Input: default@hive_29059_src -PREHOOK: Output: database:default -PREHOOK: Output: default@hive_29059_src -POSTHOOK: query: DROP TABLE IF EXISTS hive_29059_src -POSTHOOK: type: DROPTABLE -POSTHOOK: Input: default@hive_29059_src -POSTHOOK: Output: database:default -POSTHOOK: Output: default@hive_29059_src +POSTHOOK: Input: default@showcrt_tab_src_v5 +CREATE VIEW `showcrt_tab_src_v5` AS SELECT `showcrt_tab_src`.`val1` FROM `default`.`showcrt_tab_src` WHERE `showcrt_tab_src`.`val1` LIKE 'a%\t' From ce7d3f281905990579a79a1c48ef172bf6439601 Mon Sep 17 00:00:00 2001 From: cyan-zheng Date: Mon, 29 Jun 2026 13:08:59 +1000 Subject: [PATCH 3/6] removed test file from testconfiguration.properties --- itests/src/test/resources/testconfiguration.properties | 1 - .../clientpositive/llap/show_create_table_tab_view.q.out | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties index ca84411dd0d7..bfefc3b5f023 100644 --- a/itests/src/test/resources/testconfiguration.properties +++ b/itests/src/test/resources/testconfiguration.properties @@ -177,7 +177,6 @@ minillap.query.files=\ script_pipe.q,\ scriptfile1.q,\ select_transform_hint.q,\ - show_create_table_tab_view.q,\ skip_header_footer_aggr.q,\ skip_header_footer_proj.q,\ str_to_map.q,\ diff --git a/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out index df41a147cf17..b34b935d113c 100644 --- a/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out +++ b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out @@ -66,7 +66,7 @@ STORED AS INPUTFORMAT OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION - 'hdfs://### HDFS PATH ###' +#### A masked pattern was here #### TBLPROPERTIES ( 'bucketing_version'='2', #### A masked pattern was here #### From 85562819c451301ee996f43208a188e9321a63c9 Mon Sep 17 00:00:00 2001 From: cyan-zheng Date: Tue, 30 Jun 2026 17:53:56 +1000 Subject: [PATCH 4/6] HIVE-29059: revised implementation of replacing tabs in string literals with \t and outside string literals with space, updated associated tests --- .../create/show/ShowCreateTableOperation.java | 37 ++++++++++++- .../show_create_table_tab_view.q | 11 +++- .../llap/show_create_table_tab_view.q.out | 52 ++++++++++++++++--- 3 files changed, 91 insertions(+), 9 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java index 6dec91cb174f..6a46151ad1ba 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java @@ -54,7 +54,7 @@ public int execute() throws HiveException { DDLPlanUtils ddlObj = new DDLPlanUtils(); String command; if (table.isView()) { - command = ddlObj.getCreateViewCommand(table, desc.isRelative()).replace("\t", "\\t"); + command = escapeSqlTabs(ddlObj.getCreateViewCommand(table, desc.isRelative())); } else { List commands = new ArrayList<>(); commands.add(ddlObj.getCreateTableCommand(table, desc.isRelative())); @@ -74,4 +74,39 @@ public int execute() throws HiveException { throw new HiveException(e); } } + + private static String escapeSqlTabs(String sql) { + if (sql == null || sql.indexOf('\t') < 0) { + return sql; + } + StringBuilder result = new StringBuilder(sql.length()); + char quote = 0; + for (int i = 0; i < sql.length(); i++) { + char c = sql.charAt(i); + if (quote == 0) { // outside string literal + if (c == '\'' || c == '"') { + quote = c; + result.append(c); + } else if (c == '\t') { + result.append(' '); + } else { + result.append(c); + } + } else { // inside string literal + if (c == '\\' && i + 1 < sql.length()) { + result.append(c); + result.append(sql.charAt(i + 1)); + i++; + } else if (c == quote) { + quote = 0; + result.append(c); + } else if (c == '\t') { + result.append("\\t"); + } else { + result.append(c); + } + } + } + return result.toString(); + } } diff --git a/ql/src/test/queries/clientpositive/show_create_table_tab_view.q b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q index 5605c05c9476..06c4fb25abac 100644 --- a/ql/src/test/queries/clientpositive/show_create_table_tab_view.q +++ b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q @@ -2,14 +2,17 @@ CREATE TABLE showcrt_tab_src (val1 string COMMENT 'val 1', val2 string COMMENT 'val 2', val3 string); -INSERT INTO showcrt_tab_src VALUES ('a1', 'b1', 'c1'); +INSERT INTO showcrt_tab_src VALUES ('a1 ', 'b1', 'c1'); -- Create view from source table with tab in the WHERE clause CREATE VIEW showcrt_tab_src_v AS SELECT * FROM showcrt_tab_src - WHERE val1 = 'a1' + WHERE val1 = 'a1 ' AND val2 = 'b1'; SHOW CREATE TABLE showcrt_tab_src_v; +-- Pattern matching with tabs still need to return correct results +SELECT * FROM showcrt_tab_src_v; + -- Make sure show create table for non-view tables don't break SHOW CREATE TABLE showcrt_tab_src; @@ -26,3 +29,7 @@ SHOW CREATE TABLE showcrt_tab_src_v4; CREATE VIEW showcrt_tab_src_v5 AS SELECT val1 FROM showcrt_tab_src WHERE val1 LIKE 'a% '; SHOW CREATE TABLE showcrt_tab_src_v5; + +CREATE VIEW showcrt_tab_src_v6 AS SELECT "Nested 'string with tab' "; +SHOW CREATE TABLE showcrt_tab_src_v6; +SELECT * FROM showcrt_tab_src_v6; diff --git a/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out index b34b935d113c..30e4b0aefff7 100644 --- a/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out +++ b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out @@ -12,11 +12,11 @@ POSTHOOK: query: CREATE TABLE showcrt_tab_src (val1 string COMMENT 'val 1', POSTHOOK: type: CREATETABLE POSTHOOK: Output: database:default POSTHOOK: Output: default@showcrt_tab_src -PREHOOK: query: INSERT INTO showcrt_tab_src VALUES ('a1', 'b1', 'c1') +PREHOOK: query: INSERT INTO showcrt_tab_src VALUES ('a1 ', 'b1', 'c1') PREHOOK: type: QUERY PREHOOK: Input: _dummy_database@_dummy_table PREHOOK: Output: default@showcrt_tab_src -POSTHOOK: query: INSERT INTO showcrt_tab_src VALUES ('a1', 'b1', 'c1') +POSTHOOK: query: INSERT INTO showcrt_tab_src VALUES ('a1 ', 'b1', 'c1') POSTHOOK: type: QUERY POSTHOOK: Input: _dummy_database@_dummy_table POSTHOOK: Output: default@showcrt_tab_src @@ -24,14 +24,14 @@ POSTHOOK: Lineage: showcrt_tab_src.val1 SCRIPT [] POSTHOOK: Lineage: showcrt_tab_src.val2 SCRIPT [] POSTHOOK: Lineage: showcrt_tab_src.val3 SCRIPT [] PREHOOK: query: CREATE VIEW showcrt_tab_src_v AS SELECT * FROM showcrt_tab_src - WHERE val1 = 'a1' + WHERE val1 = 'a1 ' AND val2 = 'b1' PREHOOK: type: CREATEVIEW PREHOOK: Input: default@showcrt_tab_src PREHOOK: Output: database:default PREHOOK: Output: default@showcrt_tab_src_v POSTHOOK: query: CREATE VIEW showcrt_tab_src_v AS SELECT * FROM showcrt_tab_src - WHERE val1 = 'a1' + WHERE val1 = 'a1 ' AND val2 = 'b1' POSTHOOK: type: CREATEVIEW POSTHOOK: Input: default@showcrt_tab_src @@ -47,8 +47,19 @@ POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v POSTHOOK: type: SHOW_CREATETABLE POSTHOOK: Input: default@showcrt_tab_src_v CREATE VIEW `showcrt_tab_src_v` AS SELECT `showcrt_tab_src`.`val1`, `showcrt_tab_src`.`val2`, `showcrt_tab_src`.`val3` FROM `default`.`showcrt_tab_src` -\tWHERE `showcrt_tab_src`.`val1`\t= 'a1' -\tAND `showcrt_tab_src`.`val2`\t= 'b1' + WHERE `showcrt_tab_src`.`val1` = 'a1\t' + AND `showcrt_tab_src`.`val2` = 'b1' +PREHOOK: query: SELECT * FROM showcrt_tab_src_v +PREHOOK: type: QUERY +PREHOOK: Input: default@showcrt_tab_src +PREHOOK: Input: default@showcrt_tab_src_v +#### A masked pattern was here #### +POSTHOOK: query: SELECT * FROM showcrt_tab_src_v +POSTHOOK: type: QUERY +POSTHOOK: Input: default@showcrt_tab_src +POSTHOOK: Input: default@showcrt_tab_src_v +#### A masked pattern was here #### +a1 b1 c1 PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src PREHOOK: type: SHOW_CREATETABLE PREHOOK: Input: default@showcrt_tab_src @@ -145,3 +156,32 @@ POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v5 POSTHOOK: type: SHOW_CREATETABLE POSTHOOK: Input: default@showcrt_tab_src_v5 CREATE VIEW `showcrt_tab_src_v5` AS SELECT `showcrt_tab_src`.`val1` FROM `default`.`showcrt_tab_src` WHERE `showcrt_tab_src`.`val1` LIKE 'a%\t' +PREHOOK: query: CREATE VIEW showcrt_tab_src_v6 AS SELECT "Nested 'string with tab' " +PREHOOK: type: CREATEVIEW +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: database:default +PREHOOK: Output: default@showcrt_tab_src_v6 +POSTHOOK: query: CREATE VIEW showcrt_tab_src_v6 AS SELECT "Nested 'string with tab' " +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: database:default +POSTHOOK: Output: default@showcrt_tab_src_v6 +POSTHOOK: Lineage: showcrt_tab_src_v6._c0 SIMPLE [] +PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v6 +PREHOOK: type: SHOW_CREATETABLE +PREHOOK: Input: default@showcrt_tab_src_v6 +POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v6 +POSTHOOK: type: SHOW_CREATETABLE +POSTHOOK: Input: default@showcrt_tab_src_v6 +CREATE VIEW `showcrt_tab_src_v6` AS SELECT "Nested\t'string\twith\ttab' " +PREHOOK: query: SELECT * FROM showcrt_tab_src_v6 +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Input: default@showcrt_tab_src_v6 +#### A masked pattern was here #### +POSTHOOK: query: SELECT * FROM showcrt_tab_src_v6 +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Input: default@showcrt_tab_src_v6 +#### A masked pattern was here #### +Nested 'string with tab' From b4c98ab2e11436d01e4224d94c6df279697dbd69 Mon Sep 17 00:00:00 2001 From: cyan-zheng Date: Wed, 1 Jul 2026 18:57:35 +1000 Subject: [PATCH 5/6] HIVE-29059: Fix truncation after tab in show create table by configuring fetch task with SERIALIZATION_LAST_COLUMN_TAKES_REST --- .../create/show/ShowCreateTableAnalyzer.java | 3 +- .../create/show/ShowCreateTableOperation.java | 37 +--------- .../hive/ql/parse/BaseSemanticAnalyzer.java | 13 ++++ .../show_create_table_tab_view.q | 9 +++ .../llap/show_create_table_tab_view.q.out | 67 +++++++++++++++++-- 5 files changed, 86 insertions(+), 43 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java index 02007578027b..036a4a15c1c7 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java @@ -61,6 +61,7 @@ public void analyzeInternal(ASTNode root) throws SemanticException { rootTasks.add(task); task.setFetchSource(true); - setFetchTask(createFetchTask(ShowCreateTableDesc.SCHEMA)); + // CREATE statements may contain literal tab characters in identifiers or string literals. + setFetchTask(createFetchTask(ShowCreateTableDesc.SCHEMA, true)); } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java index 6a46151ad1ba..7b8cc1f2ba49 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java @@ -54,7 +54,7 @@ public int execute() throws HiveException { DDLPlanUtils ddlObj = new DDLPlanUtils(); String command; if (table.isView()) { - command = escapeSqlTabs(ddlObj.getCreateViewCommand(table, desc.isRelative())); + command = ddlObj.getCreateViewCommand(table, desc.isRelative()); } else { List commands = new ArrayList<>(); commands.add(ddlObj.getCreateTableCommand(table, desc.isRelative())); @@ -74,39 +74,4 @@ public int execute() throws HiveException { throw new HiveException(e); } } - - private static String escapeSqlTabs(String sql) { - if (sql == null || sql.indexOf('\t') < 0) { - return sql; - } - StringBuilder result = new StringBuilder(sql.length()); - char quote = 0; - for (int i = 0; i < sql.length(); i++) { - char c = sql.charAt(i); - if (quote == 0) { // outside string literal - if (c == '\'' || c == '"') { - quote = c; - result.append(c); - } else if (c == '\t') { - result.append(' '); - } else { - result.append(c); - } - } else { // inside string literal - if (c == '\\' && i + 1 < sql.length()) { - result.append(c); - result.append(sql.charAt(i + 1)); - i++; - } else if (c == quote) { - quote = 0; - result.append(c); - } else if (c == '\t') { - result.append("\\t"); - } else { - result.append(c); - } - } - } - return result.toString(); - } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java index f616049d8591..d5e340e6acee 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java @@ -2044,6 +2044,16 @@ public QueryState getQueryState() { * Create a FetchTask for a given schema. */ protected FetchTask createFetchTask(String tableSchema) { + return createFetchTask(tableSchema, false); + } + + /** + * Create a FetchTask for a given schema. + * + * @param lastColumn when true, the last column consumes the remainder of the line. + * Use for fetch results that may contain literal tab characters (e.g. SHOW CREATE TABLE). + */ + protected FetchTask createFetchTask(String tableSchema, boolean lastColumn) { String schema = "json".equals(conf.get(HiveConf.ConfVars.HIVE_DDL_OUTPUT_FORMAT.varname, "text")) ? "json#string" : tableSchema; @@ -2051,6 +2061,9 @@ protected FetchTask createFetchTask(String tableSchema) { // Sets delimiter to tab (ascii 9) prop.setProperty(serdeConstants.SERIALIZATION_FORMAT, Integer.toString(Utilities.tabCode)); prop.setProperty(serdeConstants.SERIALIZATION_NULL_FORMAT, " "); + if (lastColumn) { + prop.setProperty(serdeConstants.SERIALIZATION_LAST_COLUMN_TAKES_REST, "true"); + } String[] colTypes = schema.split("#"); prop.setProperty(serdeConstants.LIST_COLUMNS, colTypes[0]); prop.setProperty(serdeConstants.LIST_COLUMN_TYPES, colTypes[1]); diff --git a/ql/src/test/queries/clientpositive/show_create_table_tab_view.q b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q index 06c4fb25abac..469f5ab840fe 100644 --- a/ql/src/test/queries/clientpositive/show_create_table_tab_view.q +++ b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q @@ -33,3 +33,12 @@ SHOW CREATE TABLE showcrt_tab_src_v5; CREATE VIEW showcrt_tab_src_v6 AS SELECT "Nested 'string with tab' "; SHOW CREATE TABLE showcrt_tab_src_v6; SELECT * FROM showcrt_tab_src_v6; + +-- Test for tabs within ` identifiers +CREATE TABLE showcrt_tab_src2 (`col with tab` string); +INSERT INTO showcrt_tab_src2 VALUES ('a1'); +SELECT * FROM showcrt_tab_src2 WHERE `col with tab` = 'a1'; + +CREATE VIEW showcrt_tab_src_v7 AS SELECT `col with tab` FROM showcrt_tab_src2 WHERE `col with tab` = 'a1'; +SHOW CREATE TABLE showcrt_tab_src_v7; +SELECT * FROM showcrt_tab_src_v7; \ No newline at end of file diff --git a/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out index 30e4b0aefff7..ab5648249e9c 100644 --- a/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out +++ b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out @@ -47,8 +47,8 @@ POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v POSTHOOK: type: SHOW_CREATETABLE POSTHOOK: Input: default@showcrt_tab_src_v CREATE VIEW `showcrt_tab_src_v` AS SELECT `showcrt_tab_src`.`val1`, `showcrt_tab_src`.`val2`, `showcrt_tab_src`.`val3` FROM `default`.`showcrt_tab_src` - WHERE `showcrt_tab_src`.`val1` = 'a1\t' - AND `showcrt_tab_src`.`val2` = 'b1' + WHERE `showcrt_tab_src`.`val1` = 'a1 ' + AND `showcrt_tab_src`.`val2` = 'b1' PREHOOK: query: SELECT * FROM showcrt_tab_src_v PREHOOK: type: QUERY PREHOOK: Input: default@showcrt_tab_src @@ -101,7 +101,7 @@ POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v2 POSTHOOK: type: SHOW_CREATETABLE POSTHOOK: Input: default@showcrt_tab_src_v2 CREATE VIEW `showcrt_tab_src_v2` AS SELECT 'before -\tafter' AS `col1` + after' AS `col1` PREHOOK: query: CREATE VIEW showcrt_tab_src_v3 AS SELECT ' a b c ' AS col1 PREHOOK: type: CREATEVIEW PREHOOK: Input: _dummy_database@_dummy_table @@ -119,7 +119,7 @@ PREHOOK: Input: default@showcrt_tab_src_v3 POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v3 POSTHOOK: type: SHOW_CREATETABLE POSTHOOK: Input: default@showcrt_tab_src_v3 -CREATE VIEW `showcrt_tab_src_v3` AS SELECT '\ta\t\tb \tc\t\t' AS `col1` +CREATE VIEW `showcrt_tab_src_v3` AS SELECT ' a b c ' AS `col1` PREHOOK: query: CREATE VIEW showcrt_tab_src_v4 AS SELECT 'a\\tb\tc' AS col1 PREHOOK: type: CREATEVIEW PREHOOK: Input: _dummy_database@_dummy_table @@ -155,7 +155,7 @@ PREHOOK: Input: default@showcrt_tab_src_v5 POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v5 POSTHOOK: type: SHOW_CREATETABLE POSTHOOK: Input: default@showcrt_tab_src_v5 -CREATE VIEW `showcrt_tab_src_v5` AS SELECT `showcrt_tab_src`.`val1` FROM `default`.`showcrt_tab_src` WHERE `showcrt_tab_src`.`val1` LIKE 'a%\t' +CREATE VIEW `showcrt_tab_src_v5` AS SELECT `showcrt_tab_src`.`val1` FROM `default`.`showcrt_tab_src` WHERE `showcrt_tab_src`.`val1` LIKE 'a% ' PREHOOK: query: CREATE VIEW showcrt_tab_src_v6 AS SELECT "Nested 'string with tab' " PREHOOK: type: CREATEVIEW PREHOOK: Input: _dummy_database@_dummy_table @@ -173,7 +173,7 @@ PREHOOK: Input: default@showcrt_tab_src_v6 POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v6 POSTHOOK: type: SHOW_CREATETABLE POSTHOOK: Input: default@showcrt_tab_src_v6 -CREATE VIEW `showcrt_tab_src_v6` AS SELECT "Nested\t'string\twith\ttab' " +CREATE VIEW `showcrt_tab_src_v6` AS SELECT "Nested 'string with tab' " PREHOOK: query: SELECT * FROM showcrt_tab_src_v6 PREHOOK: type: QUERY PREHOOK: Input: _dummy_database@_dummy_table @@ -185,3 +185,58 @@ POSTHOOK: Input: _dummy_database@_dummy_table POSTHOOK: Input: default@showcrt_tab_src_v6 #### A masked pattern was here #### Nested 'string with tab' +PREHOOK: query: CREATE TABLE showcrt_tab_src2 (`col with tab` string) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@showcrt_tab_src2 +POSTHOOK: query: CREATE TABLE showcrt_tab_src2 (`col with tab` string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@showcrt_tab_src2 +PREHOOK: query: INSERT INTO showcrt_tab_src2 VALUES ('a1') +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@showcrt_tab_src2 +POSTHOOK: query: INSERT INTO showcrt_tab_src2 VALUES ('a1') +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@showcrt_tab_src2 +POSTHOOK: Lineage: showcrt_tab_src2.col with tab SCRIPT [] +PREHOOK: query: SELECT * FROM showcrt_tab_src2 WHERE `col with tab` = 'a1' +PREHOOK: type: QUERY +PREHOOK: Input: default@showcrt_tab_src2 +#### A masked pattern was here #### +POSTHOOK: query: SELECT * FROM showcrt_tab_src2 WHERE `col with tab` = 'a1' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@showcrt_tab_src2 +#### A masked pattern was here #### +a1 +PREHOOK: query: CREATE VIEW showcrt_tab_src_v7 AS SELECT `col with tab` FROM showcrt_tab_src2 WHERE `col with tab` = 'a1' +PREHOOK: type: CREATEVIEW +PREHOOK: Input: default@showcrt_tab_src2 +PREHOOK: Output: database:default +PREHOOK: Output: default@showcrt_tab_src_v7 +POSTHOOK: query: CREATE VIEW showcrt_tab_src_v7 AS SELECT `col with tab` FROM showcrt_tab_src2 WHERE `col with tab` = 'a1' +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: default@showcrt_tab_src2 +POSTHOOK: Output: database:default +POSTHOOK: Output: default@showcrt_tab_src_v7 +POSTHOOK: Lineage: showcrt_tab_src_v7.col with tab SIMPLE [] +PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v7 +PREHOOK: type: SHOW_CREATETABLE +PREHOOK: Input: default@showcrt_tab_src_v7 +POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v7 +POSTHOOK: type: SHOW_CREATETABLE +POSTHOOK: Input: default@showcrt_tab_src_v7 +CREATE VIEW `showcrt_tab_src_v7` AS SELECT `showcrt_tab_src2`.`col with tab` FROM `default`.`showcrt_tab_src2` WHERE `showcrt_tab_src2`.`col with tab` = 'a1' +PREHOOK: query: SELECT * FROM showcrt_tab_src_v7 +PREHOOK: type: QUERY +PREHOOK: Input: default@showcrt_tab_src2 +PREHOOK: Input: default@showcrt_tab_src_v7 +#### A masked pattern was here #### +POSTHOOK: query: SELECT * FROM showcrt_tab_src_v7 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@showcrt_tab_src2 +POSTHOOK: Input: default@showcrt_tab_src_v7 +#### A masked pattern was here #### +a1 From 70864d068886fcfbe3ed8f47f9313a8b9b1c3c0b Mon Sep 17 00:00:00 2001 From: cyan-zheng Date: Wed, 1 Jul 2026 19:00:20 +1000 Subject: [PATCH 6/6] minor formatting change --- .../apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java | 6 +++--- .../queries/clientpositive/show_create_table_tab_view.q | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java index d5e340e6acee..8f763b4857c8 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java @@ -2050,10 +2050,10 @@ protected FetchTask createFetchTask(String tableSchema) { /** * Create a FetchTask for a given schema. * - * @param lastColumn when true, the last column consumes the remainder of the line. + * @param lastColumnTakesRest when true, the last column consumes the remainder of the line. * Use for fetch results that may contain literal tab characters (e.g. SHOW CREATE TABLE). */ - protected FetchTask createFetchTask(String tableSchema, boolean lastColumn) { + protected FetchTask createFetchTask(String tableSchema, boolean lastColumnTakesRest) { String schema = "json".equals(conf.get(HiveConf.ConfVars.HIVE_DDL_OUTPUT_FORMAT.varname, "text")) ? "json#string" : tableSchema; @@ -2061,7 +2061,7 @@ protected FetchTask createFetchTask(String tableSchema, boolean lastColumn) { // Sets delimiter to tab (ascii 9) prop.setProperty(serdeConstants.SERIALIZATION_FORMAT, Integer.toString(Utilities.tabCode)); prop.setProperty(serdeConstants.SERIALIZATION_NULL_FORMAT, " "); - if (lastColumn) { + if (lastColumnTakesRest) { prop.setProperty(serdeConstants.SERIALIZATION_LAST_COLUMN_TAKES_REST, "true"); } String[] colTypes = schema.split("#"); diff --git a/ql/src/test/queries/clientpositive/show_create_table_tab_view.q b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q index 469f5ab840fe..fd26ace3c241 100644 --- a/ql/src/test/queries/clientpositive/show_create_table_tab_view.q +++ b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q @@ -41,4 +41,4 @@ SELECT * FROM showcrt_tab_src2 WHERE `col with tab` = 'a1'; CREATE VIEW showcrt_tab_src_v7 AS SELECT `col with tab` FROM showcrt_tab_src2 WHERE `col with tab` = 'a1'; SHOW CREATE TABLE showcrt_tab_src_v7; -SELECT * FROM showcrt_tab_src_v7; \ No newline at end of file +SELECT * FROM showcrt_tab_src_v7;