diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java index 37e98456f1..2dea254c87 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java @@ -1097,7 +1097,7 @@ private String buildTriggerExpression(ASTNode ast) throws SemanticException { } StringBuilder builder = new StringBuilder(); for (int i = 0; i < ast.getChildCount(); ++i) { - builder.append(ast.getChild(i).getText()); + builder.append(stripQuotes(ast.getChild(i).getText())); builder.append(' '); } builder.deleteCharAt(builder.length() - 1); 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 09a4368984..d4b5782430 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g @@ -472,21 +472,6 @@ ByteLengthLiteral (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G') ; -TimeFullLiteral - : - (Digit)+ ('NS' | 'NSEC' | 'NSECS' | 'NANOSECOND' | 'NANOSECONDS' | - 'US' | 'USEC' | 'USECS' | 'MICROSECOND' | 'MICROSECONDS' | - 'MS' | 'MSEC' | 'MSECS' | 'MILLISECOND' | 'MILLISECONDS' | - 'SEC' | 'SECS' | 'SECOND' | 'SECONDS' | - 'MIN' | 'MINS' | 'MINUTE' | 'MINUTES' | - 'HOUR' | 'HOURS' | 'DAY' | 'DAYS') - ; - -ByteLengthFullLiteral - : - (Digit)+ ('KB' | 'MB' | 'GB' | 'TB' | 'PB') - ; - Number : (Digit)+ ( DOT (Digit)* (Exponent)? | Exponent)? diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/ResourcePlanParser.g ql/src/java/org/apache/hadoop/hive/ql/parse/ResourcePlanParser.g index 21f2d45dc1..f8c47f972f 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/ResourcePlanParser.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/ResourcePlanParser.g @@ -179,12 +179,12 @@ triggerAtomExpression : identifier comparisionOperator triggerLiteral ; + triggerLiteral @init { gParent.pushMsg("triggerLiteral", state); } @after { gParent.popMsg(state); } : Number - | TimeFullLiteral - | ByteLengthFullLiteral + | StringLiteral ; comparisionOperator diff --git ql/src/test/queries/clientpositive/resourceplan.q ql/src/test/queries/clientpositive/resourceplan.q index 4cbdede342..0c44da3c20 100644 --- ql/src/test/queries/clientpositive/resourceplan.q +++ ql/src/test/queries/clientpositive/resourceplan.q @@ -148,40 +148,46 @@ SELECT * FROM SYS.WM_RESOURCEPLANS; -- Create trigger commands. -- +-- Test that WM literals do not cause conflicts. +create table wm_test(key string); +select key as 30min from wm_test; +select "10kb" as str from wm_test; +drop table wm_test; + CREATE RESOURCE PLAN plan_1; -CREATE TRIGGER plan_1.trigger_1 WHEN BYTES_READ > 10kb DO KILL; +CREATE TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '10kb' DO KILL; SELECT * FROM SYS.WM_TRIGGERS; -- Duplicate should fail. CREATE TRIGGER plan_1.trigger_1 WHEN ELAPSED_TIME > 300 DO KILL; -- Invalid triggers should fail. -CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > 30sec AND BYTES_READ > 10 DO MOVE TO slow_pool; -CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > 30second OR BYTES_READ > 10 DO MOVE TO slow_pool; -CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME >= 30seconds DO MOVE TO slow_pool; -CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME < 30hour DO MOVE TO slow_pool; -CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME <= 30min DO MOVE TO slow_pool; -CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME = 0day DO MOVE TO slow_pool; - -CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > 30hour DO MOVE TO slow_pool; +CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '30sec' AND BYTES_READ > 10 DO MOVE TO slow_pool; +CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '30second' OR BYTES_READ > 10 DO MOVE TO slow_pool; +CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME >= '30seconds' DO MOVE TO slow_pool; +CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME < '30hour' DO MOVE TO slow_pool; +CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME <= '30min' DO MOVE TO slow_pool; +CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME = '0day' DO MOVE TO slow_pool; + +CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '30hour' DO MOVE TO slow_pool; SELECT * FROM SYS.WM_TRIGGERS; -ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > 1min DO KILL; +ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1min' DO KILL; SELECT * FROM SYS.WM_TRIGGERS; DROP TRIGGER plan_1.trigger_1; SELECT * FROM SYS.WM_TRIGGERS; -- No edit on active resource plan. -CREATE TRIGGER plan_2.trigger_1 WHEN BYTES_READ > 100mb DO MOVE TO null_pool; +CREATE TRIGGER plan_2.trigger_1 WHEN BYTES_READ > '100mb' DO MOVE TO null_pool; -- Add trigger with reserved keywords. -CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > 100KB DO MOVE TO `table`; -CREATE TRIGGER `table`.`trigger` WHEN BYTES_WRITTEN > 100MB DO MOVE TO `default`; -CREATE TRIGGER `table`.`database` WHEN BYTES_WRITTEN > 1GB DO MOVE TO `default`; +CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO `table`; +CREATE TRIGGER `table`.`trigger` WHEN BYTES_WRITTEN > '100MB' DO MOVE TO `default`; +CREATE TRIGGER `table`.`database` WHEN BYTES_WRITTEN > "1GB" DO MOVE TO `default`; CREATE TRIGGER `table`.`trigger1` WHEN ELAPSED_TIME > 10 DO KILL; -CREATE TRIGGER `table`.`trigger2` WHEN ELAPSED_TIME > 1hour DO KILL; +CREATE TRIGGER `table`.`trigger2` WHEN ELAPSED_TIME > '1hour' DO KILL; SELECT * FROM SYS.WM_TRIGGERS; DROP TRIGGER `table`.`database`; SELECT * FROM SYS.WM_TRIGGERS; @@ -190,13 +196,13 @@ SELECT * FROM SYS.WM_TRIGGERS; ALTER RESOURCE PLAN plan_1 ENABLE; SELECT * FROM SYS.WM_RESOURCEPLANS; DROP TRIGGER plan_1.trigger_2; -ALTER TRIGGER plan_1.trigger_2 WHEN BYTES_READ > 1000gb DO KILL; +ALTER TRIGGER plan_1.trigger_2 WHEN BYTES_READ > "1000gb" DO KILL; -- Cannot drop/change trigger from active plan. ALTER RESOURCE PLAN plan_1 ACTIVATE; SELECT * FROM SYS.WM_RESOURCEPLANS; DROP TRIGGER plan_1.trigger_2; -ALTER TRIGGER plan_1.trigger_2 WHEN BYTES_READ > 1000KB DO KILL; +ALTER TRIGGER plan_1.trigger_2 WHEN BYTES_READ > "1000KB" DO KILL; -- Once disabled we should be able to change it. ALTER RESOURCE PLAN plan_2 DISABLE; @@ -383,8 +389,8 @@ SELECT * FROM SYS.WM_MAPPINGS; CREATE RESOURCE PLAN plan_4a LIKE plan_4; CREATE POOL plan_4a.pool1 WITH SCHEDULING_POLICY='fair', QUERY_PARALLELISM=2, ALLOC_FRACTION=0.0; CREATE USER MAPPING "user1" IN plan_4a TO pool1; -CREATE TRIGGER plan_4a.trigger_1 WHEN BYTES_READ > 10GB DO KILL; -CREATE TRIGGER plan_4a.trigger_2 WHEN BYTES_READ > 11GB DO KILL; +CREATE TRIGGER plan_4a.trigger_1 WHEN BYTES_READ > '10GB' DO KILL; +CREATE TRIGGER plan_4a.trigger_2 WHEN BYTES_READ > '11GB' DO KILL; ALTER POOL plan_4a.pool1 ADD TRIGGER trigger_2; CREATE RESOURCE PLAN plan_4b LIKE plan_4a; diff --git ql/src/test/results/clientpositive/llap/resourceplan.q.out ql/src/test/results/clientpositive/llap/resourceplan.q.out index 8e58b16f43..b0736dc99c 100644 --- ql/src/test/results/clientpositive/llap/resourceplan.q.out +++ ql/src/test/results/clientpositive/llap/resourceplan.q.out @@ -3596,15 +3596,47 @@ POSTHOOK: Input: sys@wm_resourceplans #### A masked pattern was here #### plan_2 ACTIVE 10 default table DISABLED 1 default +PREHOOK: query: create table wm_test(key string) +PREHOOK: type: CREATETABLE +PREHOOK: Output: INFORMATION_SCHEMA@wm_test +PREHOOK: Output: database:information_schema +POSTHOOK: query: create table wm_test(key string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: INFORMATION_SCHEMA@wm_test +POSTHOOK: Output: database:information_schema +PREHOOK: query: select key as 30min from wm_test +PREHOOK: type: QUERY +PREHOOK: Input: information_schema@wm_test +#### A masked pattern was here #### +POSTHOOK: query: select key as 30min from wm_test +POSTHOOK: type: QUERY +POSTHOOK: Input: information_schema@wm_test +#### A masked pattern was here #### +PREHOOK: query: select "10kb" as str from wm_test +PREHOOK: type: QUERY +PREHOOK: Input: information_schema@wm_test +#### A masked pattern was here #### +POSTHOOK: query: select "10kb" as str from wm_test +POSTHOOK: type: QUERY +POSTHOOK: Input: information_schema@wm_test +#### A masked pattern was here #### +PREHOOK: query: drop table wm_test +PREHOOK: type: DROPTABLE +PREHOOK: Input: information_schema@wm_test +PREHOOK: Output: information_schema@wm_test +POSTHOOK: query: drop table wm_test +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: information_schema@wm_test +POSTHOOK: Output: information_schema@wm_test PREHOOK: query: CREATE RESOURCE PLAN plan_1 PREHOOK: type: CREATE RESOURCEPLAN PREHOOK: Output: dummyHostnameForTest POSTHOOK: query: CREATE RESOURCE PLAN plan_1 POSTHOOK: type: CREATE RESOURCEPLAN -PREHOOK: query: CREATE TRIGGER plan_1.trigger_1 WHEN BYTES_READ > 10kb DO KILL +PREHOOK: query: CREATE TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '10kb' DO KILL PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest -POSTHOOK: query: CREATE TRIGGER plan_1.trigger_1 WHEN BYTES_READ > 10kb DO KILL +POSTHOOK: query: CREATE TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '10kb' DO KILL POSTHOOK: type: CREATE TRIGGER PREHOOK: query: SELECT * FROM SYS.WM_TRIGGERS PREHOOK: type: QUERY @@ -3619,16 +3651,16 @@ PREHOOK: query: CREATE TRIGGER plan_1.trigger_1 WHEN ELAPSED_TIME > 300 DO KILL PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. AlreadyExistsException(message:Trigger already exists, use alter: ) -FAILED: ParseException line 4:58 mismatched input 'AND' expecting DO near '30sec' in create trigger statement -FAILED: ParseException line 2:61 mismatched input 'OR' expecting DO near '30second' in create trigger statement +FAILED: ParseException line 4:60 mismatched input 'AND' expecting DO near ''30sec'' in create trigger statement +FAILED: ParseException line 2:63 mismatched input 'OR' expecting DO near ''30second'' in create trigger statement FAILED: ParseException line 2:50 mismatched input '>=' expecting > near 'ELAPSED_TIME' in comparisionOperator FAILED: ParseException line 2:50 mismatched input '<' expecting > near 'ELAPSED_TIME' in comparisionOperator FAILED: ParseException line 2:50 mismatched input '<=' expecting > near 'ELAPSED_TIME' in comparisionOperator FAILED: ParseException line 2:50 mismatched input '=' expecting > near 'ELAPSED_TIME' in comparisionOperator -PREHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > 30hour DO MOVE TO slow_pool +PREHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '30hour' DO MOVE TO slow_pool PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest -POSTHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > 30hour DO MOVE TO slow_pool +POSTHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '30hour' DO MOVE TO slow_pool POSTHOOK: type: CREATE TRIGGER PREHOOK: query: SELECT * FROM SYS.WM_TRIGGERS PREHOOK: type: QUERY @@ -3640,10 +3672,10 @@ POSTHOOK: Input: sys@wm_triggers #### A masked pattern was here #### plan_1 trigger_1 BYTES_READ > 10kb KILL plan_1 trigger_2 ELAPSED_TIME > 30hour MOVE TO slow_pool -PREHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > 1min DO KILL +PREHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1min' DO KILL PREHOOK: type: ALTER TRIGGER PREHOOK: Output: dummyHostnameForTest -POSTHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > 1min DO KILL +POSTHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1min' DO KILL POSTHOOK: type: ALTER TRIGGER PREHOOK: query: SELECT * FROM SYS.WM_TRIGGERS PREHOOK: type: QUERY @@ -3669,34 +3701,34 @@ POSTHOOK: type: QUERY POSTHOOK: Input: sys@wm_triggers #### A masked pattern was here #### plan_1 trigger_2 ELAPSED_TIME > 30hour MOVE TO slow_pool -PREHOOK: query: CREATE TRIGGER plan_2.trigger_1 WHEN BYTES_READ > 100mb DO MOVE TO null_pool +PREHOOK: query: CREATE TRIGGER plan_2.trigger_1 WHEN BYTES_READ > '100mb' DO MOVE TO null_pool PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Resource plan must be disabled to edit it.) -PREHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > 100KB DO MOVE TO `table` +PREHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO `table` PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest -POSTHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > 100KB DO MOVE TO `table` +POSTHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO `table` POSTHOOK: type: CREATE TRIGGER -PREHOOK: query: CREATE TRIGGER `table`.`trigger` WHEN BYTES_WRITTEN > 100MB DO MOVE TO `default` +PREHOOK: query: CREATE TRIGGER `table`.`trigger` WHEN BYTES_WRITTEN > '100MB' DO MOVE TO `default` PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest -POSTHOOK: query: CREATE TRIGGER `table`.`trigger` WHEN BYTES_WRITTEN > 100MB DO MOVE TO `default` +POSTHOOK: query: CREATE TRIGGER `table`.`trigger` WHEN BYTES_WRITTEN > '100MB' DO MOVE TO `default` POSTHOOK: type: CREATE TRIGGER -PREHOOK: query: CREATE TRIGGER `table`.`database` WHEN BYTES_WRITTEN > 1GB DO MOVE TO `default` +PREHOOK: query: CREATE TRIGGER `table`.`database` WHEN BYTES_WRITTEN > "1GB" DO MOVE TO `default` PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest -POSTHOOK: query: CREATE TRIGGER `table`.`database` WHEN BYTES_WRITTEN > 1GB DO MOVE TO `default` +POSTHOOK: query: CREATE TRIGGER `table`.`database` WHEN BYTES_WRITTEN > "1GB" DO MOVE TO `default` POSTHOOK: type: CREATE TRIGGER PREHOOK: query: CREATE TRIGGER `table`.`trigger1` WHEN ELAPSED_TIME > 10 DO KILL PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest POSTHOOK: query: CREATE TRIGGER `table`.`trigger1` WHEN ELAPSED_TIME > 10 DO KILL POSTHOOK: type: CREATE TRIGGER -PREHOOK: query: CREATE TRIGGER `table`.`trigger2` WHEN ELAPSED_TIME > 1hour DO KILL +PREHOOK: query: CREATE TRIGGER `table`.`trigger2` WHEN ELAPSED_TIME > '1hour' DO KILL PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest -POSTHOOK: query: CREATE TRIGGER `table`.`trigger2` WHEN ELAPSED_TIME > 1hour DO KILL +POSTHOOK: query: CREATE TRIGGER `table`.`trigger2` WHEN ELAPSED_TIME > '1hour' DO KILL POSTHOOK: type: CREATE TRIGGER PREHOOK: query: SELECT * FROM SYS.WM_TRIGGERS PREHOOK: type: QUERY @@ -3750,7 +3782,7 @@ PREHOOK: query: DROP TRIGGER plan_1.trigger_2 PREHOOK: type: DROP TRIGGER PREHOOK: Output: dummyHostnameForTest FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Resource plan must be disabled to edit it.) -PREHOOK: query: ALTER TRIGGER plan_1.trigger_2 WHEN BYTES_READ > 1000gb DO KILL +PREHOOK: query: ALTER TRIGGER plan_1.trigger_2 WHEN BYTES_READ > "1000gb" DO KILL PREHOOK: type: ALTER TRIGGER PREHOOK: Output: dummyHostnameForTest FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Resource plan must be disabled to edit it.) @@ -3774,7 +3806,7 @@ PREHOOK: query: DROP TRIGGER plan_1.trigger_2 PREHOOK: type: DROP TRIGGER PREHOOK: Output: dummyHostnameForTest FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Resource plan must be disabled to edit it.) -PREHOOK: query: ALTER TRIGGER plan_1.trigger_2 WHEN BYTES_READ > 1000KB DO KILL +PREHOOK: query: ALTER TRIGGER plan_1.trigger_2 WHEN BYTES_READ > "1000KB" DO KILL PREHOOK: type: ALTER TRIGGER PREHOOK: Output: dummyHostnameForTest FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Resource plan must be disabled to edit it.) @@ -4473,15 +4505,15 @@ PREHOOK: type: CREATE MAPPING PREHOOK: Output: dummyHostnameForTest POSTHOOK: query: CREATE USER MAPPING "user1" IN plan_4a TO pool1 POSTHOOK: type: CREATE MAPPING -PREHOOK: query: CREATE TRIGGER plan_4a.trigger_1 WHEN BYTES_READ > 10GB DO KILL +PREHOOK: query: CREATE TRIGGER plan_4a.trigger_1 WHEN BYTES_READ > '10GB' DO KILL PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest -POSTHOOK: query: CREATE TRIGGER plan_4a.trigger_1 WHEN BYTES_READ > 10GB DO KILL +POSTHOOK: query: CREATE TRIGGER plan_4a.trigger_1 WHEN BYTES_READ > '10GB' DO KILL POSTHOOK: type: CREATE TRIGGER -PREHOOK: query: CREATE TRIGGER plan_4a.trigger_2 WHEN BYTES_READ > 11GB DO KILL +PREHOOK: query: CREATE TRIGGER plan_4a.trigger_2 WHEN BYTES_READ > '11GB' DO KILL PREHOOK: type: CREATE TRIGGER PREHOOK: Output: dummyHostnameForTest -POSTHOOK: query: CREATE TRIGGER plan_4a.trigger_2 WHEN BYTES_READ > 11GB DO KILL +POSTHOOK: query: CREATE TRIGGER plan_4a.trigger_2 WHEN BYTES_READ > '11GB' DO KILL POSTHOOK: type: CREATE TRIGGER PREHOOK: query: ALTER POOL plan_4a.pool1 ADD TRIGGER trigger_2 PREHOOK: type: ALTER POOL