Repository: hive Updated Branches: refs/heads/master c5b2c0ebb -> be98f0133
HIVE-12663: Support quoted table names/columns when ACID is on (Pengcheng Xiong, reviewed by Eugene Koifman) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/be98f013 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/be98f013 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/be98f013 Branch: refs/heads/master Commit: be98f01332fd3ce232631d75bbc35a8252828454 Parents: c5b2c0e Author: Pengcheng Xiong <[email protected]> Authored: Tue Dec 15 10:18:27 2015 -0800 Committer: Pengcheng Xiong <[email protected]> Committed: Tue Dec 15 10:18:27 2015 -0800 ---------------------------------------------------------------------- .../ql/parse/UpdateDeleteSemanticAnalyzer.java | 21 ++++-- ..._after_multiple_inserts_special_characters.q | 25 +++++++ ...er_multiple_inserts_special_characters.q.out | 78 ++++++++++++++++++++ 3 files changed, 117 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/be98f013/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java index 4c69534..5b4365c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/UpdateDeleteSemanticAnalyzer.java @@ -35,6 +35,7 @@ import org.apache.hadoop.hive.ql.hooks.WriteEntity; import org.apache.hadoop.hive.ql.io.AcidUtils; import org.apache.hadoop.hive.ql.lib.Node; import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.metadata.HiveUtils; import org.apache.hadoop.hive.ql.metadata.InvalidTableException; import org.apache.hadoop.hive.ql.metadata.Table; import org.apache.hadoop.hive.ql.metadata.VirtualColumn; @@ -143,16 +144,20 @@ public class UpdateDeleteSemanticAnalyzer extends SemanticAnalyzer { List<String> bucketingCols = mTable.getBucketCols(); rewrittenQueryStr.append("insert into table "); - rewrittenQueryStr.append(getDotName(tableName)); + rewrittenQueryStr.append(getDotName(new String[] { + HiveUtils.unparseIdentifier(tableName[0], this.conf), + HiveUtils.unparseIdentifier(tableName[1], this.conf) })); // If the table is partitioned we have to put the partition() clause in if (partCols != null && partCols.size() > 0) { rewrittenQueryStr.append(" partition ("); boolean first = true; for (FieldSchema fschema : partCols) { - if (first) first = false; - else rewrittenQueryStr.append(", "); - rewrittenQueryStr.append(fschema.getName()); + if (first) + first = false; + else + rewrittenQueryStr.append(", "); + rewrittenQueryStr.append(HiveUtils.unparseIdentifier(fschema.getName(), this.conf)); } rewrittenQueryStr.append(")"); } @@ -214,7 +219,7 @@ public class UpdateDeleteSemanticAnalyzer extends SemanticAnalyzer { rewrittenQueryStr.append(','); String name = nonPartCols.get(i).getName(); ASTNode setCol = setCols.get(name); - rewrittenQueryStr.append(name); + rewrittenQueryStr.append(HiveUtils.unparseIdentifier(name, this.conf)); if (setCol != null) { // This is one of the columns we're setting, record it's position so we can come back // later and patch it up. @@ -228,11 +233,13 @@ public class UpdateDeleteSemanticAnalyzer extends SemanticAnalyzer { if (partCols != null) { for (FieldSchema fschema : partCols) { rewrittenQueryStr.append(", "); - rewrittenQueryStr.append(fschema.getName()); + rewrittenQueryStr.append(HiveUtils.unparseIdentifier(fschema.getName(), this.conf)); } } rewrittenQueryStr.append(" from "); - rewrittenQueryStr.append(getDotName(tableName)); + rewrittenQueryStr.append(getDotName(new String[] { + HiveUtils.unparseIdentifier(tableName[0], this.conf), + HiveUtils.unparseIdentifier(tableName[1], this.conf) })); ASTNode where = null; int whereIndex = deleting() ? 1 : 2; http://git-wip-us.apache.org/repos/asf/hive/blob/be98f013/ql/src/test/queries/clientpositive/update_after_multiple_inserts_special_characters.q ---------------------------------------------------------------------- diff --git a/ql/src/test/queries/clientpositive/update_after_multiple_inserts_special_characters.q b/ql/src/test/queries/clientpositive/update_after_multiple_inserts_special_characters.q new file mode 100644 index 0000000..65d3fb3 --- /dev/null +++ b/ql/src/test/queries/clientpositive/update_after_multiple_inserts_special_characters.q @@ -0,0 +1,25 @@ +set hive.mapred.mode=nonstrict; +set hive.exec.dynamic.partition.mode=nonstrict; +set hive.support.concurrency=true; +set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; + + +-- SORT_QUERY_RESULTS + +create table `aci/d_u/ami`(i int, + `d?*de e` decimal(5,2), + vc varchar(128)) clustered by (i) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true'); + +insert into table `aci/d_u/ami` values + (1, 109.23, 'mary had a little lamb'), + (6553, 923.19, 'its fleece was white as snow'); + +insert into table `aci/d_u/ami` values + (10, 119.23, 'and everywhere that mary went'), + (65530, 823.19, 'the lamb was sure to go'); + +select * from `aci/d_u/ami` order by `d?*de e`; + +update `aci/d_u/ami` set `d?*de e` = 3.14 where `d?*de e` = 109.23 or `d?*de e` = 119.23; + +select * from `aci/d_u/ami` order by `d?*de e`; http://git-wip-us.apache.org/repos/asf/hive/blob/be98f013/ql/src/test/results/clientpositive/update_after_multiple_inserts_special_characters.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/update_after_multiple_inserts_special_characters.q.out b/ql/src/test/results/clientpositive/update_after_multiple_inserts_special_characters.q.out new file mode 100644 index 0000000..b85db4f --- /dev/null +++ b/ql/src/test/results/clientpositive/update_after_multiple_inserts_special_characters.q.out @@ -0,0 +1,78 @@ +PREHOOK: query: -- SORT_QUERY_RESULTS + +create table `aci/d_u/ami`(i int, + `d?*de e` decimal(5,2), + vc varchar(128)) clustered by (i) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true') +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@aci/d_u/ami +POSTHOOK: query: -- SORT_QUERY_RESULTS + +create table `aci/d_u/ami`(i int, + `d?*de e` decimal(5,2), + vc varchar(128)) clustered by (i) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true') +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@aci/d_u/ami +PREHOOK: query: insert into table `aci/d_u/ami` values + (1, 109.23, 'mary had a little lamb'), + (6553, 923.19, 'its fleece was white as snow') +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__1 +PREHOOK: Output: default@aci/d_u/ami +POSTHOOK: query: insert into table `aci/d_u/ami` values + (1, 109.23, 'mary had a little lamb'), + (6553, 923.19, 'its fleece was white as snow') +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__1 +POSTHOOK: Output: default@aci/d_u/ami +POSTHOOK: Lineage: aci/d_u/ami.d?*de e EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: aci/d_u/ami.i EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: aci/d_u/ami.vc EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ] +PREHOOK: query: insert into table `aci/d_u/ami` values + (10, 119.23, 'and everywhere that mary went'), + (65530, 823.19, 'the lamb was sure to go') +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__2 +PREHOOK: Output: default@aci/d_u/ami +POSTHOOK: query: insert into table `aci/d_u/ami` values + (10, 119.23, 'and everywhere that mary went'), + (65530, 823.19, 'the lamb was sure to go') +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__2 +POSTHOOK: Output: default@aci/d_u/ami +POSTHOOK: Lineage: aci/d_u/ami.d?*de e EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: aci/d_u/ami.i EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: aci/d_u/ami.vc EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col3, type:string, comment:), ] +PREHOOK: query: select * from `aci/d_u/ami` order by `d?*de e` +PREHOOK: type: QUERY +PREHOOK: Input: default@aci/d_u/ami +#### A masked pattern was here #### +POSTHOOK: query: select * from `aci/d_u/ami` order by `d?*de e` +POSTHOOK: type: QUERY +POSTHOOK: Input: default@aci/d_u/ami +#### A masked pattern was here #### +1 109.23 mary had a little lamb +10 119.23 and everywhere that mary went +6553 923.19 its fleece was white as snow +65530 823.19 the lamb was sure to go +PREHOOK: query: update `aci/d_u/ami` set `d?*de e` = 3.14 where `d?*de e` = 109.23 or `d?*de e` = 119.23 +PREHOOK: type: QUERY +PREHOOK: Input: default@aci/d_u/ami +PREHOOK: Output: default@aci/d_u/ami +POSTHOOK: query: update `aci/d_u/ami` set `d?*de e` = 3.14 where `d?*de e` = 109.23 or `d?*de e` = 119.23 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@aci/d_u/ami +POSTHOOK: Output: default@aci/d_u/ami +PREHOOK: query: select * from `aci/d_u/ami` order by `d?*de e` +PREHOOK: type: QUERY +PREHOOK: Input: default@aci/d_u/ami +#### A masked pattern was here #### +POSTHOOK: query: select * from `aci/d_u/ami` order by `d?*de e` +POSTHOOK: type: QUERY +POSTHOOK: Input: default@aci/d_u/ami +#### A masked pattern was here #### +1 3.14 mary had a little lamb +10 3.14 and everywhere that mary went +6553 923.19 its fleece was white as snow +65530 823.19 the lamb was sure to go
