diff --git common/src/java/org/apache/hadoop/hive/conf/Constants.java common/src/java/org/apache/hadoop/hive/conf/Constants.java index 7b2c234..a79be8d 100644 --- common/src/java/org/apache/hadoop/hive/conf/Constants.java +++ common/src/java/org/apache/hadoop/hive/conf/Constants.java @@ -77,4 +77,10 @@ /** A named lock is acquired prior to executing the query; enabling to run queries in parallel which might interfere with eachother. */ public static final String HIVE_QUERY_EXCLUSIVE_LOCK = "hive.query.exclusive.lock"; + + public static final String SCHEDULED_QUERY_NAMESPACE = "scheduled.query.namespace"; + public static final String SCHEDULED_QUERY_SCHEDULENAME = "scheduled.query.schedulename"; + public static final String SCHEDULED_QUERY_EXECUTIONID = "scheduled.query.executionid"; + public static final String SCHEDULED_QUERY_USER = "scheduled.query.user"; + } diff --git ql/src/java/org/apache/hadoop/hive/ql/scheduled/ScheduledQueryExecutionService.java ql/src/java/org/apache/hadoop/hive/ql/scheduled/ScheduledQueryExecutionService.java index ca12093..3cbaa60 100644 --- ql/src/java/org/apache/hadoop/hive/ql/scheduled/ScheduledQueryExecutionService.java +++ ql/src/java/org/apache/hadoop/hive/ql/scheduled/ScheduledQueryExecutionService.java @@ -223,6 +223,10 @@ HiveConf conf = new HiveConf(context.conf); conf.set(Constants.HIVE_QUERY_EXCLUSIVE_LOCK, lockNameFor(q.getScheduleKey())); conf.setVar(HiveConf.ConfVars.HIVE_AUTHENTICATOR_MANAGER, SessionStateUserAuthenticator.class.getName()); + conf.set(Constants.SCHEDULED_QUERY_NAMESPACE, q.getScheduleKey().getClusterNamespace()); + conf.set(Constants.SCHEDULED_QUERY_SCHEDULENAME, q.getScheduleKey().getScheduleName()); + conf.set(Constants.SCHEDULED_QUERY_USER, q.getUser()); + conf.set(Constants.SCHEDULED_QUERY_EXECUTIONID, Long.toString(q.getExecutionId())); conf.unset(HiveConf.ConfVars.HIVESESSIONID.varname); state = new SessionState(conf, q.getUser()); state.setIsHiveServerQuery(true); diff --git ql/src/test/org/apache/hadoop/hive/ql/schq/TestScheduledQueryService.java ql/src/test/org/apache/hadoop/hive/ql/schq/TestScheduledQueryService.java index dd8da34..ebf37d1 100644 --- ql/src/test/org/apache/hadoop/hive/ql/schq/TestScheduledQueryService.java +++ ql/src/test/org/apache/hadoop/hive/ql/schq/TestScheduledQueryService.java @@ -90,7 +90,7 @@ private int getNumRowsReturned(IDriver driver, String query) throws Exception { driver.run(query); FetchTask ft = driver.getFetchTask(); - List res = new ArrayList(); + List res = new ArrayList<>(); if (ft == null) { return 0; } @@ -117,6 +117,7 @@ r.setExecutionId(id++); r.setQuery(stmt); r.setScheduleKey(new ScheduledQueryKey("sch1", getClusterNamespace())); + r.setUser("nobody"); if (id == 1) { return r; } else { diff --git ql/src/test/queries/clientpositive/schq_past.q ql/src/test/queries/clientpositive/schq_past.q new file mode 100644 index 0000000..735ba03 --- /dev/null +++ ql/src/test/queries/clientpositive/schq_past.q @@ -0,0 +1,9 @@ +--! qt:authorizer +--! qt:scheduledqueryservice + +set user.name=hive_admin_user; +set role admin; + +-- defining a schedule in the past should be allowed +create scheduled query ingest cron '0 0 0 1 * ? 2000' defined as select 1; + diff --git ql/src/test/results/clientpositive/llap/schq_past.q.out ql/src/test/results/clientpositive/llap/schq_past.q.out new file mode 100644 index 0000000..1667743 --- /dev/null +++ ql/src/test/results/clientpositive/llap/schq_past.q.out @@ -0,0 +1,8 @@ +PREHOOK: query: set role admin +PREHOOK: type: SHOW_ROLES +POSTHOOK: query: set role admin +POSTHOOK: type: SHOW_ROLES +PREHOOK: query: create scheduled query ingest cron '0 0 0 1 * ? 2000' defined as select 1 +PREHOOK: type: CREATE SCHEDULED QUERY +POSTHOOK: query: create scheduled query ingest cron '0 0 0 1 * ? 2000' defined as select 1 +POSTHOOK: type: CREATE SCHEDULED QUERY diff --git standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java index 3922282..8fd4982 100644 --- standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java +++ standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java @@ -13174,9 +13174,6 @@ } openTransaction(); Integer nextExecutionTime = computeNextExecutionTime(schq.getSchedule()); - if (nextExecutionTime == null) { - throw new InvalidInputException("Invalid schedule: " + schq.getSchedule()); - } schq.setNextExecution(nextExecutionTime); pm.makePersistent(schq); commited = commitTransaction(); @@ -13222,9 +13219,6 @@ persisted.doUpdate(schq); if (!scheduledQuery.isSetNextExecution()) { Integer nextExecutionTime = computeNextExecutionTime(schq.getSchedule()); - if (nextExecutionTime == null) { - throw new InvalidInputException("Invalid schedule: " + schq.getSchedule()); - } persisted.setNextExecution(nextExecutionTime); } else { persisted.setNextExecution(schq.getNextExecution()); diff --git standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql index 727abce..d548c90 100644 --- standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql +++ standalone-metastore/metastore-server/src/main/sql/derby/hive-schema-4.0.0.derby.sql @@ -747,7 +747,7 @@ "USER" varchar(128) not null, "SCHEDULE" varchar(256) not null, "QUERY" varchar(4000) not null, - "NEXT_EXECUTION" integer not null, + "NEXT_EXECUTION" integer, "ACTIVE_EXECUTION_ID" bigint ); diff --git standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql index 421524b..db6cebc 100644 --- standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql +++ standalone-metastore/metastore-server/src/main/sql/derby/upgrade-3.2.0-to-4.0.0.derby.sql @@ -26,7 +26,7 @@ "USER" varchar(128) not null, "SCHEDULE" varchar(256) not null, "QUERY" varchar(4000) not null, - "NEXT_EXECUTION" integer not null + "NEXT_EXECUTION" integer ); CREATE INDEX NEXTEXECUTIONINDEX ON APP.SCHEDULED_QUERIES (ENABLED,CLUSTER_NAMESPACE,NEXT_EXECUTION);