/** * Compile a new query. Any currently-planned query associated with this Driver is discarded. * Do not reset id for inner queries(index, etc). Task ids are used for task identity check. * * @param command * The SQL query to compile. */ @Override public int compile(String command) { return compile(command, true); }
@Override public int compile(String string) { return coreDriver.compile(string); }
/** * Compile a new query, but potentially reset taskID counter. Not resetting task counter * is useful for generating re-entrant QL queries. * @param command The HiveQL query to compile * @param resetTaskIds Resets taskID counter if true. * @return 0 for ok */ public int compile(String command, boolean resetTaskIds) { return compile(command, resetTaskIds, false); }
/** * Compile a new query. Any currently-planned query associated with this Driver is discarded. * Do not reset id for inner queries(index, etc). Task ids are used for task identity check. * * @param command * The SQL query to compile. */ public int compile(String command) { return compile(command, true); }
/** * Compile a new query, but potentially reset taskID counter. Not resetting task counter * is useful for generating re-entrant QL queries. * @param command The HiveQL query to compile * @param resetTaskIds Resets taskID counter if true. * @return 0 for ok */ public int compile(String command, boolean resetTaskIds) { try { compile(command, resetTaskIds, false); return 0; } catch (CommandProcessorResponse cpr) { return cpr.getErrorCode(); } }
private void doIndexUpdate(List<Index> tblIndexes) throws HiveException { Driver driver = new Driver(this.conf); for (Index idx : tblIndexes) { StringBuilder sb = new StringBuilder(); sb.append("ALTER INDEX "); sb.append(idx.getIndexName()); sb.append(" ON "); sb.append(idx.getDbName()).append('.'); sb.append(idx.getOrigTableName()); sb.append(" REBUILD"); driver.compile(sb.toString(), false); tasks.addAll(driver.getPlan().getRootTasks()); inputs.addAll(driver.getPlan().getInputs()); } }
private void initDriver(HiveConf conf, int threadCount) throws Exception { driver = Mockito.spy(new Driver(conf)); resetParallelCompilationLimit(conf); AtomicInteger count = new AtomicInteger(threadCount); Mockito.doAnswer(invocation -> { Thread.sleep(500); verifyThatWaitingCompileOpsCountIsEqualTo(count.decrementAndGet()); return null; }).when(driver).compile(eq(SHORT_QUERY), eq(true), eq(false)); Mockito.doAnswer(invocation -> { Thread.sleep(5000); verifyThatWaitingCompileOpsCountIsEqualTo(count.decrementAndGet()); return null; }).when(driver).compile(eq(LONG_QUERY), eq(true), eq(false)); }
/** * No views in the query so it should be a direct entity * * @throws ParseException */ @Test public void testSelectEntityDirect() throws ParseException { Driver driver = createDriver(); int ret = driver.compile("select * from t1"); assertEquals("Checking command success", 0, ret); assertEquals(1, CheckInputReadEntityDirect.readEntities.size()); assertTrue("isDirect", CheckInputReadEntityDirect.readEntities.iterator().next().isDirect()); }
@Test public void testDecimalType4() throws ParseException { String query = "create table `dec` (d decimal(0,7))"; Driver driver = createDriver(); int rc = driver.compile(query); Assert.assertTrue("Got " + rc + ", expected not zero", rc != 0); Assert.assertTrue(driver.getErrorMsg(), driver.getErrorMsg().contains("Decimal precision out of allowed range [1,38]")); }
@Test public void testDecimalType7() throws ParseException { String query = "create table `dec` (d decimal(7,33,4))"; Driver driver = createDriver(); int rc = driver.compile(query); Assert.assertTrue("Got " + rc + ", expected not zero", rc != 0); Assert.assertTrue(driver.getErrorMsg(), driver.getErrorMsg().contains("missing ) at ',' near ',' in column name or constraint")); }
@Test public void testDecimalType3() throws ParseException { String query = "create table `dec` (d decimal(66,7))"; Driver driver = createDriver(); int rc = driver.compile(query); Assert.assertTrue("Got " + rc + ", expected not zero", rc != 0); Assert.assertTrue(driver.getErrorMsg(), driver.getErrorMsg().contains("Decimal precision out of allowed range [1,38]")); }
@Test public void testDecimalType9() throws ParseException { String query = "create table `dec` (d decimal(20,23))"; Driver driver = createDriver(); int rc = driver.compile(query); Assert.assertTrue("Got " + rc + ", expected not zero", rc != 0); Assert.assertTrue(driver.getErrorMsg(), driver.getErrorMsg().contains("Decimal scale must be less than or equal to precision")); }
private String getColumnType(String query) { Driver driver = createDriver(); int rc = driver.compile(query); if (rc != 0) { return null; } QueryPlan plan = driver.getPlan(); DDLTask task = (DDLTask) plan.getRootTasks().get(0); DDLWork work = task.getWork(); CreateTableDesc spec = work.getCreateTblDesc(); FieldSchema fs = spec.getCols().get(0); return fs.getType(); }
@Test public void testDecimalType8() throws ParseException { String query = "create table `dec` (d decimal(7a))"; Driver driver = createDriver(); int rc = driver.compile(query); Assert.assertTrue("Got " + rc + ", expected not zero", rc != 0); Assert.assertTrue(driver.getErrorMsg(), driver.getErrorMsg().contains("mismatched input '7a' expecting Number near '('")); }
@Test public void testDecimalType5() throws ParseException { String query = "create table `dec` (d decimal(7,33))"; Driver driver = createDriver(); int rc = driver.compile(query); Assert.assertTrue("Got " + rc + ", expected not zero", rc != 0); Assert.assertTrue(driver.getErrorMsg(), driver.getErrorMsg().contains("Decimal scale must be less than or equal to precision")); }
@Test public void testDecimalType6() throws ParseException { String query = "create table `dec` (d decimal(7,-1))"; Driver driver = createDriver(); int rc = driver.compile(query); Assert.assertTrue("Got " + rc + ", expected not zero", rc != 0); Assert.assertTrue(driver.getErrorMsg(), driver.getErrorMsg().contains("extraneous input '-' expecting Number")); }
@Test public void testQueryRedactor() throws Exception { HiveConf conf = new HiveConf(TestHooks.class); HiveConf.setVar(conf, HiveConf.ConfVars.QUERYREDACTORHOOKS, SimpleQueryRedactor.class.getName()); conf .setVar(HiveConf.ConfVars.HIVE_AUTHORIZATION_MANAGER, "org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory"); Driver driver = createDriver(conf); int ret = driver.compile("select 'XXX' from t1"); assertEquals("Checking command success", 0, ret); assertEquals("select 'AAA' from t1", conf.getQueryString()); }
/** * Underlying table of view should be marked as indirect. Query with join of views and aliases * * @throws ParseException */ @Test public void testSelectEntityInDirectJoinAlias() throws ParseException { Driver driver = createDriver(); int ret = driver.compile("select * from v1 as a join v1 as b on (a.i = b.i)"); assertEquals("Checking command success", 0, ret); assertEquals(2, CheckInputReadEntityDirect.readEntities.size()); for (ReadEntity readEntity : CheckInputReadEntityDirect.readEntities) { if (readEntity.getName().equals("default@t1")) { assertFalse("not direct", readEntity.isDirect()); } else if (readEntity.getName().equals("default@v1")) { assertTrue("direct", readEntity.isDirect()); } else { fail("unexpected entity name " + readEntity.getName()); } } }
/** * Underlying table of view should be marked as direct, as it is also accessed * directly in the union-all query * * @throws ParseException */ @Test public void testSelectEntityViewDirectUnion() throws ParseException { Driver driver = createDriver(); int ret = driver.compile("select * from ( select * from v1 union all select * from t1) uv1t1"); assertEquals("Checking command success", 0, ret); assertEquals(2, CheckInputReadEntityDirect.readEntities.size()); for (ReadEntity readEntity : CheckInputReadEntityDirect.readEntities) { if (readEntity.getName().equals("default@t1")) { assertTrue("direct", readEntity.isDirect()); } else if (readEntity.getName().equals("default@v1")) { assertTrue("direct", readEntity.isDirect()); } else { fail("unexpected entity name " + readEntity.getName()); } } }
/** * Underlying table of view should be marked as indirect * * @throws ParseException */ @Test public void testSelectEntityInDirect() throws ParseException { Driver driver = createDriver(); int ret = driver.compile("select * from v1"); assertEquals("Checking command success", 0, ret); assertEquals(2, CheckInputReadEntityDirect.readEntities.size()); for (ReadEntity readEntity : CheckInputReadEntityDirect.readEntities) { if (readEntity.getName().equals("default@t1")) { assertFalse("not direct", readEntity.isDirect()); } else if (readEntity.getName().equals("default@v1")) { assertTrue("direct", readEntity.isDirect()); } else { fail("unexpected entity name " + readEntity.getName()); } } }