diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java index 50a55d8..3efeecd 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java @@ -793,8 +793,8 @@ private static void generateConstraintInfos(ASTNode child, List columnNa } if (enable) { throw new SemanticException( - ErrorMsg.INVALID_CSTR_SYNTAX.getMsg("ENABLE feature not supported yet. " - + "Please use DISABLE instead.")); + ErrorMsg.INVALID_CSTR_SYNTAX.getMsg("ENABLE/ENFORCED feature not supported yet. " + + "Please use DISABLE/NOT ENFORCED instead.")); } if (validate) { throw new SemanticException( diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g index d0ce4ae..74f9d95 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g @@ -332,6 +332,7 @@ KW_PRIMARY: 'PRIMARY'; KW_FOREIGN: 'FOREIGN'; KW_REFERENCES: 'REFERENCES'; KW_CONSTRAINT: 'CONSTRAINT'; +KW_ENFORCED: 'ENFORCED'; KW_VALIDATE: 'VALIDATE'; KW_NOVALIDATE: 'NOVALIDATE'; KW_RELY: 'RELY'; diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g index c2d8904..a2e55ed 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g @@ -2190,6 +2190,7 @@ enableValidateSpecification @init { pushMsg("enable specification", state); } @after { popMsg(state); } : enableSpecification validateSpecification? + | enforcedSpecification ; enableSpecification @@ -2206,6 +2207,13 @@ validateSpecification | KW_NOVALIDATE -> ^(TOK_NOVALIDATE) ; +enforcedSpecification +@init { pushMsg("enforced specification", state); } +@after { popMsg(state); } + : KW_ENFORCED -> ^(TOK_ENABLE) + | KW_NOT KW_ENFORCED -> ^(TOK_DISABLE) + ; + relySpecification @init { pushMsg("rely specification", state); } @after { popMsg(state); } diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g index 0a7b7b2..69a1d63 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g @@ -793,7 +793,7 @@ nonReserved | KW_COMMENT | KW_COMPACT | KW_COMPACTIONS | KW_COMPUTE | KW_CONCATENATE | KW_CONTINUE | KW_DATA | KW_DAY | KW_DATABASES | KW_DATETIME | KW_DBPROPERTIES | KW_DEFERRED | KW_DEFINED | KW_DELIMITED | KW_DEPENDENCY | KW_DESC | KW_DIRECTORIES | KW_DIRECTORY | KW_DISABLE | KW_DISTRIBUTE | KW_DOW | KW_ELEM_TYPE - | KW_ENABLE | KW_ESCAPED | KW_EXCLUSIVE | KW_EXPLAIN | KW_EXPORT | KW_FIELDS | KW_FILE | KW_FILEFORMAT + | KW_ENABLE | KW_ENFORCED | KW_ESCAPED | KW_EXCLUSIVE | KW_EXPLAIN | KW_EXPORT | KW_FIELDS | KW_FILE | KW_FILEFORMAT | KW_FIRST | KW_FORMAT | KW_FORMATTED | KW_FUNCTIONS | KW_HOLD_DDLTIME | KW_HOUR | KW_IDXPROPERTIES | KW_IGNORE | KW_INDEX | KW_INDEXES | KW_INPATH | KW_INPUTDRIVER | KW_INPUTFORMAT | KW_ITEMS | KW_JAR | KW_KILL | KW_KEYS | KW_KEY_TYPE | KW_LAST | KW_LIMIT | KW_OFFSET | KW_LINES | KW_LOAD | KW_LOCATION | KW_LOCK | KW_LOCKS | KW_LOGICAL | KW_LONG diff --git ql/src/test/queries/clientnegative/create_with_constraints_enforced.q ql/src/test/queries/clientnegative/create_with_constraints_enforced.q new file mode 100644 index 0000000..5b90c0e --- /dev/null +++ ql/src/test/queries/clientnegative/create_with_constraints_enforced.q @@ -0,0 +1 @@ +CREATE TABLE table1 (a STRING, b STRING, primary key (a) enforced); diff --git ql/src/test/queries/clientpositive/create_with_constraints2.q ql/src/test/queries/clientpositive/create_with_constraints2.q new file mode 100644 index 0000000..22ea23d --- /dev/null +++ ql/src/test/queries/clientpositive/create_with_constraints2.q @@ -0,0 +1,8 @@ +CREATE TABLE table1 (a STRING, b STRING, PRIMARY KEY (a) NOT ENFORCED); +CREATE TABLE table2 (a STRING, b STRING, PRIMARY KEY (a) NOT ENFORCED RELY); + +DESCRIBE EXTENDED table1; +DESCRIBE EXTENDED table2; + +DESCRIBE FORMATTED table1; +DESCRIBE FORMATTED table2; diff --git ql/src/test/results/clientnegative/create_with_constraints_enable.q.out ql/src/test/results/clientnegative/create_with_constraints_enable.q.out index 65d3bfe..2b24412 100644 --- ql/src/test/results/clientnegative/create_with_constraints_enable.q.out +++ ql/src/test/results/clientnegative/create_with_constraints_enable.q.out @@ -1 +1 @@ -FAILED: SemanticException [Error 10326]: Invalid Constraint syntax ENABLE feature not supported yet. Please use DISABLE instead. +FAILED: SemanticException [Error 10326]: Invalid Constraint syntax ENABLE/ENFORCED feature not supported yet. Please use DISABLE/NOT ENFORCED instead. diff --git ql/src/test/results/clientnegative/create_with_constraints_enforced.q.out ql/src/test/results/clientnegative/create_with_constraints_enforced.q.out new file mode 100644 index 0000000..2b24412 --- /dev/null +++ ql/src/test/results/clientnegative/create_with_constraints_enforced.q.out @@ -0,0 +1 @@ +FAILED: SemanticException [Error 10326]: Invalid Constraint syntax ENABLE/ENFORCED feature not supported yet. Please use DISABLE/NOT ENFORCED instead. diff --git ql/src/test/results/clientpositive/create_with_constraints2.q.out ql/src/test/results/clientpositive/create_with_constraints2.q.out new file mode 100644 index 0000000..eea74d9 --- /dev/null +++ ql/src/test/results/clientpositive/create_with_constraints2.q.out @@ -0,0 +1,120 @@ +PREHOOK: query: CREATE TABLE table1 (a STRING, b STRING, PRIMARY KEY (a) NOT ENFORCED) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@table1 +POSTHOOK: query: CREATE TABLE table1 (a STRING, b STRING, PRIMARY KEY (a) NOT ENFORCED) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@table1 +PREHOOK: query: CREATE TABLE table2 (a STRING, b STRING, PRIMARY KEY (a) NOT ENFORCED RELY) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@table2 +POSTHOOK: query: CREATE TABLE table2 (a STRING, b STRING, PRIMARY KEY (a) NOT ENFORCED RELY) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@table2 +PREHOOK: query: DESCRIBE EXTENDED table1 +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@table1 +POSTHOOK: query: DESCRIBE EXTENDED table1 +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@table1 +a string +b string + +#### A masked pattern was here #### +Constraints Primary Key for default.table1:[a], Constraint Name: #### A masked pattern was here #### +PREHOOK: query: DESCRIBE EXTENDED table2 +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@table2 +POSTHOOK: query: DESCRIBE EXTENDED table2 +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@table2 +a string +b string + +#### A masked pattern was here #### +Constraints Primary Key for default.table2:[a], Constraint Name: #### A masked pattern was here #### +PREHOOK: query: DESCRIBE FORMATTED table1 +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@table1 +POSTHOOK: query: DESCRIBE FORMATTED table1 +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@table1 +# col_name data_type comment +a string +b string + +# Detailed Table Information +Database: default +#### A masked pattern was here #### +Retention: 0 +#### A masked pattern was here #### +Table Type: MANAGED_TABLE +Table Parameters: + COLUMN_STATS_ACCURATE {\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{\"a\":\"true\",\"b\":\"true\"}} + numFiles 0 + numRows 0 + rawDataSize 0 + totalSize 0 +#### A masked pattern was here #### + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 + +# Constraints + +# Primary Key +Table: default.table1 +Constraint Name: #### A masked pattern was here #### +Column Names: a +PREHOOK: query: DESCRIBE FORMATTED table2 +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@table2 +POSTHOOK: query: DESCRIBE FORMATTED table2 +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@table2 +# col_name data_type comment +a string +b string + +# Detailed Table Information +Database: default +#### A masked pattern was here #### +Retention: 0 +#### A masked pattern was here #### +Table Type: MANAGED_TABLE +Table Parameters: + COLUMN_STATS_ACCURATE {\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{\"a\":\"true\",\"b\":\"true\"}} + numFiles 0 + numRows 0 + rawDataSize 0 + totalSize 0 +#### A masked pattern was here #### + +# Storage Information +SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] +Storage Desc Params: + serialization.format 1 + +# Constraints + +# Primary Key +Table: default.table2 +Constraint Name: #### A masked pattern was here #### +Column Names: a