This is an automated email from the ASF dual-hosted git repository.
ayushtkn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new bdde46e2e56 HIVE-29059: SHOW CREATE TABLE ignores all strings after
tab character for VIEWs (#6563)
bdde46e2e56 is described below
commit bdde46e2e5691614e3bb017c1a19185c8a2351c4
Author: cyanzheng2926 <[email protected]>
AuthorDate: Fri Jul 3 14:28:39 2026 +1000
HIVE-29059: SHOW CREATE TABLE ignores all strings after tab character for
VIEWs (#6563)
---
.../table/create/show/ShowCreateTableAnalyzer.java | 3 +-
.../hadoop/hive/ql/parse/BaseSemanticAnalyzer.java | 13 ++
.../clientpositive/show_create_table_tab_view.q | 44 ++++
.../llap/show_create_table_tab_view.q.out | 242 +++++++++++++++++++++
4 files changed, 301 insertions(+), 1 deletion(-)
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 02007578027..036a4a15c1c 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/parse/BaseSemanticAnalyzer.java
b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
index f616049d859..8f763b4857c 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 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
lastColumnTakesRest) {
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 (lastColumnTakesRest) {
+ 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
new file mode 100644
index 00000000000..fd26ace3c24
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/show_create_table_tab_view.q
@@ -0,0 +1,44 @@
+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');
+
+-- 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 '
+ 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;
+
+-- Create view with TAB in string literal
+CREATE VIEW showcrt_tab_src_v2 AS SELECT 'before
+ after' AS col1;
+SHOW CREATE TABLE showcrt_tab_src_v2;
+
+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;
+
+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;
+
+-- 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;
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 00000000000..ab5648249e9
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/show_create_table_tab_view.q.out
@@ -0,0 +1,242 @@
+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@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@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@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@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@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 '
+ AND val2 = 'b1'
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: default@showcrt_tab_src
+POSTHOOK: Output: database:default
+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@showcrt_tab_src_v
+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 '
+ 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
+POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src
+POSTHOOK: type: SHOW_CREATETABLE
+POSTHOOK: Input: default@showcrt_tab_src
+CREATE TABLE `showcrt_tab_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 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@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@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@showcrt_tab_src_v2
+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
+ 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
+PREHOOK: Output: database:default
+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@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@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 ' 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
+PREHOOK: Output: database:default
+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@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@showcrt_tab_src_v4
+POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v4
+POSTHOOK: type: SHOW_CREATETABLE
+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@showcrt_tab_src
+PREHOOK: Output: database:default
+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@showcrt_tab_src
+POSTHOOK: Output: database:default
+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@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% '
+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 'string with tab' "
+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'
+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