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

Reply via email to