/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.presto.plugin.postgresql; import com.facebook.presto.tests.AbstractTestQueries; import com.facebook.presto.tests.datatype.CreateAndInsertDataSetup; import com.facebook.presto.tests.datatype.CreateAsSelectDataSetup; import com.facebook.presto.tests.datatype.DataSetup; import com.facebook.presto.tests.datatype.DataType; import com.facebook.presto.tests.datatype.DataTypeTest; import com.facebook.presto.tests.sql.JdbcSqlExecutor; import com.facebook.presto.tests.sql.PrestoSqlExecutor; import io.airlift.testing.postgresql.TestingPostgreSqlServer; import io.airlift.tpch.TpchTable; import org.testng.annotations.AfterClass; import org.testng.annotations.Test; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.function.Function; import static com.facebook.presto.plugin.postgresql.PostgreSqlQueryRunner.createPostgreSqlQueryRunner; import static com.facebook.presto.tests.datatype.DataType.varcharDataType; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; @Test public class TestPostgreSqlDistributedQueries extends AbstractTestQueries { private final TestingPostgreSqlServer postgreSqlServer; public TestPostgreSqlDistributedQueries() throws Exception { this(new TestingPostgreSqlServer("testuser", "tpch")); } public TestPostgreSqlDistributedQueries(TestingPostgreSqlServer postgreSqlServer) throws Exception { super(() -> createPostgreSqlQueryRunner(postgreSqlServer, TpchTable.getTables())); this.postgreSqlServer = postgreSqlServer; } @AfterClass(alwaysRun = true) public final void destroy() throws IOException { postgreSqlServer.close(); } @Override public void testLargeIn() { // the PostgreSQL query fails with "stack depth limit exceeded" // TODO: fix QueryBuilder not to generate such a large query // https://github.com/prestodb/presto/issues/5752 } @Test public void testDropTable() { assertUpdate("CREATE TABLE test_drop AS SELECT 123 x", 1); assertTrue(getQueryRunner().tableExists(getSession(), "test_drop")); assertUpdate("DROP TABLE test_drop"); assertFalse(getQueryRunner().tableExists(getSession(), "test_drop")); } @Test public void testViews() throws Exception { execute("CREATE OR REPLACE VIEW tpch.test_view AS SELECT * FROM tpch.orders"); assertQuery("SELECT orderkey FROM test_view", "SELECT orderkey FROM orders"); execute("DROP VIEW IF EXISTS tpch.test_view"); } @Test public void testPrestoCreatedParameterizedVarchar() { varcharDataTypeTest().execute(getQueryRunner(), prestoCreateAsSelect("presto_test_parameterized_varchar")); } @Test public void testPostgreSqlCreatedParameterizedVarchar() { varcharDataTypeTest().execute(getQueryRunner(), postgresCreateAndInsert("tpch.postgresql_test_parameterized_varchar")); } private DataTypeTest varcharDataTypeTest() { return DataTypeTest.create() .addRoundTrip(varcharDataType(10), "text_a") .addRoundTrip(varcharDataType(255), "text_b") .addRoundTrip(varcharDataType(65535), "text_d") .addRoundTrip(varcharDataType(10485760), "text_f") .addRoundTrip(varcharDataType(), "unbounded"); } @Test public void testPrestoCreatedParameterizedVarcharUnicode() { unicodeVarcharDateTypeTest().execute(getQueryRunner(), prestoCreateAsSelect("postgresql_test_parameterized_varchar_unicode")); } @Test public void testPostgreSqlCreatedParameterizedVarcharUnicode() { unicodeVarcharDateTypeTest().execute(getQueryRunner(), postgresCreateAndInsert("tpch.postgresql_test_parameterized_varchar_unicode")); } @Test public void testPrestoCreatedParameterizedCharUnicode() { unicodeDataTypeTest(DataType::charDataType).execute(getQueryRunner(), prestoCreateAsSelect("postgresql_test_parameterized_char_unicode")); } @Test public void testPostgreSqlCreatedParameterizedCharUnicode() { unicodeDataTypeTest(DataType::charDataType).execute(getQueryRunner(), postgresCreateAndInsert("tpch.postgresql_test_parameterized_char_unicode")); } private DataTypeTest unicodeVarcharDateTypeTest() { return unicodeDataTypeTest(DataType::varcharDataType).addRoundTrip(varcharDataType(), "\u041d\u0443, \u043f\u043e\u0433\u043e\u0434\u0438!"); } private DataTypeTest unicodeDataTypeTest(Function<Integer, DataType<String>> dataTypeFactory) { String sampleUnicodeText = "\u653b\u6bbb\u6a5f\u52d5\u968a"; String sampleFourByteUnicodeCharacter = "\uD83D\uDE02"; return DataTypeTest.create() .addRoundTrip(dataTypeFactory.apply(sampleUnicodeText.length()), sampleUnicodeText) .addRoundTrip(dataTypeFactory.apply(32), sampleUnicodeText) .addRoundTrip(dataTypeFactory.apply(20000), sampleUnicodeText) .addRoundTrip(dataTypeFactory.apply(1), sampleFourByteUnicodeCharacter); } private DataSetup prestoCreateAsSelect(String tableNamePrefix) { return new CreateAsSelectDataSetup(new PrestoSqlExecutor(getQueryRunner()), tableNamePrefix); } private DataSetup postgresCreateAndInsert(String tableNamePrefix) { return new CreateAndInsertDataSetup(new JdbcSqlExecutor(postgreSqlServer.getJdbcUrl()), tableNamePrefix); } private void execute(String sql) throws SQLException { try (Connection connection = DriverManager.getConnection(postgreSqlServer.getJdbcUrl()); Statement statement = connection.createStatement()) { statement.execute(sql); } } }