/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.translator.phoenix; import static org.junit.Assert.*; import org.junit.Test; import org.teiid.cdk.api.TranslationUtility; import org.teiid.language.Command; import org.teiid.translator.TranslatorException; import org.teiid.translator.jdbc.SQLConversionVisitor; import org.teiid.translator.phoenix.PhoenixExecutionFactory; @SuppressWarnings("nls") public class TestSQLConversionVisitor { @Test public void testInsert() throws TranslatorException { String sql = "INSERT INTO Customer VALUES('106', 'Beijing', 'Kylin Soong', '$8000.00', 'Crystal Orange')"; String expected = "UPSERT INTO \"Customer\" (ROW_ID, \"city\", \"name\", \"amount\", \"product\") VALUES ('106', 'Beijing', 'Kylin Soong', '$8000.00', 'Crystal Orange')"; helpTest(sql, expected); sql = "INSERT INTO Customer(PK, city, name) VALUES ('109', 'Beijing', 'Kylin Soong')"; expected = "UPSERT INTO \"Customer\" (ROW_ID, \"city\", \"name\") VALUES ('109', 'Beijing', 'Kylin Soong')"; helpTest(sql, expected); } @Test public void testUpdate() throws TranslatorException { String sql = "update Customer set city = 'Beijing' where name = 'Kylin Soong'"; String expected = "UPSERT INTO \"Customer\" (\"city\", ROW_ID) SELECT 'Beijing', \"Customer\".ROW_ID FROM \"Customer\" WHERE \"Customer\".\"name\" = 'Kylin Soong'"; helpTest(sql, expected); sql = "UPDATE smalla SET StringKey = '55' WHERE smalla.StringKey IS NULL"; expected = "UPSERT INTO smalla (stringkey) SELECT '55' FROM smalla WHERE smalla.stringkey IS NULL"; helpTest(sql, expected); } @Test public void testSelect() throws TranslatorException { String sql = "SELECT * FROM Customer"; String expected = "SELECT \"Customer\".ROW_ID, \"Customer\".\"city\", \"Customer\".\"name\", \"Customer\".\"amount\", \"Customer\".\"product\" FROM \"Customer\""; helpTest(sql, expected); sql = "SELECT city, amount FROM Customer"; expected = "SELECT \"Customer\".\"city\", \"Customer\".\"amount\" FROM \"Customer\""; helpTest(sql, expected); sql = "SELECT DISTINCT city FROM Customer"; expected = "SELECT DISTINCT \"Customer\".\"city\" FROM \"Customer\""; helpTest(sql, expected); sql = "SELECT city, amount FROM Customer WHERE PK='105'"; expected = "SELECT \"Customer\".\"city\", \"Customer\".\"amount\" FROM \"Customer\" WHERE \"Customer\".ROW_ID = '105'"; helpTest(sql, expected); sql = "SELECT city, amount FROM Customer WHERE PK='105' OR name='John White'"; expected = "SELECT \"Customer\".\"city\", \"Customer\".\"amount\" FROM \"Customer\" WHERE \"Customer\".ROW_ID = '105' OR \"Customer\".\"name\" = 'John White'"; helpTest(sql, expected); sql = "SELECT city, amount FROM Customer WHERE PK='105' AND name='John White'"; expected = "SELECT \"Customer\".\"city\", \"Customer\".\"amount\" FROM \"Customer\" WHERE \"Customer\".ROW_ID = '105' AND \"Customer\".\"name\" = 'John White'"; helpTest(sql, expected); } @Test public void testSelectOrderBy() throws TranslatorException { String sql = "SELECT * FROM Customer ORDER BY PK"; String expected = "SELECT \"Customer\".ROW_ID, \"Customer\".\"city\", \"Customer\".\"name\", \"Customer\".\"amount\", \"Customer\".\"product\" FROM \"Customer\" ORDER BY \"Customer\".ROW_ID"; helpTest(sql, expected); sql = "SELECT * FROM Customer ORDER BY PK ASC"; expected = "SELECT \"Customer\".ROW_ID, \"Customer\".\"city\", \"Customer\".\"name\", \"Customer\".\"amount\", \"Customer\".\"product\" FROM \"Customer\" ORDER BY \"Customer\".ROW_ID"; helpTest(sql, expected); sql = "SELECT * FROM Customer ORDER BY PK DESC"; expected = "SELECT \"Customer\".ROW_ID, \"Customer\".\"city\", \"Customer\".\"name\", \"Customer\".\"amount\", \"Customer\".\"product\" FROM \"Customer\" ORDER BY \"Customer\".ROW_ID DESC"; helpTest(sql, expected); sql = "SELECT * FROM Customer ORDER BY name, city DESC"; expected = "SELECT \"Customer\".ROW_ID, \"Customer\".\"city\", \"Customer\".\"name\", \"Customer\".\"amount\", \"Customer\".\"product\" FROM \"Customer\" ORDER BY \"Customer\".\"name\", \"Customer\".\"city\" DESC"; helpTest(sql, expected); } @Test public void testSelectGroupBy() throws TranslatorException{ String sql = "SELECT COUNT(PK) FROM Customer WHERE name='John White'"; String expected = "SELECT COUNT(\"Customer\".ROW_ID) FROM \"Customer\" WHERE \"Customer\".\"name\" = 'John White'"; helpTest(sql, expected); sql = "SELECT name, COUNT(PK) FROM Customer GROUP BY name"; expected = "SELECT \"Customer\".\"name\", COUNT(\"Customer\".ROW_ID) FROM \"Customer\" GROUP BY \"Customer\".\"name\""; helpTest(sql, expected); sql = "SELECT name, COUNT(PK) FROM Customer GROUP BY name HAVING COUNT(PK) > 1"; expected = "SELECT \"Customer\".\"name\", COUNT(\"Customer\".ROW_ID) FROM \"Customer\" GROUP BY \"Customer\".\"name\" HAVING COUNT(\"Customer\".ROW_ID) > 1"; helpTest(sql, expected); sql = "SELECT name, city, COUNT(PK) FROM Customer GROUP BY name, city"; expected = "SELECT \"Customer\".\"name\", \"Customer\".\"city\", COUNT(\"Customer\".ROW_ID) FROM \"Customer\" GROUP BY \"Customer\".\"name\", \"Customer\".\"city\""; helpTest(sql, expected); sql = "SELECT name, city, COUNT(PK) FROM Customer GROUP BY name, city HAVING COUNT(PK) > 1"; expected = "SELECT \"Customer\".\"name\", \"Customer\".\"city\", COUNT(\"Customer\".ROW_ID) FROM \"Customer\" GROUP BY \"Customer\".\"name\", \"Customer\".\"city\" HAVING COUNT(\"Customer\".ROW_ID) > 1"; helpTest(sql, expected); } @Test public void testSelectLimit() throws TranslatorException { String sql = "SELECT * FROM Customer LIMIT 3"; String expected = "SELECT \"Customer\".ROW_ID, \"Customer\".\"city\", \"Customer\".\"name\", \"Customer\".\"amount\", \"Customer\".\"product\" FROM \"Customer\" LIMIT 3"; helpTest(sql, expected); sql = "SELECT * FROM Customer ORDER BY PK LIMIT 3"; expected = "SELECT \"Customer\".ROW_ID, \"Customer\".\"city\", \"Customer\".\"name\", \"Customer\".\"amount\", \"Customer\".\"product\" FROM \"Customer\" ORDER BY \"Customer\".ROW_ID LIMIT 3"; helpTest(sql, expected); } @Test public void testSelectLimit_2() throws TranslatorException { String sql = "SELECT product FROM Customer LIMIT 3, 3"; String expected = "SELECT \"Customer\".\"product\" FROM \"Customer\" LIMIT 3 OFFSET 3"; helpTest(sql, expected); } @Test public void testFuntionSubstring() throws TranslatorException { String sql = "SELECT SUBSTRING(q1, 10) FROM TypesTest"; String expected = "SELECT SUBSTR(TypesTest.q1, 10) FROM TypesTest"; helpTest(sql, expected); sql = "SELECT SUBSTRING(q1, 10, 5) FROM TypesTest"; expected = "SELECT SUBSTR(TypesTest.q1, 10, 5) FROM TypesTest"; helpTest(sql, expected); } @Test public void testFuntionUcaseLcase() throws TranslatorException { String sql = "SELECT UCASE(q1) FROM TypesTest"; String expected = "SELECT UPPER(TypesTest.q1) FROM TypesTest"; helpTest(sql, expected); sql = "SELECT LCASE(q1) FROM TypesTest"; expected = "SELECT LOWER(TypesTest.q1) FROM TypesTest"; helpTest(sql, expected); } @Test public void testFuntionLocate() throws TranslatorException { String sql = "SELECT LOCATE(q1, 'foo') FROM TypesTest"; String expected = "SELECT INSTR(TypesTest.q1, 'foo') FROM TypesTest"; helpTest(sql, expected); } @Test public void testFunctionCurtime() throws TranslatorException { String sql = "SELECT q1, CURTIME() FROM TypesTest"; String expected = "SELECT TypesTest.q1, CURRENT_TIME() FROM TypesTest"; helpTest(sql, expected); } @Test public void testBooleanLiterals() throws Exception { String sql = "SELECT true, false FROM Customer"; String expected = "SELECT true, false FROM \"Customer\""; helpTest(sql, expected); } @Test public void testBigDecimalLiteral() throws Exception { String sql = "SELECT cast(1 as bigdecimal) FROM Customer"; String expected = "SELECT 1.0 FROM \"Customer\""; helpTest(sql, expected); } @Test public void testDateTimeLiterals() throws Exception { String sql = "SELECT {d '2001-01-01'}, {t '23:00:02'}, {ts '2004-02-01 11:11:11.001'} FROM Customer"; String expected = "SELECT DATE '2001-01-01 00:00:00.0', TIME '1970-01-01 23:00:02.0', TIMESTAMP '2004-02-01 11:11:11.001' FROM \"Customer\""; helpTest(sql, expected); } @Test public void testLikeEscape() throws TranslatorException { String sql = "SELECT city FROM Customer where name like '\\_%' escape '\\'"; String expected = "SELECT \"Customer\".\"city\" FROM \"Customer\" WHERE \"Customer\".\"name\" LIKE '\\_%'"; helpTest(sql, expected); } @Test public void testUnion() throws TranslatorException { String sql = "SELECT city as c1 FROM Customer union SELECT name FROM Customer"; String expected = "SELECT DISTINCT c1 FROM (SELECT \"Customer\".\"city\" AS c1 FROM \"Customer\" UNION ALL SELECT \"Customer\".\"name\" FROM \"Customer\") AS x"; helpTest(sql, expected); } @Test public void testCorrelatedIn() throws TranslatorException { String sql = "SELECT city as c1 FROM Customer where name in (select name from customer cu where cu.city = customer.city)"; String expected = "SELECT \"Customer\".\"city\" AS c1 FROM \"Customer\" WHERE \"Customer\".\"name\" = SOME (SELECT cu.\"name\" FROM \"Customer\" AS cu WHERE cu.\"city\" = \"Customer\".\"city\")"; helpTest(sql, expected); sql = "SELECT city as c1 FROM Customer where name not in (select name from customer cu where cu.city = customer.city)"; expected = "SELECT \"Customer\".\"city\" AS c1 FROM \"Customer\" WHERE \"Customer\".\"name\" <> ALL (SELECT cu.\"name\" FROM \"Customer\" AS cu WHERE cu.\"city\" = \"Customer\".\"city\")"; helpTest(sql, expected); } private static TranslationUtility translationUtility = new TranslationUtility(TestPhoenixUtil.queryMetadataInterface()); private void helpTest(String sql, String expected) throws TranslatorException { Command command = translationUtility.parseCommand(sql); PhoenixExecutionFactory ef = new PhoenixExecutionFactory(); ef.start(); SQLConversionVisitor vistor = ef.getSQLConversionVisitor(); vistor.append(command); assertEquals(expected, vistor.toString()); } }