/** * Takes a SQL string representing a Command and returns the object * representation. * @param sql SQL string * @param parseInfo - instructions to parse * @return SQL object representation * @throws QueryParserException if parsing fails * @throws IllegalArgumentException if sql is null */ public Command parseCommand(String sql, ParseInfo parseInfo) throws QueryParserException { return parseCommand(sql, parseInfo, false); }
/** * Takes a SQL string representing a Command and returns the object * representation. * @param sql SQL string * instead of string litral * @return SQL object representation * @throws QueryParserException if parsing fails * @throws IllegalArgumentException if sql is null */ public Command parseCommand(String sql) throws QueryParserException { return parseCommand(sql, new ParseInfo()); }
public static final CommandStatement sample1() { QueryParser parser = new QueryParser(); try { Query query = (Query) parser.parseCommand("Select x from y"); //$NON-NLS-1$ return new CommandStatement(query); } catch(Exception e) { return null;} }
public Command helpResolve(String sql, QueryMetadataInterface metadata) throws QueryParserException, QueryResolverException, TeiidComponentException { Command command = QueryParser.getQueryParser().parseCommand(sql); QueryResolver.resolveCommand(command, metadata); return command; }
static Command helpParse(String sql) { // parse try { return QueryParser.getQueryParser().parseCommand(sql); } catch(TeiidException e) { throw new TeiidRuntimeException(e); } }
@Test public void testSourceHint() throws QueryParserException { String sql = "SELECT /*+ sh:'foo' oracle:'leading' */ a FROM x limit 1"; //$NON-NLS-1$ assertEquals("SELECT /*+sh:'foo' oracle:'leading' */ a FROM x LIMIT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); //$NON-NLS-1$ sql = "(SELECT /*+ sh:'foo' oracle:'leading' */ a FROM x limit 1) union all select 1"; //$NON-NLS-1$ assertEquals("(SELECT /*+sh:'foo' oracle:'leading' */ a FROM x LIMIT 1) UNION ALL SELECT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); sql = "(SELECT /*+ sh keep aliases:'foo' oracle keep aliases:'leading' */ a FROM x limit 1) union all select 1"; //$NON-NLS-1$ assertEquals("(SELECT /*+sh KEEP ALIASES:'foo' oracle KEEP ALIASES:'leading' */ a FROM x LIMIT 1) UNION ALL SELECT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); sql = "(SELECT /*+ sh keep aliases oracle:'leading' */ a FROM x limit 1) union all select 1"; //$NON-NLS-1$ assertEquals("(SELECT /*+sh KEEP ALIASES oracle:'leading' */ a FROM x LIMIT 1) UNION ALL SELECT 1", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); }
@Test public void testConsecutivePeriod() throws QueryParserException { String sql = "SELECT * from \"t..able\""; //by our current naming rules this is the same - but as we don't allow . in the schema name it is not correct. assertEquals("SELECT * FROM \"t.\".able", QueryParser.getQueryParser().parseCommand(sql, ParseInfo.DEFAULT_INSTANCE).toString()); //ensures a stable parsing assertEquals("SELECT * FROM \"t.\".able", QueryParser.getQueryParser().parseCommand("SELECT * FROM \"t.\".able", ParseInfo.DEFAULT_INSTANCE).toString()); }
@Test public void testDateTimeKeywordLiterals() throws QueryParserException { String sql = "select DATE '1970-01-02', TIME '00:01:02', TIMESTAMP '2001-01-01 02:03:04.1'"; Query actualCommand = (Query)QueryParser.getQueryParser().parseCommand(sql, new ParseInfo()); assertEquals("SELECT {d'1970-01-02'}, {t'00:01:02'}, {ts'2001-01-01 02:03:04.1'}", actualCommand.toString()); }
@Test public void testUnionBranchOrderBy() throws Exception { Command command = QueryParser.getQueryParser().parseCommand("select pm1.g1.e1 from pm1.g1 union (select e2 from pm1.g2 order by e1)"); //$NON-NLS-1$ QueryResolver.resolveCommand(command, RealMetadataFactory.example1Cached()); helpTest(command, "SELECT pm1.g1.e1 FROM pm1.g1 UNION (SELECT e2 FROM pm1.g2 ORDER BY e1)"); //$NON-NLS-1$ }
@Test public void testAliasedOrderBy() throws Exception { Command command = QueryParser.getQueryParser().parseCommand("select pm1.g1.e1 as a from pm1.g1 order by a"); //$NON-NLS-1$ QueryResolver.resolveCommand(command, RealMetadataFactory.example1Cached()); helpTest(command, "SELECT pm1.g1.e1 AS a FROM pm1.g1 ORDER BY a"); //$NON-NLS-1$ }
@Test public void testInsert5() throws Exception { QueryMetadataInterface metadata = exampleMetadata1(); Command command = QueryParser.getQueryParser().parseCommand("INSERT INTO test.group (e1, e2) VALUES ('x', 'y')"); //$NON-NLS-1$ QueryResolver.resolveCommand(command, metadata); helpRunValidator(command, new String[] {"test.\"group\".e0"}, metadata); //$NON-NLS-1$ }
@Test public void testValidateInModeler() throws Exception{ // SQL is same as pm1.vsp36() in example1 String sql = "CREATE VIRTUAL PROCEDURE BEGIN select 1, 2; END"; //$NON-NLS-1$ QueryMetadataInterface metadata = RealMetadataFactory.example1Cached(); Command command = QueryParser.getQueryParser().parseCommand(sql); GroupSymbol group = new GroupSymbol("pm1.vsp36"); QueryResolver.resolveCommand(command, group, Command.TYPE_STORED_PROCEDURE, metadata, true); assertEquals(2, command.getResultSetColumns().size()); }
@Test public void testNationCharString2() throws Exception { Query query = (Query) QueryParser.getQueryParser().parseCommand("SELECT DISTINCT TABLE_QUALIFIER, NULL AS TABLE_OWNER, NULL AS TABLE_NAME, NULL AS TABLE_TYPE, NULL AS REMARKS FROM ATIODBCSYSTEM.OA_TABLES WHERE TABLE_QUALIFIER LIKE N'%' ESCAPE '\\' ORDER BY TABLE_QUALIFIER "); //$NON-NLS-1$ MatchCriteria matchCrit = (MatchCriteria) query.getCriteria(); Constant c = (Constant) matchCrit.getRightExpression(); assertEquals(c, new Constant("%")); //$NON-NLS-1$ }
@Test public void testLookupKeyElementComparable() throws Exception { QueryMetadataInterface metadata = exampleMetadata2(); String sql = "SELECT lookup('test.group', 'e2', 'e3', convert(e2, blob)) AS x FROM test.group"; //$NON-NLS-1$ Command command = QueryParser.getQueryParser().parseCommand(sql); QueryResolver.resolveCommand(command, metadata); ValidatorReport report = Validator.validate(command, metadata); assertEquals("Non-comparable expression of type blob cannot be used as LOOKUP key columns: test.\"group\".e3.", report.toString()); //$NON-NLS-1$ }
@Test public void testAlterView() throws Exception { AlterView alterView = new AlterView(); alterView.setTarget(new GroupSymbol("x")); alterView.setDefinition((QueryCommand) QueryParser.getQueryParser().parseCommand("/*+ cache */ SELECT 1")); helpTest("alter view x as /*+ cache */ select 1", "ALTER VIEW x AS\n/*+ cache */ SELECT 1", alterView); }
@Test public void testAlterProc() throws Exception { AlterView alterView = new AlterView(); alterView.setTarget(new GroupSymbol("x")); alterView.setDefinition((QueryCommand) QueryParser.getQueryParser().parseCommand("/*+ cache */ SELECT 1")); helpTest("alter view x as /*+ cache */ select 1", "ALTER VIEW x AS\n/*+ cache */ SELECT 1", alterView); }
@Test public void testBinaryStringLiteral() throws QueryParserException { Query actualCommand = (Query)QueryParser.getQueryParser().parseCommand("SELECT x'AABBCC0a'", new ParseInfo()); assertEquals(DataTypeManager.DefaultDataClasses.VARBINARY, actualCommand.getSelect().getSymbol(0).getType()); assertEquals("SELECT X'AABBCC0A'", actualCommand.toString()); }
@Test public void testNestedViewAliasing() throws Exception { String sql = "select e1, e2 from (select y.e1, y.e2 from (select pm1.g1.e1, 1 as e2 from pm1.g1) y) z"; //$NON-NLS-1$ Query command = (Query)QueryParser.getQueryParser().parseCommand(sql); QueryResolver.resolveCommand(command, RealMetadataFactory.example1Cached()); command = (Query) command.clone(); command.acceptVisitor(new AliasGenerator(true)); assertEquals("SELECT v_1.c_0, v_1.c_1 FROM (SELECT v_0.c_0, v_0.c_1 FROM (SELECT g_0.e1 AS c_0, 1 AS c_1 FROM pm1.g1 AS g_0) AS v_0) AS v_1", command.toString()); //$NON-NLS-1$ }
@Test public void testNonAutoConversionOfLiteralIntegerToShort() throws Exception { // parse Query command = (Query) QueryParser.getQueryParser().parseCommand("SELECT intkey FROM bqt1.smalla WHERE shortvalue = 5"); //$NON-NLS-1$ // resolve QueryResolver.resolveCommand(command, RealMetadataFactory.exampleBQTCached()); // Check whether an implicit conversion was added on the correct side CompareCriteria crit = (CompareCriteria) command.getCriteria(); assertEquals(DataTypeManager.DefaultDataClasses.SHORT, crit.getRightExpression().getType()); assertEquals("Sql is incorrect after resolving", "SELECT intkey FROM bqt1.smalla WHERE shortvalue = 5", command.toString()); //$NON-NLS-1$ //$NON-NLS-2$ }
/** * Ensures that views are named with v_ even without metadata */ @Test public void testViewAliasing() throws Exception { String sql = "select y.e1 from (select pm1.g1.e1 from pm1.g1) y"; //$NON-NLS-1$ Query command = (Query)QueryParser.getQueryParser().parseCommand(sql); ((ElementSymbol)command.getSelect().getSymbol(0)).setGroupSymbol(new GroupSymbol("y")); //$NON-NLS-1$ command.acceptVisitor(new AliasGenerator(true)); assertEquals("SELECT v_0.c_0 FROM (SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0) AS v_0", command.toString()); //$NON-NLS-1$ }