Skip to content

Commit bdde46e

Browse files
HIVE-29059: SHOW CREATE TABLE ignores all strings after tab character for VIEWs (#6563)
1 parent ada3134 commit bdde46e

4 files changed

Lines changed: 301 additions & 1 deletion

File tree

ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public void analyzeInternal(ASTNode root) throws SemanticException {
6161
rootTasks.add(task);
6262

6363
task.setFetchSource(true);
64-
setFetchTask(createFetchTask(ShowCreateTableDesc.SCHEMA));
64+
// CREATE statements may contain literal tab characters in identifiers or string literals.
65+
setFetchTask(createFetchTask(ShowCreateTableDesc.SCHEMA, true));
6566
}
6667
}

ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2044,13 +2044,26 @@ public QueryState getQueryState() {
20442044
* Create a FetchTask for a given schema.
20452045
*/
20462046
protected FetchTask createFetchTask(String tableSchema) {
2047+
return createFetchTask(tableSchema, false);
2048+
}
2049+
2050+
/**
2051+
* Create a FetchTask for a given schema.
2052+
*
2053+
* @param lastColumnTakesRest when true, the last column consumes the remainder of the line.
2054+
* Use for fetch results that may contain literal tab characters (e.g. SHOW CREATE TABLE).
2055+
*/
2056+
protected FetchTask createFetchTask(String tableSchema, boolean lastColumnTakesRest) {
20472057
String schema =
20482058
"json".equals(conf.get(HiveConf.ConfVars.HIVE_DDL_OUTPUT_FORMAT.varname, "text")) ? "json#string" : tableSchema;
20492059

20502060
Properties prop = new Properties();
20512061
// Sets delimiter to tab (ascii 9)
20522062
prop.setProperty(serdeConstants.SERIALIZATION_FORMAT, Integer.toString(Utilities.tabCode));
20532063
prop.setProperty(serdeConstants.SERIALIZATION_NULL_FORMAT, " ");
2064+
if (lastColumnTakesRest) {
2065+
prop.setProperty(serdeConstants.SERIALIZATION_LAST_COLUMN_TAKES_REST, "true");
2066+
}
20542067
String[] colTypes = schema.split("#");
20552068
prop.setProperty(serdeConstants.LIST_COLUMNS, colTypes[0]);
20562069
prop.setProperty(serdeConstants.LIST_COLUMN_TYPES, colTypes[1]);
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
CREATE TABLE showcrt_tab_src (val1 string COMMENT 'val 1',
2+
val2 string COMMENT 'val
3+
2',
4+
val3 string);
5+
INSERT INTO showcrt_tab_src VALUES ('a1 ', 'b1', 'c1');
6+
7+
-- Create view from source table with tab in the WHERE clause
8+
CREATE VIEW showcrt_tab_src_v AS SELECT * FROM showcrt_tab_src
9+
WHERE val1 = 'a1 '
10+
AND val2 = 'b1';
11+
SHOW CREATE TABLE showcrt_tab_src_v;
12+
13+
-- Pattern matching with tabs still need to return correct results
14+
SELECT * FROM showcrt_tab_src_v;
15+
16+
-- Make sure show create table for non-view tables don't break
17+
SHOW CREATE TABLE showcrt_tab_src;
18+
19+
-- Create view with TAB in string literal
20+
CREATE VIEW showcrt_tab_src_v2 AS SELECT 'before
21+
after' AS col1;
22+
SHOW CREATE TABLE showcrt_tab_src_v2;
23+
24+
CREATE VIEW showcrt_tab_src_v3 AS SELECT ' a b c ' AS col1;
25+
SHOW CREATE TABLE showcrt_tab_src_v3;
26+
27+
CREATE VIEW showcrt_tab_src_v4 AS SELECT 'a\\tb\tc' AS col1;
28+
SHOW CREATE TABLE showcrt_tab_src_v4;
29+
30+
CREATE VIEW showcrt_tab_src_v5 AS SELECT val1 FROM showcrt_tab_src WHERE val1 LIKE 'a% ';
31+
SHOW CREATE TABLE showcrt_tab_src_v5;
32+
33+
CREATE VIEW showcrt_tab_src_v6 AS SELECT "Nested 'string with tab' ";
34+
SHOW CREATE TABLE showcrt_tab_src_v6;
35+
SELECT * FROM showcrt_tab_src_v6;
36+
37+
-- Test for tabs within ` identifiers
38+
CREATE TABLE showcrt_tab_src2 (`col with tab` string);
39+
INSERT INTO showcrt_tab_src2 VALUES ('a1');
40+
SELECT * FROM showcrt_tab_src2 WHERE `col with tab` = 'a1';
41+
42+
CREATE VIEW showcrt_tab_src_v7 AS SELECT `col with tab` FROM showcrt_tab_src2 WHERE `col with tab` = 'a1';
43+
SHOW CREATE TABLE showcrt_tab_src_v7;
44+
SELECT * FROM showcrt_tab_src_v7;
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
PREHOOK: query: CREATE TABLE showcrt_tab_src (val1 string COMMENT 'val 1',
2+
val2 string COMMENT 'val
3+
2',
4+
val3 string)
5+
PREHOOK: type: CREATETABLE
6+
PREHOOK: Output: database:default
7+
PREHOOK: Output: default@showcrt_tab_src
8+
POSTHOOK: query: CREATE TABLE showcrt_tab_src (val1 string COMMENT 'val 1',
9+
val2 string COMMENT 'val
10+
2',
11+
val3 string)
12+
POSTHOOK: type: CREATETABLE
13+
POSTHOOK: Output: database:default
14+
POSTHOOK: Output: default@showcrt_tab_src
15+
PREHOOK: query: INSERT INTO showcrt_tab_src VALUES ('a1 ', 'b1', 'c1')
16+
PREHOOK: type: QUERY
17+
PREHOOK: Input: _dummy_database@_dummy_table
18+
PREHOOK: Output: default@showcrt_tab_src
19+
POSTHOOK: query: INSERT INTO showcrt_tab_src VALUES ('a1 ', 'b1', 'c1')
20+
POSTHOOK: type: QUERY
21+
POSTHOOK: Input: _dummy_database@_dummy_table
22+
POSTHOOK: Output: default@showcrt_tab_src
23+
POSTHOOK: Lineage: showcrt_tab_src.val1 SCRIPT []
24+
POSTHOOK: Lineage: showcrt_tab_src.val2 SCRIPT []
25+
POSTHOOK: Lineage: showcrt_tab_src.val3 SCRIPT []
26+
PREHOOK: query: CREATE VIEW showcrt_tab_src_v AS SELECT * FROM showcrt_tab_src
27+
WHERE val1 = 'a1 '
28+
AND val2 = 'b1'
29+
PREHOOK: type: CREATEVIEW
30+
PREHOOK: Input: default@showcrt_tab_src
31+
PREHOOK: Output: database:default
32+
PREHOOK: Output: default@showcrt_tab_src_v
33+
POSTHOOK: query: CREATE VIEW showcrt_tab_src_v AS SELECT * FROM showcrt_tab_src
34+
WHERE val1 = 'a1 '
35+
AND val2 = 'b1'
36+
POSTHOOK: type: CREATEVIEW
37+
POSTHOOK: Input: default@showcrt_tab_src
38+
POSTHOOK: Output: database:default
39+
POSTHOOK: Output: default@showcrt_tab_src_v
40+
POSTHOOK: Lineage: showcrt_tab_src_v.val1 SIMPLE []
41+
POSTHOOK: Lineage: showcrt_tab_src_v.val2 SIMPLE []
42+
POSTHOOK: Lineage: showcrt_tab_src_v.val3 SIMPLE [(showcrt_tab_src)showcrt_tab_src.FieldSchema(name:val3, type:string, comment:null), ]
43+
PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v
44+
PREHOOK: type: SHOW_CREATETABLE
45+
PREHOOK: Input: default@showcrt_tab_src_v
46+
POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v
47+
POSTHOOK: type: SHOW_CREATETABLE
48+
POSTHOOK: Input: default@showcrt_tab_src_v
49+
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`
50+
WHERE `showcrt_tab_src`.`val1` = 'a1 '
51+
AND `showcrt_tab_src`.`val2` = 'b1'
52+
PREHOOK: query: SELECT * FROM showcrt_tab_src_v
53+
PREHOOK: type: QUERY
54+
PREHOOK: Input: default@showcrt_tab_src
55+
PREHOOK: Input: default@showcrt_tab_src_v
56+
#### A masked pattern was here ####
57+
POSTHOOK: query: SELECT * FROM showcrt_tab_src_v
58+
POSTHOOK: type: QUERY
59+
POSTHOOK: Input: default@showcrt_tab_src
60+
POSTHOOK: Input: default@showcrt_tab_src_v
61+
#### A masked pattern was here ####
62+
a1 b1 c1
63+
PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src
64+
PREHOOK: type: SHOW_CREATETABLE
65+
PREHOOK: Input: default@showcrt_tab_src
66+
POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src
67+
POSTHOOK: type: SHOW_CREATETABLE
68+
POSTHOOK: Input: default@showcrt_tab_src
69+
CREATE TABLE `showcrt_tab_src`(
70+
`val1` string COMMENT 'val\t1',
71+
`val2` string COMMENT 'val\n 2',
72+
`val3` string)
73+
ROW FORMAT SERDE
74+
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
75+
STORED AS INPUTFORMAT
76+
'org.apache.hadoop.mapred.TextInputFormat'
77+
OUTPUTFORMAT
78+
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
79+
LOCATION
80+
#### A masked pattern was here ####
81+
TBLPROPERTIES (
82+
'bucketing_version'='2',
83+
#### A masked pattern was here ####
84+
PREHOOK: query: CREATE VIEW showcrt_tab_src_v2 AS SELECT 'before
85+
after' AS col1
86+
PREHOOK: type: CREATEVIEW
87+
PREHOOK: Input: _dummy_database@_dummy_table
88+
PREHOOK: Output: database:default
89+
PREHOOK: Output: default@showcrt_tab_src_v2
90+
POSTHOOK: query: CREATE VIEW showcrt_tab_src_v2 AS SELECT 'before
91+
after' AS col1
92+
POSTHOOK: type: CREATEVIEW
93+
POSTHOOK: Input: _dummy_database@_dummy_table
94+
POSTHOOK: Output: database:default
95+
POSTHOOK: Output: default@showcrt_tab_src_v2
96+
POSTHOOK: Lineage: showcrt_tab_src_v2.col1 SIMPLE []
97+
PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v2
98+
PREHOOK: type: SHOW_CREATETABLE
99+
PREHOOK: Input: default@showcrt_tab_src_v2
100+
POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v2
101+
POSTHOOK: type: SHOW_CREATETABLE
102+
POSTHOOK: Input: default@showcrt_tab_src_v2
103+
CREATE VIEW `showcrt_tab_src_v2` AS SELECT 'before
104+
after' AS `col1`
105+
PREHOOK: query: CREATE VIEW showcrt_tab_src_v3 AS SELECT ' a b c ' AS col1
106+
PREHOOK: type: CREATEVIEW
107+
PREHOOK: Input: _dummy_database@_dummy_table
108+
PREHOOK: Output: database:default
109+
PREHOOK: Output: default@showcrt_tab_src_v3
110+
POSTHOOK: query: CREATE VIEW showcrt_tab_src_v3 AS SELECT ' a b c ' AS col1
111+
POSTHOOK: type: CREATEVIEW
112+
POSTHOOK: Input: _dummy_database@_dummy_table
113+
POSTHOOK: Output: database:default
114+
POSTHOOK: Output: default@showcrt_tab_src_v3
115+
POSTHOOK: Lineage: showcrt_tab_src_v3.col1 SIMPLE []
116+
PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v3
117+
PREHOOK: type: SHOW_CREATETABLE
118+
PREHOOK: Input: default@showcrt_tab_src_v3
119+
POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v3
120+
POSTHOOK: type: SHOW_CREATETABLE
121+
POSTHOOK: Input: default@showcrt_tab_src_v3
122+
CREATE VIEW `showcrt_tab_src_v3` AS SELECT ' a b c ' AS `col1`
123+
PREHOOK: query: CREATE VIEW showcrt_tab_src_v4 AS SELECT 'a\\tb\tc' AS col1
124+
PREHOOK: type: CREATEVIEW
125+
PREHOOK: Input: _dummy_database@_dummy_table
126+
PREHOOK: Output: database:default
127+
PREHOOK: Output: default@showcrt_tab_src_v4
128+
POSTHOOK: query: CREATE VIEW showcrt_tab_src_v4 AS SELECT 'a\\tb\tc' AS col1
129+
POSTHOOK: type: CREATEVIEW
130+
POSTHOOK: Input: _dummy_database@_dummy_table
131+
POSTHOOK: Output: database:default
132+
POSTHOOK: Output: default@showcrt_tab_src_v4
133+
POSTHOOK: Lineage: showcrt_tab_src_v4.col1 SIMPLE []
134+
PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v4
135+
PREHOOK: type: SHOW_CREATETABLE
136+
PREHOOK: Input: default@showcrt_tab_src_v4
137+
POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v4
138+
POSTHOOK: type: SHOW_CREATETABLE
139+
POSTHOOK: Input: default@showcrt_tab_src_v4
140+
CREATE VIEW `showcrt_tab_src_v4` AS SELECT 'a\\tb\tc' AS `col1`
141+
PREHOOK: query: CREATE VIEW showcrt_tab_src_v5 AS SELECT val1 FROM showcrt_tab_src WHERE val1 LIKE 'a% '
142+
PREHOOK: type: CREATEVIEW
143+
PREHOOK: Input: default@showcrt_tab_src
144+
PREHOOK: Output: database:default
145+
PREHOOK: Output: default@showcrt_tab_src_v5
146+
POSTHOOK: query: CREATE VIEW showcrt_tab_src_v5 AS SELECT val1 FROM showcrt_tab_src WHERE val1 LIKE 'a% '
147+
POSTHOOK: type: CREATEVIEW
148+
POSTHOOK: Input: default@showcrt_tab_src
149+
POSTHOOK: Output: database:default
150+
POSTHOOK: Output: default@showcrt_tab_src_v5
151+
POSTHOOK: Lineage: showcrt_tab_src_v5.val1 SIMPLE [(showcrt_tab_src)showcrt_tab_src.FieldSchema(name:val1, type:string, comment:val 1), ]
152+
PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v5
153+
PREHOOK: type: SHOW_CREATETABLE
154+
PREHOOK: Input: default@showcrt_tab_src_v5
155+
POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v5
156+
POSTHOOK: type: SHOW_CREATETABLE
157+
POSTHOOK: Input: default@showcrt_tab_src_v5
158+
CREATE VIEW `showcrt_tab_src_v5` AS SELECT `showcrt_tab_src`.`val1` FROM `default`.`showcrt_tab_src` WHERE `showcrt_tab_src`.`val1` LIKE 'a% '
159+
PREHOOK: query: CREATE VIEW showcrt_tab_src_v6 AS SELECT "Nested 'string with tab' "
160+
PREHOOK: type: CREATEVIEW
161+
PREHOOK: Input: _dummy_database@_dummy_table
162+
PREHOOK: Output: database:default
163+
PREHOOK: Output: default@showcrt_tab_src_v6
164+
POSTHOOK: query: CREATE VIEW showcrt_tab_src_v6 AS SELECT "Nested 'string with tab' "
165+
POSTHOOK: type: CREATEVIEW
166+
POSTHOOK: Input: _dummy_database@_dummy_table
167+
POSTHOOK: Output: database:default
168+
POSTHOOK: Output: default@showcrt_tab_src_v6
169+
POSTHOOK: Lineage: showcrt_tab_src_v6._c0 SIMPLE []
170+
PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v6
171+
PREHOOK: type: SHOW_CREATETABLE
172+
PREHOOK: Input: default@showcrt_tab_src_v6
173+
POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v6
174+
POSTHOOK: type: SHOW_CREATETABLE
175+
POSTHOOK: Input: default@showcrt_tab_src_v6
176+
CREATE VIEW `showcrt_tab_src_v6` AS SELECT "Nested 'string with tab' "
177+
PREHOOK: query: SELECT * FROM showcrt_tab_src_v6
178+
PREHOOK: type: QUERY
179+
PREHOOK: Input: _dummy_database@_dummy_table
180+
PREHOOK: Input: default@showcrt_tab_src_v6
181+
#### A masked pattern was here ####
182+
POSTHOOK: query: SELECT * FROM showcrt_tab_src_v6
183+
POSTHOOK: type: QUERY
184+
POSTHOOK: Input: _dummy_database@_dummy_table
185+
POSTHOOK: Input: default@showcrt_tab_src_v6
186+
#### A masked pattern was here ####
187+
Nested 'string with tab'
188+
PREHOOK: query: CREATE TABLE showcrt_tab_src2 (`col with tab` string)
189+
PREHOOK: type: CREATETABLE
190+
PREHOOK: Output: database:default
191+
PREHOOK: Output: default@showcrt_tab_src2
192+
POSTHOOK: query: CREATE TABLE showcrt_tab_src2 (`col with tab` string)
193+
POSTHOOK: type: CREATETABLE
194+
POSTHOOK: Output: database:default
195+
POSTHOOK: Output: default@showcrt_tab_src2
196+
PREHOOK: query: INSERT INTO showcrt_tab_src2 VALUES ('a1')
197+
PREHOOK: type: QUERY
198+
PREHOOK: Input: _dummy_database@_dummy_table
199+
PREHOOK: Output: default@showcrt_tab_src2
200+
POSTHOOK: query: INSERT INTO showcrt_tab_src2 VALUES ('a1')
201+
POSTHOOK: type: QUERY
202+
POSTHOOK: Input: _dummy_database@_dummy_table
203+
POSTHOOK: Output: default@showcrt_tab_src2
204+
POSTHOOK: Lineage: showcrt_tab_src2.col with tab SCRIPT []
205+
PREHOOK: query: SELECT * FROM showcrt_tab_src2 WHERE `col with tab` = 'a1'
206+
PREHOOK: type: QUERY
207+
PREHOOK: Input: default@showcrt_tab_src2
208+
#### A masked pattern was here ####
209+
POSTHOOK: query: SELECT * FROM showcrt_tab_src2 WHERE `col with tab` = 'a1'
210+
POSTHOOK: type: QUERY
211+
POSTHOOK: Input: default@showcrt_tab_src2
212+
#### A masked pattern was here ####
213+
a1
214+
PREHOOK: query: CREATE VIEW showcrt_tab_src_v7 AS SELECT `col with tab` FROM showcrt_tab_src2 WHERE `col with tab` = 'a1'
215+
PREHOOK: type: CREATEVIEW
216+
PREHOOK: Input: default@showcrt_tab_src2
217+
PREHOOK: Output: database:default
218+
PREHOOK: Output: default@showcrt_tab_src_v7
219+
POSTHOOK: query: CREATE VIEW showcrt_tab_src_v7 AS SELECT `col with tab` FROM showcrt_tab_src2 WHERE `col with tab` = 'a1'
220+
POSTHOOK: type: CREATEVIEW
221+
POSTHOOK: Input: default@showcrt_tab_src2
222+
POSTHOOK: Output: database:default
223+
POSTHOOK: Output: default@showcrt_tab_src_v7
224+
POSTHOOK: Lineage: showcrt_tab_src_v7.col with tab SIMPLE []
225+
PREHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v7
226+
PREHOOK: type: SHOW_CREATETABLE
227+
PREHOOK: Input: default@showcrt_tab_src_v7
228+
POSTHOOK: query: SHOW CREATE TABLE showcrt_tab_src_v7
229+
POSTHOOK: type: SHOW_CREATETABLE
230+
POSTHOOK: Input: default@showcrt_tab_src_v7
231+
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'
232+
PREHOOK: query: SELECT * FROM showcrt_tab_src_v7
233+
PREHOOK: type: QUERY
234+
PREHOOK: Input: default@showcrt_tab_src2
235+
PREHOOK: Input: default@showcrt_tab_src_v7
236+
#### A masked pattern was here ####
237+
POSTHOOK: query: SELECT * FROM showcrt_tab_src_v7
238+
POSTHOOK: type: QUERY
239+
POSTHOOK: Input: default@showcrt_tab_src2
240+
POSTHOOK: Input: default@showcrt_tab_src_v7
241+
#### A masked pattern was here ####
242+
a1

0 commit comments

Comments
 (0)