diff --git a/java/jdbc/pom.xml b/java/jdbc/pom.xml index dd554e64501..a52048576a1 100644 --- a/java/jdbc/pom.xml +++ b/java/jdbc/pom.xml @@ -57,25 +57,6 @@ 3.12.4 test - - - org.powermock - powermock-api-mockito2 - 2.0.9 - test - - - org.powermock - powermock-core - 2.0.9 - test - - - org.powermock - powermock-module-junit4 - 2.0.9 - test - diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java deleted file mode 100644 index 318bf44d328..00000000000 --- a/java/jdbc/src/test/java/io/vitess/jdbc/FieldWithMetadataTest.java +++ /dev/null @@ -1,637 +0,0 @@ -/* - * Copyright 2019 The Vitess Authors. - - * 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 io.vitess.jdbc; - -import java.util.Set; -import java.util.EnumSet; - -import io.vitess.proto.Query; -import io.vitess.util.MysqlDefs; -import io.vitess.util.charset.CharsetMapping; - -import java.sql.SQLException; -import java.sql.Types; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.mockito.internal.verification.VerificationModeFactory; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -@PrepareForTest(FieldWithMetadata.class) -@RunWith(PowerMockRunner.class) -public class FieldWithMetadataTest extends BaseTest { - - @Test - public void testImplicitTempTable() throws SQLException { - Query.Field raw = Query.Field.newBuilder().setTable("#sql_my_temptable") - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).setType(Query.Type.VARCHAR).setName("foo") - .build(); - - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(getVitessConnection(), raw); - - Assert.assertEquals(true, fieldWithMetadata.isImplicitTemporaryTable()); - Assert.assertEquals(false, fieldWithMetadata.isOpaqueBinary()); - - VitessConnection conn = getVitessConnection(); - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - - raw = Query.Field.newBuilder().setType(Query.Type.VARCHAR).setName("foo").build(); - - fieldWithMetadata = new FieldWithMetadata(conn, raw); - - Assert.assertEquals(false, fieldWithMetadata.isImplicitTemporaryTable()); - Assert.assertEquals(false, fieldWithMetadata.isOpaqueBinary()); - } - - @Test - public void testBlobRemapping() throws SQLException { - VitessConnection conn = getVitessConnection(); - conn.setBlobsAreStrings(true); - - Query.Field raw = Query.Field.newBuilder().setTable("#sql_my_temptable") - .setCharset(/* latin1, doesn't matter just don't want utf8 for now */ 5) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).setType(Query.Type.BLOB).setName("foo") - .setOrgName("foo").build(); - - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.VARCHAR, fieldWithMetadata.getJavaType()); - - conn.setBlobsAreStrings(false); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.LONGVARCHAR, fieldWithMetadata.getJavaType()); - - conn.setFunctionsNeverReturnBlobs(true); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.VARCHAR, fieldWithMetadata.getJavaType()); - - conn.setFunctionsNeverReturnBlobs(false); - conn.setUseBlobToStoreUTF8OutsideBMP(true); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.LONGVARCHAR, fieldWithMetadata.getJavaType()); - - raw = raw.toBuilder().setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setColumnLength(MysqlDefs.LENGTH_BLOB).build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.VARCHAR, fieldWithMetadata.getJavaType()); - Assert.assertEquals("utf8_general_ci", fieldWithMetadata.getCollation()); - - conn.setUtf8OutsideBmpExcludedColumnNamePattern("^fo.*$"); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.LONGVARBINARY, fieldWithMetadata.getJavaType()); - Assert.assertNotEquals("utf8_general_ci", fieldWithMetadata.getCollation()); - - conn.setUtf8OutsideBmpIncludedColumnNamePattern("^foo$"); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.VARCHAR, fieldWithMetadata.getJavaType()); - Assert.assertEquals("utf8_general_ci", fieldWithMetadata.getCollation()); - - raw = raw.toBuilder().setColumnLength(MysqlDefs.LENGTH_LONGBLOB).build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.LONGVARCHAR, fieldWithMetadata.getJavaType()); - Assert.assertEquals("utf8_general_ci", fieldWithMetadata.getCollation()); - - conn.setUseBlobToStoreUTF8OutsideBMP(false); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.LONGVARBINARY, fieldWithMetadata.getJavaType()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.BLOB, fieldWithMetadata.getJavaType()); - Assert.assertEquals(null, fieldWithMetadata.getEncoding()); - Assert.assertEquals(null, fieldWithMetadata.getCollation()); - } - - @Test - public void testTinyIntAsBit() throws SQLException { - VitessConnection conn = getVitessConnection(); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setColumnLength(3) - .setType(Query.Type.INT8).setName("foo").setOrgName("foo").build(); - conn.setTinyInt1isBit(true); - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.TINYINT, fieldWithMetadata.getJavaType()); - - raw = raw.toBuilder().setColumnLength(1).build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.BIT, fieldWithMetadata.getJavaType()); - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.TINYINT, fieldWithMetadata.getJavaType()); - } - - @Test - public void testNonNumericNotDateTimeRemapping() throws SQLException { - VitessConnection conn = getVitessConnection(); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setColumnLength(3) - .setType(Query.Type.VARBINARY).setName("foo").setOrgName("foo") - .setCharset(/* utf-16 UnicodeBig */35).build(); - - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(/* remapped by TEXT special case */Types.VARCHAR, - fieldWithMetadata.getJavaType()); - Assert.assertEquals("UTF-16", fieldWithMetadata.getEncoding()); - Assert.assertEquals(false, fieldWithMetadata.isSingleBit()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.VARBINARY, fieldWithMetadata.getJavaType()); - Assert.assertEquals(null, fieldWithMetadata.getEncoding()); - Assert.assertEquals(false, fieldWithMetadata.isSingleBit()); - - conn = getVitessConnection(); - raw = raw.toBuilder().setType(Query.Type.JSON).setColumnLength(MysqlDefs.LENGTH_LONGBLOB) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary).build(); - - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.CHAR, fieldWithMetadata.getJavaType()); - Assert.assertEquals("UTF-8", fieldWithMetadata.getEncoding()); - Assert.assertEquals(false, fieldWithMetadata.isSingleBit()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.CHAR, fieldWithMetadata.getJavaType()); - Assert.assertEquals(null, fieldWithMetadata.getEncoding()); - Assert.assertEquals(false, fieldWithMetadata.isSingleBit()); - - conn = getVitessConnection(); - raw = raw.toBuilder().setType(Query.Type.BIT).build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.BIT, fieldWithMetadata.getJavaType()); - Assert.assertEquals("ISO-8859-1", fieldWithMetadata.getEncoding()); - Assert.assertEquals(false, fieldWithMetadata.isSingleBit()); - Assert.assertEquals(false, fieldWithMetadata.isBlob()); - Assert.assertEquals(false, fieldWithMetadata.isBinary()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.BIT, fieldWithMetadata.getJavaType()); - Assert.assertEquals(null, fieldWithMetadata.getEncoding()); - Assert.assertEquals(false, fieldWithMetadata.isSingleBit()); - Assert.assertEquals(false, fieldWithMetadata.isBlob()); - Assert.assertEquals(false, fieldWithMetadata.isBinary()); - - conn = getVitessConnection(); - raw = raw.toBuilder().setColumnLength(1).build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.BIT, fieldWithMetadata.getJavaType()); - Assert.assertEquals("ISO-8859-1", fieldWithMetadata.getEncoding()); - Assert.assertEquals(true, fieldWithMetadata.isSingleBit()); - Assert.assertEquals(false, fieldWithMetadata.isBlob()); - Assert.assertEquals(false, fieldWithMetadata.isBinary()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(Types.BIT, fieldWithMetadata.getJavaType()); - Assert.assertEquals(null, fieldWithMetadata.getEncoding()); - Assert.assertEquals(false, fieldWithMetadata.isSingleBit()); - Assert.assertEquals(false, fieldWithMetadata.isBlob()); - Assert.assertEquals(false, fieldWithMetadata.isBinary()); - } - - @Test - public void testVarBinaryToVarCharRemapping() throws SQLException { - VitessConnection conn = getVitessConnection(); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setColumnLength(3) - .setType(Query.Type.VARBINARY).setName("foo").setOrgName("foo") - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).build(); - - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert - .assertEquals("no remapping - base case", Types.VARBINARY, fieldWithMetadata.getJavaType()); - - raw = raw.toBuilder().setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_utf8).build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals("remap to varchar due to non-binary encoding", Types.VARCHAR, - fieldWithMetadata.getJavaType()); - } - - @Test - public void testBinaryToCharRemapping() throws SQLException { - VitessConnection conn = getVitessConnection(); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setColumnLength(3) - .setType(Query.Type.BINARY).setName("foo").setOrgName("foo") - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).build(); - - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals("no remapping - base case", Types.BINARY, fieldWithMetadata.getJavaType()); - - raw = raw.toBuilder().setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_utf8).build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals("remap to char due to non-binary encoding", Types.CHAR, - fieldWithMetadata.getJavaType()); - } - - @Test - public void testNumericAndDateTimeEncoding() throws SQLException { - VitessConnection conn = getVitessConnection(); - - Query.Type[] types = new Query.Type[]{Query.Type.INT8, Query.Type.UINT8, Query.Type.INT16, - Query.Type.UINT16, Query.Type.INT24, Query.Type.UINT24, Query.Type.INT32, Query.Type.UINT32, - Query.Type.INT64, Query.Type.UINT64, Query.Type.DECIMAL, Query.Type.UINT24, - Query.Type.INT32, Query.Type.UINT32, Query.Type.FLOAT32, Query.Type.FLOAT64, - Query.Type.DATE, Query.Type.DATETIME, Query.Type.TIME, Query.Type.TIMESTAMP, - Query.Type.YEAR}; - - for (Query.Type type : types) { - Query.Field raw = Query.Field.newBuilder().setTable("foo").setColumnLength(3).setType(type) - .setName("foo").setOrgName("foo").setCharset(/* utf-16 UnicodeBig */35).build(); - - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(type.name(), "US-ASCII", fieldWithMetadata.getEncoding()); - Assert.assertEquals(type.name(), false, fieldWithMetadata.isSingleBit()); - } - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - - for (Query.Type type : types) { - Query.Field raw = Query.Field.newBuilder().setTable("foo").setColumnLength(3).setType(type) - .setName("foo").setOrgName("foo").setCharset(/* utf-16 UnicodeBig */35).build(); - - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(type.name(), null, fieldWithMetadata.getEncoding()); - Assert.assertEquals(type.name(), false, fieldWithMetadata.isSingleBit()); - } - } - - // Define the types to skip - Set typesToSkip = EnumSet.of( - Query.Type.UNRECOGNIZED, - Query.Type.EXPRESSION, - Query.Type.HEXVAL, - Query.Type.HEXNUM, - Query.Type.BITNUM, - Query.Type.RAW, - Query.Type.ROW_TUPLE - ); - - @Test - public void testPrecisionAdjustFactor() throws SQLException { - VitessConnection conn = getVitessConnection(); - assertPrecisionEquals(conn, Query.Type.FLOAT32, true, 0, 0); - assertPrecisionEquals(conn, Query.Type.FLOAT64, true, 32, 0); - assertPrecisionEquals(conn, Query.Type.BIT, true, 0, 0); - assertPrecisionEquals(conn, Query.Type.DECIMAL, true, 0, -1); - assertPrecisionEquals(conn, Query.Type.DECIMAL, true, 3, -2); - assertPrecisionEquals(conn, Query.Type.INT32, true, /* this can't happen, but just checking */3, - -2); - assertPrecisionEquals(conn, Query.Type.INT32, true, 0, -1); - assertPrecisionEquals(conn, Query.Type.FLOAT32, false, 0, 0); - assertPrecisionEquals(conn, Query.Type.FLOAT64, false, 32, 0); - assertPrecisionEquals(conn, Query.Type.BIT, false, 0, 0); - assertPrecisionEquals(conn, Query.Type.DECIMAL, false, 0, -1); - assertPrecisionEquals(conn, Query.Type.DECIMAL, false, 3, -1); - assertPrecisionEquals(conn, Query.Type.UINT32, false, 0, 0); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - for (Query.Type type : Query.Type.values()) { - // Skip if the type is in the set - if (typesToSkip.contains(type)) { - continue; - } - - // All should be 0 - assertPrecisionEquals(conn, type, true, 0, 0); - assertPrecisionEquals(conn, type, false, 0, 0); - assertPrecisionEquals(conn, type, true, 2, 0); - assertPrecisionEquals(conn, type, false, 2, 0); - } - } - - private void assertPrecisionEquals(VitessConnection conn, Query.Type fieldType, boolean signed, - int decimals, int expectedPrecisionAdjustFactor) throws SQLException { - Query.Field raw = Query.Field.newBuilder().setTable("foo").setColumnLength(3).setType(fieldType) - .setDecimals(decimals).setFlags(signed ? 0 : Query.MySqlFlag.UNSIGNED_FLAG_VALUE) - .setName("foo").setOrgName("foo").build(); - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert - .assertEquals(expectedPrecisionAdjustFactor, fieldWithMetadata.getPrecisionAdjustFactor()); - } - - @Test - public void testFlags() throws SQLException { - VitessConnection conn = getVitessConnection(); - Query.Field raw = Query.Field.newBuilder().setTable("foo").setColumnLength(3) - .setType(Query.Type.VARBINARY).setName("foo").setOrgName("foo").build(); - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(false, fieldWithMetadata.isBinary()); - Assert.assertEquals(false, fieldWithMetadata.isBlob()); - Assert.assertEquals(false, fieldWithMetadata.isAutoIncrement()); - Assert.assertEquals(false, fieldWithMetadata.isMultipleKey()); - Assert.assertEquals(false, fieldWithMetadata.isNotNull()); - Assert.assertEquals(false, fieldWithMetadata.isPrimaryKey()); - Assert.assertEquals(false, fieldWithMetadata.isUniqueKey()); - Assert.assertEquals(false, fieldWithMetadata.isUnsigned()); - Assert.assertEquals(/* just inverses isUnsigned */true, fieldWithMetadata.isSigned()); - Assert.assertEquals(false, fieldWithMetadata.isZeroFill()); - - int value = 0; - for (Query.MySqlFlag flag : Query.MySqlFlag.values()) { - if (flag == Query.MySqlFlag.UNRECOGNIZED) { - continue; - } - value |= flag.getNumber(); - } - raw = raw.toBuilder().setFlags(value).build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(true, fieldWithMetadata.isBinary()); - Assert.assertEquals(true, fieldWithMetadata.isBlob()); - Assert.assertEquals(true, fieldWithMetadata.isAutoIncrement()); - Assert.assertEquals(true, fieldWithMetadata.isMultipleKey()); - Assert.assertEquals(true, fieldWithMetadata.isNotNull()); - Assert.assertEquals(true, fieldWithMetadata.isPrimaryKey()); - Assert.assertEquals(true, fieldWithMetadata.isUniqueKey()); - Assert.assertEquals(true, fieldWithMetadata.isUnsigned()); - Assert.assertEquals(/* just inverses isUnsigned */false, fieldWithMetadata.isSigned()); - Assert.assertEquals(true, fieldWithMetadata.isZeroFill()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(false, fieldWithMetadata.isBinary()); - Assert.assertEquals(false, fieldWithMetadata.isBlob()); - Assert.assertEquals(false, fieldWithMetadata.isAutoIncrement()); - Assert.assertEquals(false, fieldWithMetadata.isMultipleKey()); - Assert.assertEquals(true, fieldWithMetadata.isNotNull()); - Assert.assertEquals(false, fieldWithMetadata.isPrimaryKey()); - Assert.assertEquals(false, fieldWithMetadata.isUniqueKey()); - Assert.assertEquals(true, fieldWithMetadata.isUnsigned()); - Assert.assertEquals(/* just inverses isUnsigned */false, fieldWithMetadata.isSigned()); - Assert.assertEquals(false, fieldWithMetadata.isZeroFill()); - - } - - @Test - public void testOpaqueBinary() throws SQLException { - VitessConnection conn = getVitessConnection(); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setColumnLength(3) - .setType(Query.Type.CHAR).setName("foo").setOrgName("foo") - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).build(); - - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(true, fieldWithMetadata.isOpaqueBinary()); - - raw = raw.toBuilder().setTable("#sql_foo_bar").build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(false, fieldWithMetadata.isOpaqueBinary()); - - raw = raw.toBuilder() - .setCharset(/* short circuits collation -> encoding lookup, resulting in null */-1).build(); - - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(false, fieldWithMetadata.isOpaqueBinary()); - - conn.setEncoding("binary"); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(true, fieldWithMetadata.isOpaqueBinary()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(false, fieldWithMetadata.isOpaqueBinary()); - } - - @Test - public void testReadOnly() throws SQLException { - VitessConnection conn = getVitessConnection(); - Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) - .setName("foo").setOrgName("foo").setOrgTable("foo").build(); - FieldWithMetadata fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(false, fieldWithMetadata.isReadOnly()); - - raw = raw.toBuilder().setOrgName("").setOrgTable("foo").build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(true, fieldWithMetadata.isReadOnly()); - - raw = raw.toBuilder().setOrgName("foo").setOrgTable("").build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(true, fieldWithMetadata.isReadOnly()); - - raw = raw.toBuilder().setOrgTable("").setOrgName("").build(); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(true, fieldWithMetadata.isReadOnly()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = new FieldWithMetadata(conn, raw); - Assert.assertEquals(false, fieldWithMetadata.isReadOnly()); - } - - @Test - public void testDefaultsWithoutAllFields() throws SQLException { - Query.Field raw = Query.Field.newBuilder().setName("foo").setOrgName("foo").setTable("foo") - .setOrgTable("foo").setDatabase("foo").setType(Query.Type.CHAR).setFlags( - Query.MySqlFlag.AUTO_INCREMENT_FLAG_VALUE | Query.MySqlFlag.PRI_KEY_FLAG_VALUE - | Query.MySqlFlag.UNIQUE_KEY_FLAG_VALUE | Query.MySqlFlag.BINARY_FLAG_VALUE - | Query.MySqlFlag.BLOB_FLAG_VALUE | Query.MySqlFlag.MULTIPLE_KEY_FLAG_VALUE - | Query.MySqlFlag.UNSIGNED_FLAG_VALUE | Query.MySqlFlag.ZEROFILL_FLAG_VALUE) - .build(); - VitessConnection conn = getVitessConnection(); - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - FieldWithMetadata field = new FieldWithMetadata(conn, raw); - Assert.assertEquals("foo", field.getName()); - Assert.assertEquals(null, field.getOrgName()); - Assert.assertEquals(null, field.getTable()); - Assert.assertEquals(null, field.getOrgTable()); - Assert.assertEquals(null, field.getDatabase()); - Assert.assertEquals(0, field.getDecimals()); - Assert.assertEquals(0, field.getColumnLength()); - Assert.assertEquals(0, field.getPrecisionAdjustFactor()); - Assert.assertEquals(false, field.isSingleBit()); - Assert.assertEquals(false, field.isAutoIncrement()); - Assert.assertEquals(false, field.isBinary()); - Assert.assertEquals(false, field.isBlob()); - Assert.assertEquals(false, field.isMultipleKey()); - Assert.assertEquals(true, field.isNotNull()); - Assert.assertEquals(false, field.isZeroFill()); - Assert.assertEquals(false, field.isPrimaryKey()); - Assert.assertEquals(false, field.isUniqueKey()); - Assert.assertEquals(true, field.isUnsigned()); - Assert.assertEquals(false, field.isSigned()); - Assert.assertEquals(false, field.isOpaqueBinary()); - Assert.assertEquals(false, field.isReadOnly()); - } - - @Test - public void testToString() throws SQLException { - Query.Field raw = Query.Field.newBuilder().setName("foo").setOrgName("foo").setTable("foo") - .setOrgTable("foo").setDatabase("foo").setType(Query.Type.CHAR).setFlags( - Query.MySqlFlag.AUTO_INCREMENT_FLAG_VALUE | Query.MySqlFlag.PRI_KEY_FLAG_VALUE - | Query.MySqlFlag.UNIQUE_KEY_FLAG_VALUE | Query.MySqlFlag.BINARY_FLAG_VALUE - | Query.MySqlFlag.BLOB_FLAG_VALUE | Query.MySqlFlag.MULTIPLE_KEY_FLAG_VALUE - | Query.MySqlFlag.UNSIGNED_FLAG_VALUE | Query.MySqlFlag.ZEROFILL_FLAG_VALUE) - .build(); - FieldWithMetadata field = new FieldWithMetadata(getVitessConnection(), raw); - String result = - "io.vitess.jdbc.FieldWithMetadata[catalog=foo," + "tableName=foo,originalTableName=foo," - + "columnName=foo,originalColumnName=foo," + "vitessType=" + Query.Type.CHAR.toString() - + "(1)," + "flags=AUTO_INCREMENT PRIMARY_KEY UNIQUE_KEY BINARY " - + "BLOB MULTI_KEY UNSIGNED ZEROFILL, charsetIndex=0, charsetName=null]"; - Assert.assertEquals(result, field.toString()); - } - - public void testCollations() throws Exception { - VitessConnection conn = getVitessConnection(); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) - .setName("foo").setOrgName("foo").setCharset(33).build(); - - FieldWithMetadata fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - String first = fieldWithMetadata.getCollation(); - String second = fieldWithMetadata.getCollation(); - - Assert.assertEquals("utf8_general_ci", first); - Assert.assertEquals("cached response is same as first", first, second); - - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(1)) - .invoke("getCollationIndex"); - - try { - raw = raw.toBuilder() - // value chosen because it's obviously out of bounds for the underlying array - .setCharset(Integer.MAX_VALUE).build(); - - fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - fieldWithMetadata.getCollation(); - Assert.fail("Should have received an array index out of bounds because " - + "charset/collationIndex of Int.MAX is well above size of charset array"); - } catch (SQLException e) { - if (e.getCause() instanceof ArrayIndexOutOfBoundsException) { - Assert.assertEquals("CollationIndex '" + Integer.MAX_VALUE + "' out of bounds for " - + "collationName lookup, should be within 0 and " - + CharsetMapping.COLLATION_INDEX_TO_COLLATION_NAME.length, e.getMessage()); - } else { - // just rethrow so we fail that way - throw e; - } - } - - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(1)) - .invoke("getCollationIndex"); - //Mockito.verify(fieldWithMetadata, Mockito.times(1)).getCollationIndex(); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - Assert.assertEquals("null response when not including all fields", null, - fieldWithMetadata.getCollation()); - - // We should not call this at all, because we're short circuiting due to included fields - //Mockito.verify(fieldWithMetadata, Mockito.never()).getCollationIndex(); - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(0)) - .invoke("getCollationIndex"); - } - - @Test - public void testMaxBytesPerChar() throws Exception { - VitessConnection conn = PowerMockito.spy(getVitessConnection()); - - Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) - .setName("foo").setOrgName("foo").setCharset(33).build(); - - FieldWithMetadata fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - - int first = fieldWithMetadata.getMaxBytesPerCharacter(); - int second = fieldWithMetadata.getMaxBytesPerCharacter(); - - Assert.assertEquals("cached response is same as first", first, second); - // We called getMaxBytesPerCharacter 2 times above, but should only have made 1 call to - // fieldWithMetadata.getMaxBytesPerChar: - // first - call conn - // second - return cached - Mockito.verify(fieldWithMetadata, VerificationModeFactory.times(1)) - .getMaxBytesPerChar(33, "UTF-8"); - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(1)) - .invoke("getCollationIndex"); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - fieldWithMetadata = PowerMockito.spy(new FieldWithMetadata(conn, raw)); - Assert.assertEquals("0 return value when not including all fields", 0, - fieldWithMetadata.getMaxBytesPerCharacter()); - - // We should not call this function because we short circuited due to not including all fields. - Mockito.verify(fieldWithMetadata, VerificationModeFactory.times(0)) - .getMaxBytesPerChar(33, "UTF-8"); - // Should not be called at all, because it's new for just this test - PowerMockito.verifyPrivate(fieldWithMetadata, VerificationModeFactory.times(0)) - .invoke("getCollationIndex"); - } - - @Test - public void testGetEncodingForIndex() throws SQLException { - Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) - .setName("foo").setOrgName("foo").setCharset(33).build(); - FieldWithMetadata field = new FieldWithMetadata(getVitessConnection(), raw); - - // No default encoding configured, and passing NO_CHARSET_INFO basically says "mysql doesn't - // know" - // which means don't try looking it up - Assert.assertEquals(null, field.getEncodingForIndex(MysqlDefs.NO_CHARSET_INFO)); - // Similarly, a null index or one landing out of bounds for the charset index should return null - Assert.assertEquals(null, field.getEncodingForIndex(Integer.MAX_VALUE)); - Assert.assertEquals(null, field.getEncodingForIndex(-123)); - - // charsetIndex 25 is MYSQL_CHARSET_NAME_greek, which is a charset with multiple names, - // ISO8859_7 and greek - // Without an encoding configured in the connection, we should return the first (default) - // encoding for a charset, - // in this case ISO8859_7 - Assert.assertEquals("ISO-8859-7", field.getEncodingForIndex(25)); - field.getConnectionProperties().setEncoding("greek"); - // With an encoding configured, we should return that because it matches one of the names for - // the charset - Assert.assertEquals("greek", field.getEncodingForIndex(25)); - - field.getConnectionProperties().setEncoding(null); - Assert.assertEquals("UTF-8", - field.getEncodingForIndex(CharsetMapping.MYSQL_COLLATION_INDEX_utf8)); - Assert.assertEquals("ISO-8859-1", - field.getEncodingForIndex(CharsetMapping.MYSQL_COLLATION_INDEX_binary)); - - field.getConnectionProperties().setEncoding("NOT_REAL"); - // Same tests as the first one, but testing that when there is a default configured, it falls - // back to that regardless - Assert.assertEquals("NOT_REAL", field.getEncodingForIndex(MysqlDefs.NO_CHARSET_INFO)); - Assert.assertEquals("NOT_REAL", field.getEncodingForIndex(Integer.MAX_VALUE)); - Assert.assertEquals("NOT_REAL", field.getEncodingForIndex(-123)); - } - - @Test - public void testGetMaxBytesPerChar() throws SQLException { - Query.Field raw = Query.Field.newBuilder().setTable("foo").setType(Query.Type.CHAR) - .setName("foo").setOrgName("foo").setCharset(33).build(); - FieldWithMetadata field = new FieldWithMetadata(getVitessConnection(), raw); - - // Default state when no good info is passed in - Assert.assertEquals(0, field.getMaxBytesPerChar(MysqlDefs.NO_CHARSET_INFO, null)); - // use passed collation index - Assert - .assertEquals(3, field.getMaxBytesPerChar(CharsetMapping.MYSQL_COLLATION_INDEX_utf8, null)); - // use first, if both are passed and valid - Assert.assertEquals(3, - field.getMaxBytesPerChar(CharsetMapping.MYSQL_COLLATION_INDEX_utf8, "UnicodeBig")); - // use passed default charset - Assert.assertEquals(2, field.getMaxBytesPerChar(MysqlDefs.NO_CHARSET_INFO, "UnicodeBig")); - } -} diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java deleted file mode 100644 index 415790ed3f4..00000000000 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessConnectionTest.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright 2019 The Vitess Authors. - - * 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 io.vitess.jdbc; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import io.vitess.client.VTSession; -import io.vitess.proto.Query; -import io.vitess.proto.Query.ExecuteOptions.TransactionIsolation; -import io.vitess.proto.Topodata; -import io.vitess.util.Constants; - -import java.lang.reflect.Field; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Properties; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.modules.junit4.PowerMockRunner; - -/** - * Created by harshit.gangal on 19/01/16. - */ -@RunWith(PowerMockRunner.class) -public class VitessConnectionTest extends BaseTest { - - @Test - public void testVitessConnection() throws SQLException { - VitessConnection vitessConnection = new VitessConnection(dbURL, new Properties()); - assertFalse(vitessConnection.isClosed()); - assertNull(vitessConnection.getDbProperties()); - } - - @Test - public void testCreateStatement() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - Statement statement = vitessConnection.createStatement(); - assertEquals(vitessConnection, statement.getConnection()); - } - - @Test - public void testCreateStatementForClose() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - assertFailsOnClosedConnection(vitessConnection, vitessConnection::createStatement); - } - - @Test - public void testnativeSQL() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - assertEquals("query", vitessConnection.nativeSQL("query")); - } - - @Test - public void testCreatePreperedStatement() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - PreparedStatement preparedStatementstatement = vitessConnection.prepareStatement("query"); - assertEquals(vitessConnection, preparedStatementstatement.getConnection()); - } - - @Test - public void testCreatePreparedStatementForClose() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - assertFailsOnClosedConnection(vitessConnection, - () -> vitessConnection.prepareStatement("query")); - } - - @Test - public void testDefaultGetAutoCommit() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - assertTrue(vitessConnection.getAutoCommit()); - } - - @Test - public void testDefaultGetAutoCommitForClose() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - assertFailsOnClosedConnection(vitessConnection, vitessConnection::getAutoCommit); - } - - @Test - public void testDefaultSetAutoCommit() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - vitessConnection.setAutoCommit(false); - assertFalse(vitessConnection.getAutoCommit()); - } - - @Test - public void testDefaultSetAutoCommitForClose() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - assertFailsOnClosedConnection(vitessConnection, () -> vitessConnection.setAutoCommit(false)); - } - - @Test - public void testCommit() throws Exception { - VTSession mockSession = PowerMockito.mock(VTSession.class); - VitessConnection vitessConnection = getVitessConnection(); - Field privateVTSessionField = VitessConnection.class.getDeclaredField("vtSession"); - privateVTSessionField.setAccessible(true); - privateVTSessionField.set(vitessConnection, mockSession); - PowerMockito.when(mockSession.isInTransaction()).thenReturn(false); - PowerMockito.when(mockSession.isAutoCommit()).thenReturn(false); - vitessConnection.commit(); - } - - @Test(expected = SQLException.class) - public void testCommitForException() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - vitessConnection.setAutoCommit(true); - vitessConnection.commit(); - } - - @Test - public void testRollback() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - vitessConnection.setAutoCommit(false); - vitessConnection.rollback(); - } - - @Test(expected = SQLException.class) - public void testRollbackForException() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - vitessConnection.setAutoCommit(true); - vitessConnection.rollback(); - } - - @Test - public void testClosed() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - vitessConnection.setAutoCommit(false); - vitessConnection.close(); - assertTrue(vitessConnection.isClosed()); - } - - @Test(expected = SQLException.class) - public void testClosedForException() throws Exception { - VTSession mockSession = PowerMockito.mock(VTSession.class); - VitessConnection vitessConnection = getVitessConnection(); - Field privateVTSessionField = VitessConnection.class.getDeclaredField("vtSession"); - privateVTSessionField.setAccessible(true); - privateVTSessionField.set(vitessConnection, mockSession); - PowerMockito.when(mockSession.isInTransaction()).thenReturn(true); - PowerMockito.when(mockSession.isAutoCommit()).thenReturn(true); - vitessConnection.close(); - } - - @Test - public void testGetCatalog() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - assertEquals("keyspace", vitessConnection.getCatalog()); - } - - @Test - public void testSetCatalog() throws SQLException { - VitessConnection vitessConnection = getVitessConnection(); - vitessConnection.setCatalog("myDB"); - assertEquals("myDB", vitessConnection.getCatalog()); - } - - @Test - public void testPropertiesFromJdbcUrl() throws SQLException { - String url = "jdbc:vitess://locahost:9000/vt_keyspace/keyspace?TABLET_TYPE=replica" - + "&includedFields=type_and_name&blobsAreStrings=yes"; - VitessConnection conn = new VitessConnection(url, new Properties()); - - // Properties from the url should be passed into the connection properties, and override - // whatever defaults we've defined - assertEquals(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME, conn.getIncludedFields()); - assertFalse(conn.isIncludeAllFields()); - assertEquals(Topodata.TabletType.REPLICA, conn.getTabletType()); - assertTrue(conn.getBlobsAreStrings()); - } - - @Test - public void testClientFoundRows() throws SQLException { - String url = "jdbc:vitess://locahost:9000/vt_keyspace/keyspace?TABLET_TYPE=replica" - + "&useAffectedRows=true"; - VitessConnection conn = new VitessConnection(url, new Properties()); - - assertTrue(conn.getUseAffectedRows()); - assertFalse(conn.getVtSession().getSession().getOptions().getClientFoundRows()); - } - - @Test - public void testClientFoundRows2() throws SQLException { - String url = "jdbc:vitess://locahost:9000/vt_keyspace/keyspace?TABLET_TYPE=replica" - + "&useAffectedRows=false"; - VitessConnection conn = new VitessConnection(url, new Properties()); - - assertFalse(conn.getUseAffectedRows()); - assertTrue(conn.getVtSession().getSession().getOptions().getClientFoundRows()); - } - - @Test - public void testWorkload() throws SQLException { - for (Query.ExecuteOptions.Workload workload : Query.ExecuteOptions.Workload.values()) { - if (workload == Query.ExecuteOptions.Workload.UNRECOGNIZED) { - continue; - } - String url = "jdbc:vitess://locahost:9000/vt_keyspace/keyspace?TABLET_TYPE=replica&workload=" - + workload.toString().toLowerCase(); - VitessConnection conn = new VitessConnection(url, new Properties()); - - assertEquals(workload, conn.getWorkload()); - assertEquals(workload, conn.getVtSession().getSession().getOptions().getWorkload()); - } - } - - @Test - public void testTransactionIsolation() throws SQLException { - VitessConnection conn = Mockito.spy(getVitessConnection()); - doReturn(new DBProperties("random", "random", "random", Connection.TRANSACTION_REPEATABLE_READ, - "random")).when(conn).getDbProperties(); - doReturn(new VitessMySQLDatabaseMetadata(conn)).when(conn).getMetaData(); - - assertEquals(TransactionIsolation.DEFAULT, - conn.getVtSession().getSession().getOptions().getTransactionIsolation()); - assertEquals(Connection.TRANSACTION_REPEATABLE_READ, conn.getTransactionIsolation()); - - conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); - - assertEquals(TransactionIsolation.READ_COMMITTED, - conn.getVtSession().getSession().getOptions().getTransactionIsolation()); - assertEquals(Connection.TRANSACTION_READ_COMMITTED, conn.getTransactionIsolation()); - - VitessStatement statement = mock(VitessStatement.class); - when(conn.createStatement()).thenReturn(statement); - when(conn.isInTransaction()).thenReturn(true); - conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); - - verify(statement).executeUpdate("rollback"); - assertEquals(TransactionIsolation.READ_UNCOMMITTED, - conn.getVtSession().getSession().getOptions().getTransactionIsolation()); - assertEquals(Connection.TRANSACTION_READ_UNCOMMITTED, conn.getTransactionIsolation()); - } - - interface Runthis { - - void run() throws SQLException; - } - - private void assertFailsOnClosedConnection(VitessConnection connection, Runthis failingRunnable) - throws SQLException { - connection.close(); - try { - failingRunnable.run(); - fail("expected this to fail on a closed connection"); - } catch (SQLException e) { - assertEquals(e.getMessage(), Constants.SQLExceptionMessages.CONN_CLOSED); - } - } - -} diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java deleted file mode 100644 index 92d5cfede9b..00000000000 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessDatabaseMetadataTest.java +++ /dev/null @@ -1,1626 +0,0 @@ -/* - * Copyright 2019 The Vitess Authors. - - * 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 io.vitess.jdbc; - -import com.google.common.base.Charsets; -import com.google.common.io.CharStreams; -import com.google.protobuf.ByteString; - -import io.vitess.client.cursor.Cursor; -import io.vitess.client.cursor.SimpleCursor; -import io.vitess.proto.Query; -import io.vitess.util.Constants; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.sql.Types; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.Scanner; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -/** - * Created by ashudeep.sharma on 08/03/16. - */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({VitessMySQLDatabaseMetadata.class, VitessConnection.class}) -public class VitessDatabaseMetadataTest extends BaseTest { - - private ResultSet resultSet; - - @Test - public void getPseudoColumnsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - this.resultSet = vitessDatabaseMetaData.getPseudoColumns(null, null, null, null); - - ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); - Assert.assertEquals("TABLE_CAT", resultSetMetaData.getColumnName(1)); - Assert.assertEquals("TABLE_SCHEM", resultSetMetaData.getColumnName(2)); - Assert.assertEquals("TABLE_NAME", resultSetMetaData.getColumnName(3)); - Assert.assertEquals("COLUMN_NAME", resultSetMetaData.getColumnName(4)); - Assert.assertEquals("DATA_TYPE", resultSetMetaData.getColumnName(5)); - Assert.assertEquals("COLUMN_SIZE", resultSetMetaData.getColumnName(6)); - Assert.assertEquals("DECIMAL_DIGITS", resultSetMetaData.getColumnName(7)); - Assert.assertEquals("NUM_PREC_RADIX", resultSetMetaData.getColumnName(8)); - Assert.assertEquals("COLUMN_USAGE", resultSetMetaData.getColumnName(9)); - Assert.assertEquals("REMARKS", resultSetMetaData.getColumnName(10)); - Assert.assertEquals("CHAR_OCTET_LENGTH", resultSetMetaData.getColumnName(11)); - Assert.assertEquals("IS_NULLABLE", resultSetMetaData.getColumnName(12)); - } - - @Test - public void getClientInfoPropertiesTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - this.resultSet = vitessDatabaseMetaData.getClientInfoProperties(); - - ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); - Assert.assertEquals("NAME", resultSetMetaData.getColumnName(1)); - Assert.assertEquals("MAX_LEN", resultSetMetaData.getColumnName(2)); - Assert.assertEquals("DEFAULT_VALUE", resultSetMetaData.getColumnName(3)); - Assert.assertEquals("DESCRIPTION", resultSetMetaData.getColumnName(4)); - } - - @Test - public void getSchemasTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - this.resultSet = vitessDatabaseMetaData.getSchemas(null, null); - - ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); - Assert.assertEquals("TABLE_CAT", resultSetMetaData.getColumnName(1)); - Assert.assertEquals("TABLE_CATALOG", resultSetMetaData.getColumnName(2)); - } - - @Test - public void getAttributesTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - this.resultSet = vitessDatabaseMetaData.getAttributes(null, null, null, null); - - ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); - Assert.assertEquals("TYPE_CAT", resultSetMetaData.getColumnName(1)); - Assert.assertEquals("TYPE_SCHEM", resultSetMetaData.getColumnName(2)); - Assert.assertEquals("TYPE_NAME", resultSetMetaData.getColumnName(3)); - Assert.assertEquals("ATTR_NAME", resultSetMetaData.getColumnName(4)); - Assert.assertEquals("DATA_TYPE", resultSetMetaData.getColumnName(5)); - Assert.assertEquals("ATTR_TYPE_NAME", resultSetMetaData.getColumnName(6)); - Assert.assertEquals("ATTR_SIZE", resultSetMetaData.getColumnName(7)); - Assert.assertEquals("DECIMAL_DIGITS", resultSetMetaData.getColumnName(8)); - Assert.assertEquals("NUM_PREC_RADIX", resultSetMetaData.getColumnName(9)); - Assert.assertEquals("NULLABLE", resultSetMetaData.getColumnName(10)); - Assert.assertEquals("REMARKS", resultSetMetaData.getColumnName(11)); - Assert.assertEquals("ATTR_DEF", resultSetMetaData.getColumnName(12)); - Assert.assertEquals("SQL_DATA_TYPE", resultSetMetaData.getColumnName(13)); - Assert.assertEquals("SQL_DATETIME_SUB", resultSetMetaData.getColumnName(14)); - Assert.assertEquals("CHAR_OCTET_LENGTH", resultSetMetaData.getColumnName(15)); - Assert.assertEquals("ORDINAL_POSITION", resultSetMetaData.getColumnName(16)); - Assert.assertEquals("ISNULLABLE", resultSetMetaData.getColumnName(17)); - Assert.assertEquals("SCOPE_CATALOG", resultSetMetaData.getColumnName(18)); - Assert.assertEquals("SCOPE_SCHEMA", resultSetMetaData.getColumnName(19)); - Assert.assertEquals("SCOPE_TABLE", resultSetMetaData.getColumnName(20)); - Assert.assertEquals("SOURCE_DATA_TYPE", resultSetMetaData.getColumnName(21)); - } - - @Test - public void getSuperTablesTest() throws SQLException { - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - this.resultSet = vitessDatabaseMetaData.getSuperTables(null, null, null); - - ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); - Assert.assertEquals("TABLE_CAT", resultSetMetaData.getColumnName(1)); - Assert.assertEquals("TYPE_SCHEM", resultSetMetaData.getColumnName(2)); - Assert.assertEquals("TABLE_NAME", resultSetMetaData.getColumnName(3)); - Assert.assertEquals("SUPERTABLE_NAME", resultSetMetaData.getColumnName(4)); - } - - @Test - public void getSuperTypesTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - this.resultSet = vitessDatabaseMetaData.getSuperTypes(null, null, null); - - ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); - Assert.assertEquals("TYPE_CAT", resultSetMetaData.getColumnName(1)); - Assert.assertEquals("TYPE_SCHEM", resultSetMetaData.getColumnName(2)); - Assert.assertEquals("TYPE_NAME", resultSetMetaData.getColumnName(3)); - Assert.assertEquals("SUPERTYPE_CAT", resultSetMetaData.getColumnName(4)); - Assert.assertEquals("SUPERTYPE_SCHEM", resultSetMetaData.getColumnName(5)); - Assert.assertEquals("SUPERTYPE_NAME", resultSetMetaData.getColumnName(6)); - } - - @Test - public void getUDTsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - this.resultSet = vitessDatabaseMetaData.getUDTs(null, null, null, null); - - ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); - Assert.assertEquals("TYPE_CAT", resultSetMetaData.getColumnName(1)); - Assert.assertEquals("TYPE_SCHEM", resultSetMetaData.getColumnName(2)); - Assert.assertEquals("TYPE_NAME", resultSetMetaData.getColumnName(3)); - Assert.assertEquals("CLASS_NAME", resultSetMetaData.getColumnName(4)); - Assert.assertEquals("DATA_TYPE", resultSetMetaData.getColumnName(5)); - Assert.assertEquals("REMARKS", resultSetMetaData.getColumnName(6)); - Assert.assertEquals("BASE_TYPE", resultSetMetaData.getColumnName(7)); - } - - @Test - public void getTypeInfoTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - this.resultSet = vitessDatabaseMetaData.getTypeInfo(); - - ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); - Assert.assertEquals("TYPE_NAME", resultSetMetaData.getColumnName(1)); - Assert.assertEquals("DATA_TYPE", resultSetMetaData.getColumnName(2)); - Assert.assertEquals("PRECISION", resultSetMetaData.getColumnName(3)); - Assert.assertEquals("LITERAL_PREFIX", resultSetMetaData.getColumnName(4)); - Assert.assertEquals("LITERAL_SUFFIX", resultSetMetaData.getColumnName(5)); - Assert.assertEquals("CREATE_PARAMS", resultSetMetaData.getColumnName(6)); - Assert.assertEquals("NULLABLE", resultSetMetaData.getColumnName(7)); - Assert.assertEquals("CASE_SENSITIVE", resultSetMetaData.getColumnName(8)); - Assert.assertEquals("SEARCHABLE", resultSetMetaData.getColumnName(9)); - Assert.assertEquals("UNSIGNED_ATTRIBUTE", resultSetMetaData.getColumnName(10)); - Assert.assertEquals("FIXED_PREC_SCALE", resultSetMetaData.getColumnName(11)); - Assert.assertEquals("AUTO_INCREMENT", resultSetMetaData.getColumnName(12)); - Assert.assertEquals("LOCAL_TYPE_NAME", resultSetMetaData.getColumnName(13)); - Assert.assertEquals("MINIMUM_SCALE", resultSetMetaData.getColumnName(14)); - Assert.assertEquals("MAXIMUM_SCALE", resultSetMetaData.getColumnName(15)); - Assert.assertEquals("SQL_DATA_TYPE", resultSetMetaData.getColumnName(16)); - Assert.assertEquals("SQL_DATETIME_SUB", resultSetMetaData.getColumnName(17)); - Assert.assertEquals("NUM_PREC_RADIX", resultSetMetaData.getColumnName(18)); - - //Check for ResultSet Data as well - } - - @Test - public void getTableTypesTest() throws SQLException { - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - this.resultSet = vitessDatabaseMetaData.getTableTypes(); - - ArrayList data = new ArrayList(); - while (resultSet.next()) { - data.add(resultSet.getString("table_type")); - } - - ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); - Assert.assertEquals("table_type", resultSetMetaData.getColumnName(1)); - //Checking Data - Assert.assertEquals("LOCAL TEMPORARY", data.get(0)); - Assert.assertEquals("SYSTEM TABLES", data.get(1)); - Assert.assertEquals("SYSTEM VIEW", data.get(2)); - Assert.assertEquals("TABLE", data.get(3)); - Assert.assertEquals("VIEW", data.get(4)); - } - - @Test - public void getSchemasTest2() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - this.resultSet = vitessDatabaseMetaData.getSchemas(); - - ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); - Assert.assertEquals("TABLE_SCHEM", resultSetMetaData.getColumnName(1)); - Assert.assertEquals("TABLE_CATALOG", resultSetMetaData.getColumnName(2)); - } - - @Test - public void allProceduresAreCallableTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.allProceduresAreCallable()); - } - - @Test - public void allTablesAreSelectableTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.allTablesAreSelectable()); - } - - @Test - public void nullsAreSortedHighTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.nullsAreSortedHigh()); - Assert.assertEquals(false, vitessMariaDBDatabaseMetadata.nullsAreSortedHigh()); - } - - @Test - public void nullsAreSortedLowTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(true, vitessDatabaseMetaData.nullsAreSortedLow()); - Assert.assertEquals(true, vitessMariaDBDatabaseMetadata.nullsAreSortedLow()); - } - - @Test - public void nullsAreSortedAtStartTest() throws SQLException { - VitessDatabaseMetaData vitessMySQLDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(false, vitessMySQLDatabaseMetaData.nullsAreSortedAtStart()); - Assert.assertEquals(false, vitessMariaDBDatabaseMetadata.nullsAreSortedAtStart()); - } - - @Test - public void nullsAreSortedAtEndTest() throws SQLException { - VitessDatabaseMetaData vitessMySQLDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(false, vitessMySQLDatabaseMetaData.nullsAreSortedAtEnd()); - Assert.assertEquals(true, vitessMariaDBDatabaseMetadata.nullsAreSortedAtEnd()); - } - - @Test - public void getDatabaseProductNameTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals("MySQL", vitessDatabaseMetaData.getDatabaseProductName()); - } - - @Test - public void getDriverVersionTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - StringBuilder driverVersionBuilder = new StringBuilder(); - driverVersionBuilder.append(Constants.DRIVER_MAJOR_VERSION); - driverVersionBuilder.append("."); - driverVersionBuilder.append(Constants.DRIVER_MINOR_VERSION); - Assert.assertEquals(driverVersionBuilder.toString(), vitessDatabaseMetaData.getDriverVersion()); - } - - @Test - public void getDriverMajorVersionTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(Constants.DRIVER_MAJOR_VERSION, - vitessDatabaseMetaData.getDriverMajorVersion()); - } - - @Test - public void getDriverMinorVersionTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(Constants.DRIVER_MINOR_VERSION, - vitessDatabaseMetaData.getDriverMinorVersion()); - } - - @Test - public void getSearchStringEscapeTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals("\\", vitessDatabaseMetaData.getSearchStringEscape()); - } - - @Test - public void getExtraNameCharactersTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals("#@", vitessDatabaseMetaData.getExtraNameCharacters()); - } - - @Test - public void supportsAlterTableWithAddColumnTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsAlterTableWithAddColumn()); - } - - @Test - public void supportsAlterTableWithDropColumnTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsAlterTableWithDropColumn()); - } - - @Test - public void supportsColumnAliasingTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(true, vitessDatabaseMetaData.supportsColumnAliasing()); - } - - @Test - public void nullPlusNonNullIsNullTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(true, vitessDatabaseMetaData.nullPlusNonNullIsNull()); - } - - @Test - public void supportsExpressionsInOrderByTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsExpressionsInOrderBy()); - } - - @Test - public void supportsOrderByUnrelatedTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsOrderByUnrelated()); - } - - @Test - public void supportsGroupByTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsGroupBy()); - } - - @Test - public void supportsGroupByUnrelatedTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsGroupByUnrelated()); - } - - @Test - public void supportsGroupByBeyondSelectTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsGroupByBeyondSelect()); - } - - @Test - public void supportsLikeEscapeClauseTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(true, vitessDatabaseMetaData.supportsLikeEscapeClause()); - } - - @Test - public void supportsMultipleResultSetsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsMultipleResultSets()); - } - - @Test - public void supportsMultipleTransactionsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(true, vitessDatabaseMetaData.supportsMultipleTransactions()); - } - - @Test - public void supportsNonNullableColumnsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(true, vitessDatabaseMetaData.supportsNonNullableColumns()); - } - - @Test - public void supportsMinimumSQLGrammarTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(true, vitessDatabaseMetaData.supportsMinimumSQLGrammar()); - } - - @Test - public void supportsCoreSQLGrammarTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsCoreSQLGrammar()); - } - - @Test - public void supportsExtendedSQLGrammarTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsExtendedSQLGrammar()); - } - - @Test - public void supportsOuterJoinsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsOuterJoins()); - } - - @Test - public void supportsFullOuterJoinsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsFullOuterJoins()); - } - - @Test - public void supportsLimitedOuterJoinsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsLimitedOuterJoins()); - } - - @Test - public void getSchemaTermTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals("", vitessDatabaseMetaData.getSchemaTerm()); - } - - @Test - public void getProcedureTermTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals("procedure", vitessDatabaseMetaData.getProcedureTerm()); - } - - @Test - public void getCatalogTermTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals("database", vitessDatabaseMetaData.getCatalogTerm()); - } - - @Test - public void isCatalogAtStartTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(true, vitessDatabaseMetaData.isCatalogAtStart()); - } - - @Test - public void getCatalogSeparatorTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(".", vitessDatabaseMetaData.getCatalogSeparator()); - } - - @Test - public void supportsSchemasInDataManipulationTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsSchemasInDataManipulation()); - } - - @Test - public void supportsSchemasInProcedureCallsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsSchemasInProcedureCalls()); - } - - @Test - public void supportsSchemasInTableDefinitionsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsSchemasInTableDefinitions()); - } - - @Test - public void supportsSchemasInIndexDefinitionsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsSchemasInIndexDefinitions()); - } - - @Test - public void supportsSelectForUpdateTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsSelectForUpdate()); - } - - @Test - public void supportsStoredProceduresTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsStoredProcedures()); - } - - @Test - public void supportsSubqueriesInComparisonsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsSubqueriesInComparisons()); - } - - @Test - public void supportsSubqueriesInExistsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsSubqueriesInExists()); - } - - @Test - public void supportsSubqueriesInInsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsSubqueriesInIns()); - } - - @Test - public void supportsSubqueriesInQuantifiedsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsSubqueriesInQuantifieds()); - } - - @Test - public void supportsCorrelatedSubqueriesTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsCorrelatedSubqueries()); - } - - @Test - public void supportsUnionTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsUnion()); - } - - @Test - public void supportsUnionAllTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsUnionAll()); - } - - @Test - public void supportsOpenCursorsAcrossRollbackTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsOpenCursorsAcrossRollback()); - } - - @Test - public void supportsOpenStatementsAcrossCommitTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsOpenStatementsAcrossCommit()); - } - - @Test - public void supportsOpenStatementsAcrossRollbackTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsOpenStatementsAcrossRollback()); - } - - @Test - public void supportsOpenCursorsAcrossCommitTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.supportsOpenCursorsAcrossCommit()); - } - - @Test - public void getMaxBinaryLiteralLengthTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(16777208, vitessDatabaseMetaData.getMaxBinaryLiteralLength()); - } - - @Test - public void getMaxCharLiteralLengthTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(16777208, vitessDatabaseMetaData.getMaxCharLiteralLength()); - } - - @Test - public void getMaxColumnNameLengthTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(64, vitessDatabaseMetaData.getMaxColumnNameLength()); - } - - @Test - public void getMaxColumnsInGroupByTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(64, vitessDatabaseMetaData.getMaxColumnsInGroupBy()); - } - - @Test - public void getMaxColumnsInIndexTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(16, vitessDatabaseMetaData.getMaxColumnsInIndex()); - } - - @Test - public void getMaxColumnsInOrderByTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(64, vitessDatabaseMetaData.getMaxColumnsInOrderBy()); - } - - @Test - public void getMaxColumnsInSelectTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(256, vitessDatabaseMetaData.getMaxColumnsInSelect()); - } - - @Test - public void getMaxIndexLengthTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(256, vitessDatabaseMetaData.getMaxIndexLength()); - } - - @Test - public void doesMaxRowSizeIncludeBlobsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.doesMaxRowSizeIncludeBlobs()); - } - - @Test - public void getMaxTableNameLengthTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(64, vitessDatabaseMetaData.getMaxTableNameLength()); - } - - @Test - public void getMaxTablesInSelectTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(256, vitessDatabaseMetaData.getMaxTablesInSelect()); - } - - @Test - public void getMaxUserNameLengthTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(16, vitessDatabaseMetaData.getMaxUserNameLength()); - } - - @Test - public void supportsDataDefinitionAndDataManipulationTransactionsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, - vitessDatabaseMetaData.supportsDataDefinitionAndDataManipulationTransactions()); - } - - @Test - public void dataDefinitionCausesTransactionCommitTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.dataDefinitionCausesTransactionCommit()); - } - - @Test - public void dataDefinitionIgnoredInTransactionsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.dataDefinitionIgnoredInTransactions()); - } - - @Test - public void getIdentifierQuoteStringTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals("`", vitessDatabaseMetaData.getIdentifierQuoteString()); - } - - @Test - public void getProceduresTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(null, vitessDatabaseMetaData.getProcedures(null, null, null)); - } - - @Test - public void supportsResultSetTypeTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(true, - vitessDatabaseMetaData.supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY)); - Assert.assertEquals(false, - vitessDatabaseMetaData.supportsResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE)); - Assert.assertEquals(false, - vitessDatabaseMetaData.supportsResultSetType(ResultSet.TYPE_SCROLL_SENSITIVE)); - Assert.assertEquals(false, - vitessDatabaseMetaData.supportsResultSetType(ResultSet.CLOSE_CURSORS_AT_COMMIT)); - Assert.assertEquals(false, - vitessDatabaseMetaData.supportsResultSetType(ResultSet.CONCUR_READ_ONLY)); - Assert.assertEquals(false, - vitessDatabaseMetaData.supportsResultSetType(ResultSet.CONCUR_UPDATABLE)); - Assert - .assertEquals(false, vitessDatabaseMetaData.supportsResultSetType(ResultSet.FETCH_FORWARD)); - Assert - .assertEquals(false, vitessDatabaseMetaData.supportsResultSetType(ResultSet.FETCH_REVERSE)); - Assert.assertEquals(false, - vitessDatabaseMetaData.supportsResultSetType(ResultSet.HOLD_CURSORS_OVER_COMMIT)); - Assert - .assertEquals(false, vitessDatabaseMetaData.supportsResultSetType(ResultSet.FETCH_UNKNOWN)); - } - - @Test - public void supportsResultSetConcurrencyTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - Assert.assertEquals(true, vitessDatabaseMetaData - .supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)); - Assert.assertEquals(false, vitessDatabaseMetaData - .supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY)); - Assert.assertEquals(false, vitessDatabaseMetaData - .supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY)); - Assert.assertEquals(false, vitessDatabaseMetaData - .supportsResultSetConcurrency(ResultSet.CLOSE_CURSORS_AT_COMMIT, - ResultSet.CONCUR_READ_ONLY)); - Assert.assertEquals(false, vitessDatabaseMetaData - .supportsResultSetConcurrency(ResultSet.CONCUR_READ_ONLY, ResultSet.CONCUR_READ_ONLY)); - Assert.assertEquals(false, vitessDatabaseMetaData - .supportsResultSetConcurrency(ResultSet.CONCUR_UPDATABLE, ResultSet.CONCUR_READ_ONLY)); - Assert.assertEquals(false, vitessDatabaseMetaData - .supportsResultSetConcurrency(ResultSet.FETCH_FORWARD, ResultSet.CONCUR_READ_ONLY)); - Assert.assertEquals(false, vitessDatabaseMetaData - .supportsResultSetConcurrency(ResultSet.FETCH_REVERSE, ResultSet.CONCUR_READ_ONLY)); - Assert.assertEquals(false, vitessDatabaseMetaData - .supportsResultSetConcurrency(ResultSet.HOLD_CURSORS_OVER_COMMIT, - ResultSet.CONCUR_READ_ONLY)); - Assert.assertEquals(false, vitessDatabaseMetaData - .supportsResultSetConcurrency(ResultSet.FETCH_UNKNOWN, ResultSet.CONCUR_READ_ONLY)); - } - - @Test - public void getJDBCMajorVersionTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(1, vitessDatabaseMetaData.getJDBCMajorVersion()); - } - - @Test - public void getJDBCMinorVersionTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(0, vitessDatabaseMetaData.getJDBCMinorVersion()); - } - - @Test - public void getNumericFunctionsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals( - "ABS,ACOS,ASIN,ATAN,ATAN2,BIT_COUNT,CEILING,COS,COT,DEGREES,EXP,FLOOR,LOG,LOG10,MAX,MIN," - + "MOD,PI,POW,POWER," - + "RADIANS,RAND,ROUND,SIN,SQRT,TAN,TRUNCATE", - vitessDatabaseMetaData.getNumericFunctions()); - } - - @Test - public void getStringFunctionsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals( - "ASCII,BIN,BIT_LENGTH,CHAR,CHARACTER_LENGTH,CHAR_LENGTH,CONCAT,CONCAT_WS,CONV,ELT," - + "EXPORT_SET,FIELD," - + "FIND_IN_SET,HEX,INSERT,INSTR,LCASE,LEFT,LENGTH,LOAD_FILE,LOCATE,LOCATE,LOWER,LPAD," - + "LTRIM,MAKE_SET," - + "MATCH,MID,OCT,OCTET_LENGTH,ORD,POSITION,QUOTE,REPEAT,REPLACE,REVERSE,RIGHT,RPAD," - + "RTRIM,SOUNDEX,SPACE," - + "STRCMP,SUBSTRING,SUBSTRING,SUBSTRING,SUBSTRING,SUBSTRING_INDEX,TRIM,UCASE,UPPER", - vitessDatabaseMetaData.getStringFunctions()); - } - - @Test - public void getSystemFunctionsTest() throws SQLException { - VitessDatabaseMetaData vitessMySQLDatabaseMetadata = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatbaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals( - "DATABASE,USER,SYSTEM_USER,SESSION_USER,LAST_INSERT_ID,VERSION,PASSWORD,ENCRYPT", - vitessMySQLDatabaseMetadata.getSystemFunctions()); - Assert.assertEquals("DATABASE,USER,SYSTEM_USER,SESSION_USER,LAST_INSERT_ID,VERSION", - vitessMariaDBDatbaseMetadata.getSystemFunctions()); - } - - @Test - public void getTimeDateFunctionsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals( - "DAYOFWEEK,WEEKDAY,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME,MONTHNAME,QUARTER,WEEK,YEAR,HOUR," - + "MINUTE,SECOND," - + "PERIOD_ADD,PERIOD_DIFF,TO_DAYS,FROM_DAYS,DATE_FORMAT,TIME_FORMAT,CURDATE," - + "CURRENT_DATE,CURTIME," - + "CURRENT_TIME,NOW,SYSDATE,CURRENT_TIMESTAMP,UNIX_TIMESTAMP,FROM_UNIXTIME," - + "SEC_TO_TIME,TIME_TO_SEC", - vitessDatabaseMetaData.getTimeDateFunctions()); - } - - @Test - public void autoCommitFailureClosesAllResultSetsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.autoCommitFailureClosesAllResultSets()); - } - - @Test - public void getUrlTest() throws SQLException { - String connectionUrl = "jdbc:vitess://://"; - VitessJDBCUrl mockUrl = PowerMockito.mock(VitessJDBCUrl.class); - PowerMockito.when(mockUrl.getUrl()).thenReturn(connectionUrl); - - VitessConnection mockConn = PowerMockito.mock(VitessConnection.class); - PowerMockito.when(mockConn.getUrl()).thenReturn(mockUrl); - - Assert.assertEquals(connectionUrl, mockConn.getUrl().getUrl()); - } - - @Test - public void isReadOnlyTest() throws SQLException { - VitessConnection mockConn = PowerMockito.mock(VitessConnection.class); - PowerMockito.when(mockConn.isReadOnly()).thenReturn(false); - Assert.assertEquals(false, mockConn.isReadOnly()); - - } - - @Test - public void getDriverNameTest() throws SQLException { - VitessDatabaseMetaData vitessMySQLDatabaseMetadata = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals("Vitess MySQL JDBC Driver", vitessMySQLDatabaseMetadata.getDriverName()); - Assert - .assertEquals("Vitess MariaDB JDBC Driver", vitessMariaDBDatabaseMetadata.getDriverName()); - } - - @Test - public void usesLocalFilesTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.usesLocalFiles()); - Assert.assertEquals(false, vitessDatabaseMetaData.usesLocalFilePerTable()); - Assert.assertEquals(false, vitessDatabaseMetaData.storesUpperCaseIdentifiers()); - } - - @Test - public void storeIdentifiersTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - - Assert.assertEquals(false, vitessDatabaseMetaData.storesUpperCaseIdentifiers()); - } - - @Test - public void supportsTransactionsTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - Assert.assertEquals(true, vitessDatabaseMetaData.supportsTransactions()); - } - - @Test - public void supportsTransactionIsolationLevelTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - Assert.assertEquals(false, - vitessDatabaseMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_NONE)); - Assert.assertEquals(true, vitessDatabaseMetaData - .supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_COMMITTED)); - Assert.assertEquals(true, vitessDatabaseMetaData - .supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED)); - Assert.assertEquals(true, vitessDatabaseMetaData - .supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ)); - Assert.assertEquals(true, vitessDatabaseMetaData - .supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE)); - } - - @Test - public void getMaxProcedureNameLengthTest() throws SQLException { - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - Assert.assertEquals(256, vitessDatabaseMetaData.getMaxProcedureNameLength()); - } - - @Test - public void getMaxCatalogNameLengthTest() throws SQLException { - VitessDatabaseMetaData vitessMySqlDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(32, vitessMySqlDatabaseMetaData.getMaxCatalogNameLength()); - Assert.assertEquals(0, vitessMariaDBDatabaseMetadata.getMaxCatalogNameLength()); - } - - @Test - public void getMaxRowSizeTest() throws SQLException { - VitessDatabaseMetaData vitessMySqlDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(2147483639, vitessMySqlDatabaseMetaData.getMaxRowSize()); - Assert.assertEquals(0, vitessMariaDBDatabaseMetadata.getMaxRowSize()); - } - - @Test - public void getMaxStatementLengthTest() throws SQLException { - VitessDatabaseMetaData vitessMySqlDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(65531, vitessMySqlDatabaseMetaData.getMaxStatementLength()); - Assert.assertEquals(0, vitessMariaDBDatabaseMetadata.getMaxStatementLength()); - } - - @Test - public void getMaxStatementsTest() throws SQLException { - VitessDatabaseMetaData vitessMySqlDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(0, vitessMySqlDatabaseMetaData.getMaxStatements()); - Assert.assertEquals(0, vitessMariaDBDatabaseMetadata.getMaxStatements()); - } - - @Test - public void supportsDataManipulationTransactionsOnlyTest() throws SQLException { - VitessDatabaseMetaData vitessMySqlDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(false, - vitessMySqlDatabaseMetaData.supportsDataManipulationTransactionsOnly()); - Assert.assertEquals(false, - vitessMariaDBDatabaseMetadata.supportsDataManipulationTransactionsOnly()); - } - - @Test - public void getMaxSchemaNameLengthTest() throws SQLException { - VitessDatabaseMetaData vitessMySqlDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(0, vitessMySqlDatabaseMetaData.getMaxSchemaNameLength()); - Assert.assertEquals(32, vitessMariaDBDatabaseMetadata.getMaxSchemaNameLength()); - } - - @Test - public void supportsSavepointsTest() throws SQLException { - VitessDatabaseMetaData vitessMySqlDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(false, vitessMySqlDatabaseMetaData.supportsSavepoints()); - Assert.assertEquals(false, vitessMariaDBDatabaseMetadata.supportsSavepoints()); - } - - @Test - public void supportsMultipleOpenResultsTest() throws SQLException { - VitessDatabaseMetaData vitessMySqlDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(false, vitessMySqlDatabaseMetaData.supportsMultipleOpenResults()); - Assert.assertEquals(false, vitessMariaDBDatabaseMetadata.supportsMultipleOpenResults()); - } - - @Test - public void locatorsUpdateCopyTest() throws SQLException { - VitessDatabaseMetaData vitessMySqlDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(true, vitessMySqlDatabaseMetaData.locatorsUpdateCopy()); - Assert.assertEquals(false, vitessMariaDBDatabaseMetadata.locatorsUpdateCopy()); - } - - @Test - public void supportsStatementPooling() throws SQLException { - VitessDatabaseMetaData vitessMySqlDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - VitessDatabaseMetaData vitessMariaDBDatabaseMetadata = new VitessMariaDBDatabaseMetadata(null); - - Assert.assertEquals(false, vitessMySqlDatabaseMetaData.supportsStatementPooling()); - Assert.assertEquals(false, vitessMariaDBDatabaseMetadata.supportsStatementPooling()); - } - - @Test - public void getCatalogsTest() throws SQLException, Exception { - String sql = "SHOW DATABASES"; - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.VARCHAR).build()).addRows( - Query.Row.newBuilder().addLengths("vitessDB".length()) - .setValues(ByteString.copyFromUtf8("vitessDB"))).addRows( - Query.Row.newBuilder().addLengths("sampleDB".length()) - .setValues(ByteString.copyFromUtf8("sampleDB"))).addRows( - Query.Row.newBuilder().addLengths("testDB".length()) - .setValues(ByteString.copyFromUtf8("testDB"))).addRows( - Query.Row.newBuilder().addLengths("dummyDB".length()) - .setValues(ByteString.copyFromUtf8("dummyDB"))).build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(null); - ResultSet resultSet = vitessDatabaseMetaData.getCatalogs(); - ArrayList resultSetList = new ArrayList(); - while (resultSet.next()) { - resultSetList.add(resultSet.getString(1)); - } - Assert.assertEquals("dummyDB", resultSetList.get(0)); - Assert.assertEquals("sampleDB", resultSetList.get(1)); - Assert.assertEquals("testDB", resultSetList.get(2)); - Assert.assertEquals("vitessDB", resultSetList.get(3)); - } - - @Test - public void getTablesTest() throws SQLException, Exception { - - String sql = "SHOW FULL TABLES FROM `vt` LIKE '%'"; - Cursor mockedCursor = getTablesCursor(); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - getVitessConnection()); - ResultSet actualResultSet = vitessDatabaseMetaData.getTables("vt", null, null, null); - ResultSet expectedResultSet = new VitessResultSet(mockedCursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - - @Test - public void getTablesProperResultTypeTest() throws SQLException, Exception { - - String sql = "SHOW FULL TABLES FROM `vt` LIKE '%'"; - Cursor mockedCursor = getTablesCursor(); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - getVitessConnection()); - ResultSet actualResultSet = vitessDatabaseMetaData.getTables("vt", null, null, null); - actualResultSet.next(); - Assert.assertEquals(String.class, actualResultSet.getObject("TABLE_CAT").getClass()); - } - - private Cursor getTablesCursor() throws Exception { - return new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_TYPE").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("REMARKS").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_CAT").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_SCHEM").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_NAME").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("SELF_REFERENCING_COL_NAME") - .setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("REF_GENERATION").setType(Query.Type.VARCHAR)) - .addRows(Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths("".length()) - .addLengths("SampleTable1".length()).addLengths("TABLE".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("TestDB1sampleTable1TABLE"))).addRows( - Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths("".length()) - .addLengths("SampleView1".length()).addLengths("VIEW".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("TestDB1SampleView1VIEW"))).addRows( - Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths("".length()) - .addLengths("SampleSystemView".length()).addLengths("SYSTEM VIEW".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("TestDB2SampleSystemViewSYSTEM VIEW"))).addRows( - Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths("".length()) - .addLengths("SampleSystemTable".length()).addLengths("SYSTEM TABLE".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("TestDB2SampleSystemTableSYSTEM TABLE"))) - .addRows(Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths("".length()) - .addLengths("SampleLocalTemporary".length()).addLengths("LOCAL TEMPORARY".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("TestDB2SampleLocalTemporaryLOCAL TEMPORARY"))) - .build()); - } - - @Test - public void getColumnsTest() throws SQLException, Exception { - - String sql = "SHOW FULL COLUMNS FROM `sampleTable1` FROM `TestDB1` LIKE '%'"; - Cursor mockedTablecursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_TYPE").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("REMARKS").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_CAT").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_SCHEM").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE_NAME").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("SELF_REFERENCING_COL_NAME") - .setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("REF_GENERATION").setType(Query.Type.VARCHAR)) - .addRows(Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths("".length()) - .addLengths("sampleTable1".length()).addLengths("TABLE".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .addLengths("".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("TestDB1sampleTable1TABLE"))).build()); - - Cursor actualCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("Field").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Type").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Collation").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Null").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Key").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Default").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Extra").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Privileges").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Comment").setType(Query.Type.VARCHAR)).addRows( - Query.Row.newBuilder().addLengths("shipmentid".length()).addLengths("bigint".length()) - .addLengths("NULL".length()).addLengths("NO".length()).addLengths("PRI".length()) - .addLengths("NULL".length()).addLengths("".length()) - .addLengths("select,insert,update,references".length()).addLengths("".length()) - .setValues(ByteString - .copyFromUtf8("shipmentidbigintNULLNOPRINULLselect,insert,update,references"))) - .addRows( - Query.Row.newBuilder().addLengths("trackingid".length()).addLengths("varchar".length()) - .addLengths("utf8_general_ci".length()).addLengths("YES".length()) - .addLengths("".length()).addLengths("NULL".length()).addLengths("".length()) - .addLengths("select,insert,update,references".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8( - "trackingidvarcharutf8_general_ciYESNULLselect,insert,update,references"))) - .build()); - Cursor expectedCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("DATA_TYPE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("TYPE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_SIZE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("BUFFER_LENGTH").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("DECIMAL_DIGITS").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("NUM_PREC_RADIX").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("NULLABLE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("REMARKS").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_DEF").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SQL_DATA_TYPE").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("SQL_DATETIME_SUB").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("CHAR_OCTET_LENGTH").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("ORDINAL_POSITION").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("ISNULLABLE").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SCOPE_CATALOG").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SCOPE_SCHEMA").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SCOPE_TABLE").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("SOURCE_DATA_TYPE").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("IS_AUTOINCREMENT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("IS_GENERATEDCOLUMN").setType(Query.Type.CHAR)) - .addRows(Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths(-1) - .addLengths("sampleTable1".length()).addLengths("shipmentid".length()) - .addLengths("-5".length()).addLengths("BIGINT".length()).addLengths("19".length()) - .addLengths("65535".length()).addLengths("0".length()).addLengths("10".length()) - .addLengths("0".length()).addLengths("Comment".length()).addLengths("NULL".length()) - .addLengths("0".length()).addLengths("0".length()).addLengths("0".length()) - .addLengths("1".length()).addLengths("NO".length()).addLengths(-1).addLengths(-1) - .addLengths(-1).addLengths(-1).addLengths("NO".length()).addLengths("NO".length()) - .setValues(ByteString.copyFromUtf8( - "TestDB1sampleTable1shipmentid-5BIGINT19655350100CommentNULL0001NONONO"))).addRows( - Query.Row.newBuilder().addLengths("TestDB1".length()).addLengths(-1) - .addLengths("sampleTable1".length()).addLengths("trackingid".length()) - .addLengths("12".length()).addLengths("VARCHAR".length()).addLengths("255".length()) - .addLengths("65535".length()).addLengths(-1).addLengths("10".length()) - .addLengths("1".length()).addLengths("Comment".length()).addLengths("NULL".length()) - .addLengths("0".length()).addLengths("0".length()).addLengths("255".length()) - .addLengths("2".length()).addLengths("YES".length()).addLengths(-1).addLengths(-1) - .addLengths(-1).addLengths(-1).addLengths("NO".length()).addLengths("NO".length()) - .setValues(ByteString.copyFromUtf8( - "TestDB1sampleTable1trackingid12VARCHAR25565535101CommentNULL002552YESNONO"))) - .build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(actualCursor)); - - VitessDatabaseMetaData vitessDatabaseMetaData = PowerMockito - .mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.doCallRealMethod().when(vitessDatabaseMetaData) - .getColumns("TestDB1", null, null, null); - PowerMockito.when(vitessDatabaseMetaData.getTables("TestDB1", null, "%", new String[0])) - .thenReturn(new VitessResultSet(mockedTablecursor)); - ResultSet actualResultSet = vitessDatabaseMetaData.getColumns("TestDB1", null, null, null); - ResultSet expectedResultSet = new VitessResultSet(expectedCursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - - @Test - public void getPrimaryKeysTest() throws SQLException, Exception { - - String sql = "SHOW KEYS FROM `shipment` FROM `vt`"; - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Non_unique").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Key_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Seq_in_index").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Column_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Collation").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Cardinality").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Sub_part").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Packed").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Null").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_type").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Comment").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_comment").setType(Query.Type.VARCHAR)) - .addRows(Query.Row.newBuilder().addLengths("shipment".length()).addLengths("0".length()) - .addLengths("PRIMARY".length()).addLengths("1".length()) - .addLengths("shipmentid".length()).addLengths("A".length()) - .addLengths("434880".length()).addLengths(-1).addLengths(-1).addLengths("".length()) - .addLengths("BTREE".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("shipment0PRIMARY1shipmentidA434880BTREE"))) - .build()); - Cursor expectedcursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("COLUMN_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("KEY_SEQ").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("PK_NAME").setType(Query.Type.CHAR)).addRows( - Query.Row.newBuilder().addLengths("vt".length()).addLengths(-1) - .addLengths("shipment".length()).addLengths("shipmentid".length()) - .addLengths("1".length()).addLengths("PRIMARY".length()) - .setValues(ByteString.copyFromUtf8("vtshipmentshipmentid1PRIMARY"))).build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - VitessDatabaseMetaData vitessDatabaseMetaData = PowerMockito - .mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.doCallRealMethod().when(vitessDatabaseMetaData) - .getPrimaryKeys("vt", null, "shipment"); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - ResultSet expectedResultSet = vitessDatabaseMetaData.getPrimaryKeys("vt", null, "shipment"); - ResultSet actualResultSet = new VitessResultSet(expectedcursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - - @Test - public void getIndexInfoTest() throws SQLException, Exception { - - String sql = "SHOW INDEX FROM `shipment` FROM `vt`"; - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("Table").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Non_unique").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Key_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Seq_in_index").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Column_name").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Collation").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Cardinality").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Sub_part").setType(Query.Type.INT64)) - .addFields(Query.Field.newBuilder().setName("Packed").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Null").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_type").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Comment").setType(Query.Type.VARCHAR)) - .addFields(Query.Field.newBuilder().setName("Index_comment").setType(Query.Type.VARCHAR)) - .addRows(Query.Row.newBuilder().addLengths("shipment".length()).addLengths("0".length()) - .addLengths("PRIMARY".length()).addLengths("1".length()) - .addLengths("shipmentid".length()).addLengths("A".length()) - .addLengths("434880".length()).addLengths(-1).addLengths(-1).addLengths("".length()) - .addLengths("BTREE".length()).addLengths("".length()).addLengths("".length()) - .setValues(ByteString.copyFromUtf8("shipment0PRIMARY1shipmentidA434880BTREE"))) - .build()); - - Cursor expectedcursor = new SimpleCursor(Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("TABLE_CAT").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_SCHEM").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TABLE_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("Non_unique").setType(Query.Type.BIT)) - .addFields(Query.Field.newBuilder().setName("INDEX_QUALIFIER").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("INDEX_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("TYPE").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("ORDINAL_POSITION").setType(Query.Type.INT16)) - .addFields(Query.Field.newBuilder().setName("COLUMN_NAME").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("ASC_OR_DESC").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("CARDINALITY").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("PAGES").setType(Query.Type.INT32)) - .addFields(Query.Field.newBuilder().setName("FILTER_CONDITION").setType(Query.Type.CHAR)) - .addRows(Query.Row.newBuilder().addLengths("vt".length()).addLengths(-1) - .addLengths("shipment".length()).addLengths("false".length()).addLengths("".length()) - .addLengths("PRIMARY".length()).addLengths("3".length()).addLengths("1".length()) - .addLengths("shipmentid".length()).addLengths("A".length()) - .addLengths("434880".length()).addLengths("0".length()).addLengths(-1) - .setValues(ByteString.copyFromUtf8("vtshipmentfalsePRIMARY31shipmentidA4348800"))) - .build()); - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - VitessDatabaseMetaData vitessDatabaseMetaData = PowerMockito - .mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.mock(VitessMySQLDatabaseMetadata.class); - PowerMockito.doCallRealMethod().when(vitessDatabaseMetaData) - .getIndexInfo("vt", null, "shipment", true, false); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - ResultSet actualResultSet = vitessDatabaseMetaData - .getIndexInfo("vt", null, "shipment", true, false); - ResultSet expectedResultSet = new VitessResultSet(expectedcursor); - - assertResultSetEquals(actualResultSet, expectedResultSet); - } - - private void assertResultSetEquals(ResultSet actualResultSet, ResultSet expectedResultSet) - throws SQLException { - ResultSetMetaData actualResultSetMetadata = actualResultSet.getMetaData(); - ResultSetMetaData expectedResultSetMetadata = expectedResultSet.getMetaData(); - //Column Count Comparison - Assert.assertEquals(expectedResultSetMetadata.getColumnCount(), - actualResultSetMetadata.getColumnCount()); - //Column Type Comparison - for (int i = 0; i < expectedResultSetMetadata.getColumnCount(); i++) { - Assert.assertEquals(expectedResultSetMetadata.getColumnType(i + 1), - actualResultSetMetadata.getColumnType(i + 1)); - } - - //Actual Values Comparison - while (expectedResultSet.next() && actualResultSet.next()) { - for (int i = 0; i < expectedResultSetMetadata.getColumnCount(); i++) { - switch (expectedResultSetMetadata.getColumnType(i + 1)) { - case Types.TINYINT: - case Types.SMALLINT: - case Types.INTEGER: - Assert.assertEquals(expectedResultSet.getInt(i + 1), actualResultSet.getInt(i + 1)); - break; - case Types.BIGINT: - Assert.assertEquals(expectedResultSet.getLong(i + 1), actualResultSet.getLong(i + 1)); - break; - case Types.FLOAT: - Assert.assertEquals(expectedResultSet.getFloat(i + 1), actualResultSet.getFloat(i + 1), - 0.1); - break; - case Types.DOUBLE: - Assert - .assertEquals(expectedResultSet.getDouble(i + 1), actualResultSet.getDouble(i + 1), - 0.1); - break; - case Types.TIME: - Assert.assertEquals(expectedResultSet.getTime(i + 1), actualResultSet.getTime(i + 1)); - break; - case Types.TIMESTAMP: - Assert.assertEquals(expectedResultSet.getTimestamp(i + 1), - actualResultSet.getTimestamp(i + 1)); - break; - case Types.DATE: - Assert.assertEquals(expectedResultSet.getDate(i + 1), actualResultSet.getDate(i + 1)); - break; - case Types.BLOB: - Assert.assertEquals(expectedResultSet.getBlob(i + 1), actualResultSet.getBlob(i + 1)); - break; - case Types.BINARY: - case Types.LONGVARBINARY: - Assert.assertEquals(expectedResultSet.getBytes(i + 1), actualResultSet.getBytes(i + 1)); - break; - default: - Assert - .assertEquals(expectedResultSet.getString(i + 1), actualResultSet.getString(i + 1)); - break; - } - } - } - } - - @Test - public void getUserNameTest() { - try { - VitessConnection vitessConnection = new VitessConnection( - "jdbc:vitess://username@ip1:port1/keyspace", null); - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - vitessConnection); - Assert.assertEquals("username", vitessDatabaseMetaData.getUserName()); - - vitessConnection = new VitessConnection("jdbc:vitess://ip1:port1/keyspace", null); - vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(vitessConnection); - Assert.assertEquals(null, vitessDatabaseMetaData.getUserName()); - - Properties properties = new Properties(); - properties.put(Constants.Property.USERNAME, "username"); - vitessConnection = new VitessConnection("jdbc:vitess://ip1:port1/keyspace", properties); - vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata(vitessConnection); - Assert.assertEquals("username", vitessDatabaseMetaData.getUserName()); - - } catch (SQLException e) { - Assert.fail("Exception occurred: " + e.getMessage()); - } - } - - @Test - public void testCaseSensitivityIdentifierFuncsMySql() throws Exception { - assertCaseSensitivityForDatabaseType(false); - } - - @Test - public void testCaseSensitivityIdentifierFuncsMariaDb() throws Exception { - assertCaseSensitivityForDatabaseType(true); - } - - private void assertCaseSensitivityForDatabaseType(boolean useMariaDb) throws Exception { - VitessConnection connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", - null); - mockStatementForLowercaseTablesValue("0", useMariaDb); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - - connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null); - mockStatementForLowercaseTablesValue("1", useMariaDb); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - - connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null); - mockStatementForLowercaseTablesValue("2", useMariaDb); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - - connection = new VitessConnection("jdbc:vitess://username@ip1:port1/keyspace", null); - mockStatementForLowercaseTablesValue("something random", useMariaDb); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().supportsMixedCaseQuotedIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseIdentifiers()); - Assert.assertEquals(false, connection.getMetaData().storesLowerCaseQuotedIdentifiers()); - Assert.assertEquals(true, connection.getMetaData().storesMixedCaseQuotedIdentifiers()); - connection.close(); - } - - private void mockStatementForLowercaseTablesValue(String lcTablesValue, boolean useMariaDb) - throws Exception { - String sql = "SHOW VARIABLES WHERE VARIABLE_NAME IN (\'tx_isolation\',\'INNODB_VERSION\', " - + "\'lower_case_table_names\')"; - String versionName = "innodb_version"; - String versionValue = "5.7.16-10"; - if (useMariaDb) { - versionValue = versionValue + "-mariadb"; - } - String txIsoName = "tx_isolation"; - String txIsoValue = "REPEATABLE-READ"; - String lcTablesName = "lower_case_table_names"; - - Cursor mockedCursor = new SimpleCursor(Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("Variable_name").setType(Query.Type.VARCHAR).build()) - .addFields(Query.Field.newBuilder().setName("Value").setType(Query.Type.VARCHAR).build()) - .addRows(Query.Row.newBuilder().addLengths(versionName.length()) - .addLengths(versionValue.length()) - .setValues(ByteString.copyFromUtf8(versionName + versionValue))).addRows( - Query.Row.newBuilder().addLengths(txIsoName.length()).addLengths(txIsoValue.length()) - .setValues(ByteString.copyFromUtf8(txIsoName + txIsoValue))).addRows( - Query.Row.newBuilder().addLengths(lcTablesName.length()) - .addLengths(lcTablesValue.length()) - .setValues(ByteString.copyFromUtf8(lcTablesName + lcTablesValue))).build()); - - VitessStatement vitessStatement = PowerMockito.mock(VitessStatement.class); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.when(vitessStatement.executeQuery(sql)) - .thenReturn(new VitessResultSet(mockedCursor)); - } - - /** - * Tests that we're properly stitching together the results of SHOW CREATE TABLE. See {@link - * #extractForeignKeyForTableTest()} for more thorough testing of the actual parsing - */ - @Test - public void getImportedKeysTest() throws Exception { - try (InputStream resourceAsStream = this.getClass() - .getResourceAsStream("/getImportedKeysTestCase.sql")) { - String table = "testA"; - String showCreate = CharStreams - .toString(new InputStreamReader(resourceAsStream, Charsets.UTF_8)); - - Query.QueryResult queryResult = Query.QueryResult.newBuilder() - .addFields(Query.Field.newBuilder().setName("Table").setType(Query.Type.CHAR)) - .addFields(Query.Field.newBuilder().setName("Create Table").setType(Query.Type.CHAR)) - .addRows(Query.Row.newBuilder().addLengths(table.length()).addLengths(showCreate.length()) - .setValues(ByteString.copyFromUtf8(table + showCreate))).build(); - - String sql = "SHOW CREATE TABLE `testA`"; - VitessConnection vitessConnection = new VitessConnection( - "jdbc:vitess://username@ip1:port1/keyspace", null); - VitessStatement vitessStatement = PowerMockito.spy(new VitessStatement(vitessConnection)); - PowerMockito.whenNew(VitessStatement.class).withAnyArguments().thenReturn(vitessStatement); - PowerMockito.doReturn(new VitessResultSet(new SimpleCursor(queryResult), vitessStatement)) - .when(vitessStatement).executeQuery(sql); - - VitessDatabaseMetaData vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - vitessConnection); - ResultSet importedKeys = vitessDatabaseMetaData.getImportedKeys("test", "test", "testA"); - importedKeys.next(); - Assert.assertEquals("test", importedKeys.getString("PKTABLE_CAT")); - Assert.assertEquals(null, importedKeys.getString("PKTABLE_SCHEM")); - Assert.assertEquals("fTable", importedKeys.getString("PKTABLE_NAME")); - Assert.assertEquals("id", importedKeys.getString("PKCOLUMN_NAME")); - Assert.assertEquals("test", importedKeys.getString("FKTABLE_CAT")); - Assert.assertEquals(null, importedKeys.getString("FKTABLE_SCHEM")); - Assert.assertEquals("testA", importedKeys.getString("FKTABLE_NAME")); - Assert.assertEquals("fIdOne", importedKeys.getString("FKCOLUMN_NAME")); - Assert.assertEquals(1, importedKeys.getInt("KEY_SEQ")); - Assert.assertEquals(3, importedKeys.getInt("UPDATE_RULE")); - Assert.assertEquals(3, importedKeys.getInt("DELETE_RULE")); - Assert.assertEquals("fk_testA", importedKeys.getString("FK_NAME")); - Assert.assertEquals(null, importedKeys.getString("PK_NAME")); - Assert.assertEquals(7, importedKeys.getInt("DEFERRABILITY")); - } - } - - /** - * Tests parsing all the various outputs of SHOW CREATE TABLE for the foreign key constraints. - */ - @Test - public void extractForeignKeyForTableTest() throws SQLException, IOException { - VitessConnection vitessConnection = new VitessConnection( - "jdbc:vitess://username@ip1:port1/keyspace", null); - VitessMySQLDatabaseMetadata vitessDatabaseMetaData = new VitessMySQLDatabaseMetadata( - vitessConnection); - - try (InputStream resourceAsStream = this.getClass() - .getResourceAsStream("/extractForeignKeyForTableTestCases.sql")) { - Scanner scanner = new Scanner(resourceAsStream); - List> rows = new ArrayList<>(); - String testName = null; - String testExpected = null; - String testInput = ""; - String startTag = "-- name: "; - String expectedTag = "-- expected: "; - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - if (line.startsWith(startTag)) { - if (testName != null) { - rows.clear(); - vitessDatabaseMetaData.extractForeignKeyForTable(rows, testInput, "test", "testA"); - assertForeignKeysOutput(testName, testExpected, rows); - testInput = ""; - } - testName = line.substring(startTag.length()); - } else if (line.startsWith(expectedTag)) { - testExpected = line.substring(expectedTag.length()); - } else if (line.startsWith("--") || line.trim().isEmpty()) { - // Just general comment or whitespace, we can ignore - } else { - testInput += line + "\n"; - } - } - - rows.clear(); - vitessDatabaseMetaData.extractForeignKeyForTable(rows, testExpected, "test", "testA"); - assertForeignKeysOutput(testName, testExpected, rows); - } - } - - private void assertForeignKeysOutput(String testName, String expected, - List> output) { - // Uncomment below for debugging - //System.out.println("Name: " + testName); - //System.out.println("Expected: " + expected); - //System.out.println("Output: " + String.valueOf(output)); - Assert.assertEquals(testName, expected, String.valueOf(output)); - } -} diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java deleted file mode 100644 index 8916063ffaf..00000000000 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessParameterMetaDataTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2019 The Vitess Authors. - - * 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 io.vitess.jdbc; - -import java.sql.ParameterMetaData; -import java.sql.SQLException; -import java.sql.Types; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.internal.verification.VerificationModeFactory; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -@RunWith(PowerMockRunner.class) -@PrepareForTest(VitessParameterMetaData.class) -public class VitessParameterMetaDataTest { - - @Test - public void testValidSimpleResponses() throws SQLException { - VitessParameterMetaData metaData = new VitessParameterMetaData(5); - Assert.assertEquals("parameterCount", 5, metaData.getParameterCount()); - Assert.assertEquals("parameterMode", ParameterMetaData.parameterModeIn, - metaData.getParameterMode(2)); - Assert.assertEquals("parameterType", Types.VARCHAR, metaData.getParameterType(2)); - Assert.assertEquals("precision", 0, metaData.getPrecision(2)); - Assert.assertEquals("scale", 0, metaData.getScale(2)); - Assert - .assertEquals("parameterClassName", "java.lang.String", metaData.getParameterClassName(2)); - Assert.assertEquals("parameterTypeName", "VARCHAR", metaData.getParameterTypeName(2)); - Assert.assertEquals("signed", false, metaData.isSigned(2)); - } - - @Test - public void testOutOfBoundsValidation() { - int parameterCount = 1; - VitessParameterMetaData metaData = new VitessParameterMetaData(parameterCount); - - try { - metaData.getParameterType(0); - Assert.fail(); - } catch (SQLException e) { - Assert.assertEquals("Parameter index of '0' is invalid.", e.getMessage()); - } - - int paramNumber = 2; - try { - metaData.getParameterType(paramNumber); - Assert.fail(); - } catch (SQLException e) { - Assert.assertEquals("Parameter index of '" + paramNumber - + "' is greater than number of parameters, which is '" + parameterCount + "'.", - e.getMessage()); - } - } - - @Test - public void testOutOfBoundCoverage() throws Exception { - int param = 2; - VitessParameterMetaData metaData = PowerMockito.spy(new VitessParameterMetaData(5)); - - metaData.getParameterType(param); - metaData.getPrecision(param); - metaData.getScale(param); - metaData.getParameterClassName(param); - metaData.getParameterTypeName(param); - metaData.isSigned(param); - - PowerMockito.verifyPrivate(metaData, VerificationModeFactory.times(6)) - .invoke("checkBounds", param); - } - - @Test(expected = SQLException.class) - public void testNullableNotAvailable() throws SQLException { - VitessParameterMetaData metaData = new VitessParameterMetaData(5); - metaData.isNullable(3); - Assert.fail(); - } -} diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java deleted file mode 100644 index c5a9b4cbd33..00000000000 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessPreparedStatementTest.java +++ /dev/null @@ -1,750 +0,0 @@ -/* - * Copyright 2019 The Vitess Authors. - - * 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 io.vitess.jdbc; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.nullable; -import static org.mockito.Matchers.anyMap; -import static org.mockito.Matchers.anyString; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import com.google.common.collect.ImmutableMap; - -import io.vitess.client.Context; -import io.vitess.client.SQLFuture; -import io.vitess.client.VTGateConnection; -import io.vitess.client.VTSession; -import io.vitess.client.cursor.Cursor; -import io.vitess.client.cursor.CursorWithError; -import io.vitess.mysql.DateTime; -import io.vitess.proto.Query; -import io.vitess.proto.Vtrpc; -import io.vitess.util.Constants; - -import java.lang.reflect.Field; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.sql.BatchUpdateException; -import java.sql.Date; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Time; -import java.sql.Timestamp; -import java.sql.Types; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; - -import javax.sql.rowset.serial.SerialClob; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Matchers; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - - -/** - * Created by harshit.gangal on 09/02/16. - */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({VTGateConnection.class, Vtrpc.RPCError.class}) -public class VitessPreparedStatementTest { - - private String sqlSelect = "select 1 from test_table"; - private String sqlShow = "show tables"; - private String sqlUpdate = "update test_table set msg = null"; - private String sqlInsert = "insert into test_table(msg) values (?)"; - - @Test - public void testStatementExecute() { - VitessConnection mockConn = mock(VitessConnection.class); - VitessPreparedStatement preparedStatement; - try { - preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); - preparedStatement.executeQuery(sqlSelect); - fail("Should have thrown exception for calling this method"); - } catch (SQLException ex) { - assertEquals("This method cannot be called using this class object", ex.getMessage()); - } - - try { - preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); - preparedStatement.executeUpdate(sqlUpdate); - fail("Should have thrown exception for calling this method"); - } catch (SQLException ex) { - assertEquals("This method cannot be called using this class object", ex.getMessage()); - } - - try { - preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); - preparedStatement.execute(sqlShow); - fail("Should have thrown exception for calling this method"); - } catch (SQLException ex) { - assertEquals("This method cannot be called using this class object", ex.getMessage()); - } - } - - @Test - public void testExecuteQuery() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))). - thenReturn(mockSqlFutureCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - - VitessPreparedStatement preparedStatement; - try { - - //Empty Sql Statement - try { - new VitessPreparedStatement(mockConn, ""); - fail("Should have thrown exception for empty sql"); - } catch (SQLException ex) { - assertEquals("SQL statement is not valid", ex.getMessage()); - } - - //show query - preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); - ResultSet rs = preparedStatement.executeQuery(); - assertEquals(-1, preparedStatement.getUpdateCount()); - - //select on replica with bind variables - preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect, - ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - rs = preparedStatement.executeQuery(); - assertEquals(-1, preparedStatement.getUpdateCount()); - - //select on replica without bind variables - preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect, - ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - rs = preparedStatement.executeQuery(); - assertEquals(-1, preparedStatement.getUpdateCount()); - - //select on primary - rs = preparedStatement.executeQuery(); - assertEquals(-1, preparedStatement.getUpdateCount()); - - try { - //when returned cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); - preparedStatement.executeQuery(); - fail("Should have thrown exception for cursor null"); - } catch (SQLException ex) { - assertEquals("Failed to execute this method", ex.getMessage()); - } - - } catch (SQLException e) { - fail("Test failed " + e.getMessage()); - } - } - - @Test - public void testExecuteQueryWithStream() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn - .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockCursor); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.STREAM); - - VitessPreparedStatement preparedStatement; - try { - - //Empty Sql Statement - try { - new VitessPreparedStatement(mockConn, ""); - fail("Should have thrown exception for empty sql"); - } catch (SQLException ex) { - assertEquals("SQL statement is not valid", ex.getMessage()); - } - - //show query - preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); - ResultSet rs = preparedStatement.executeQuery(); - assertEquals(-1, preparedStatement.getUpdateCount()); - - //select on replica with bind variables - preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect, - ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - rs = preparedStatement.executeQuery(); - assertEquals(-1, preparedStatement.getUpdateCount()); - - //select on replica without bind variables - preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect, - ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - rs = preparedStatement.executeQuery(); - assertEquals(-1, preparedStatement.getUpdateCount()); - - //select on primary - rs = preparedStatement.executeQuery(); - assertEquals(-1, preparedStatement.getUpdateCount()); - - try { - //when returned cursor is null - when(mockVtGateConn - .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(null); - preparedStatement.executeQuery(); - fail("Should have thrown exception for cursor null"); - } catch (SQLException ex) { - assertEquals("Failed to execute this method", ex.getMessage()); - } - - } catch (SQLException e) { - fail("Test failed " + e.getMessage()); - } - } - - - @Test - public void testExecuteUpdate() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List fieldList = mock(ArrayList.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - - VitessPreparedStatement preparedStatement; - try { - - //executing dml on primary - preparedStatement = new VitessPreparedStatement(mockConn, sqlUpdate, - ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - int updateCount = preparedStatement.executeUpdate(); - assertEquals(0, updateCount); - - //tx is null & autoCommit is true - when(mockConn.getAutoCommit()).thenReturn(true); - preparedStatement = new VitessPreparedStatement(mockConn, sqlUpdate); - updateCount = preparedStatement.executeUpdate(); - assertEquals(0, updateCount); - - //cursor fields is not null - when(mockCursor.getFields()).thenReturn(fieldList); - when(fieldList.isEmpty()).thenReturn(false); - try { - preparedStatement.executeUpdate(); - fail("Should have thrown exception for field not null"); - } catch (SQLException ex) { - assertEquals("ResultSet generation is not allowed through this method", ex.getMessage()); - } - - //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); - try { - preparedStatement.executeUpdate(); - fail("Should have thrown exception for cursor null"); - } catch (SQLException ex) { - assertEquals("Failed to execute this method", ex.getMessage()); - } - - //read only - when(mockConn.isReadOnly()).thenReturn(true); - try { - preparedStatement.executeUpdate(); - fail("Should have thrown exception for read only"); - } catch (SQLException ex) { - assertEquals(Constants.SQLExceptionMessages.READ_ONLY, ex.getMessage()); - } - - //read only - when(mockConn.isReadOnly()).thenReturn(true); - try { - preparedStatement.executeBatch(); - fail("Should have thrown exception for read only"); - } catch (SQLException ex) { - assertEquals(Constants.SQLExceptionMessages.READ_ONLY, ex.getMessage()); - } - - } catch (SQLException e) { - fail("Test failed " + e.getMessage()); - } - } - - @Test - public void testExecute() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List mockFieldList = PowerMockito.spy(new ArrayList<>()); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); - - when(mockConn.getAutoCommit()).thenReturn(true); - - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(mockFieldList); - - VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect, - ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); - try { - - int fieldSize = 5; - when(mockCursor.getFields()).thenReturn(mockFieldList); - PowerMockito.doReturn(fieldSize).when(mockFieldList).size(); - PowerMockito.doReturn(false).when(mockFieldList).isEmpty(); - boolean hasResultSet = preparedStatement.execute(); - Assert.assertTrue(hasResultSet); - Assert.assertNotNull(preparedStatement.getResultSet()); - - preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); - hasResultSet = preparedStatement.execute(); - Assert.assertTrue(hasResultSet); - Assert.assertNotNull(preparedStatement.getResultSet()); - - int mockUpdateCount = 10; - when(mockCursor.getFields()) - .thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - when(mockCursor.getRowsAffected()).thenReturn((long) mockUpdateCount); - preparedStatement = new VitessPreparedStatement(mockConn, sqlUpdate); - hasResultSet = preparedStatement.execute(); - Assert.assertFalse(hasResultSet); - Assert.assertNull(preparedStatement.getResultSet()); - assertEquals(mockUpdateCount, preparedStatement.getUpdateCount()); - - //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); - try { - preparedStatement = new VitessPreparedStatement(mockConn, sqlShow); - preparedStatement.execute(); - fail("Should have thrown exception for cursor null"); - } catch (SQLException ex) { - assertEquals("Failed to execute this method", ex.getMessage()); - } - - } catch (SQLException e) { - fail("Test failed " + e.getMessage()); - } - } - - @Test - public void testExecuteFetchSizeAsStreaming() throws SQLException { - testExecute(5, true, false, true); - testExecute(5, false, false, true); - testExecute(0, true, true, false); - testExecute(0, false, false, true); - } - - private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRunExecute, - boolean shouldRunStreamExecute) throws SQLException { - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - - VitessConnection mockConn = mock(VitessConnection.class); - when(mockConn.isSimpleExecute()).thenReturn(simpleExecute); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockVtGateConn - .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockCursor); - - VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, sqlSelect); - statement.setFetchSize(fetchSize); - statement.executeQuery(); - - if (shouldRunExecute) { - Mockito.verify(mockVtGateConn, Mockito.times(2)) - .execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class)); - } - - if (shouldRunStreamExecute) { - Mockito.verify(mockVtGateConn) - .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class)); - } - } - - @Test - public void testGetUpdateCount() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFuture = mock(SQLFuture.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFuture); - when(mockSqlFuture.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - - VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect); - try { - - when(mockCursor.getRowsAffected()).thenReturn(10L); - int updateCount = preparedStatement.executeUpdate(); - assertEquals(10L, updateCount); - assertEquals(10L, preparedStatement.getUpdateCount()); - - // Truncated Update Count - when(mockCursor.getRowsAffected()).thenReturn((long) Integer.MAX_VALUE + 10); - updateCount = preparedStatement.executeUpdate(); - assertEquals(Integer.MAX_VALUE, updateCount); - assertEquals(Integer.MAX_VALUE, preparedStatement.getUpdateCount()); - - when(mockConn.isSimpleExecute()).thenReturn(true); - preparedStatement.executeQuery(); - assertEquals(-1, preparedStatement.getUpdateCount()); - - } catch (SQLException e) { - fail("Test failed " + e.getMessage()); - } - } - - @Test - public void testSetParameters() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); - Mockito.when(mockConn.getTreatUtilDateAsTimestamp()).thenReturn(true); - VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect); - Boolean boolValue = true; - Byte byteValue = Byte.MAX_VALUE; - Short shortValue = Short.MAX_VALUE; - Integer intValue = Integer.MAX_VALUE; - Long longValue = Long.MAX_VALUE; - Float floatValue = Float.MAX_VALUE; - Double doubleValue = Double.MAX_VALUE; - BigDecimal bigDecimalValue = new BigDecimal(3.14159265358979323846); - BigDecimal expectedDecimalValue = new BigDecimal("3.14159"); - BigInteger bigIntegerValue = new BigInteger("18446744073709551615"); - String stringValue = "vitess"; - byte[] bytesValue = stringValue.getBytes(); - Date dateValue = new Date(0); - // Use a time value that won't go negative after adjusting for time zone. - // The java.sql.Time class does not properly format negative times. - Time timeValue = new Time(12 * 60 * 60 * 1000); - Timestamp timestampValue = new Timestamp(0); - - preparedStatement.setNull(1, Types.INTEGER); - preparedStatement.setBoolean(2, boolValue); - preparedStatement.setByte(3, byteValue); - preparedStatement.setShort(4, shortValue); - preparedStatement.setInt(5, intValue); - preparedStatement.setLong(6, longValue); - preparedStatement.setFloat(7, floatValue); - preparedStatement.setDouble(8, doubleValue); - preparedStatement.setBigDecimal(9, bigDecimalValue); - preparedStatement.setBigInteger(10, bigIntegerValue); - preparedStatement.setString(11, stringValue); - preparedStatement.setBytes(12, bytesValue); - preparedStatement.setDate(13, dateValue); - preparedStatement.setTime(14, timeValue); - preparedStatement.setTimestamp(15, timestampValue); - preparedStatement.setDate(16, dateValue, Calendar.getInstance(TimeZone.getDefault())); - preparedStatement.setTime(17, timeValue, Calendar.getInstance(TimeZone.getDefault())); - preparedStatement.setTimestamp(18, timestampValue, Calendar.getInstance(TimeZone.getDefault())); - preparedStatement.setObject(19, boolValue); - preparedStatement.setObject(20, byteValue); - preparedStatement.setObject(21, shortValue); - preparedStatement.setObject(22, intValue); - preparedStatement.setObject(23, longValue); - preparedStatement.setObject(24, floatValue); - preparedStatement.setObject(25, doubleValue); - preparedStatement.setObject(26, bigDecimalValue); - preparedStatement.setObject(27, bigIntegerValue); - preparedStatement.setObject(28, stringValue); - preparedStatement.setObject(29, dateValue); - preparedStatement.setObject(30, timeValue); - preparedStatement.setObject(31, timestampValue); - preparedStatement.setObject(32, 'a'); - preparedStatement.setObject(33, null); - preparedStatement.setObject(34, boolValue, Types.BOOLEAN, 0); - preparedStatement.setObject(35, shortValue, Types.SMALLINT, 0); - preparedStatement.setObject(36, longValue, Types.BIGINT, 0); - preparedStatement.setObject(37, floatValue, Types.DOUBLE, 2); - preparedStatement.setObject(38, doubleValue, Types.DOUBLE, 3); - preparedStatement.setObject(39, bigDecimalValue, Types.DECIMAL, 5); - preparedStatement.setObject(40, stringValue, Types.VARCHAR, 0); - preparedStatement.setObject(41, dateValue, Types.DATE, 0); - preparedStatement.setObject(42, timeValue, Types.TIME, 0); - preparedStatement.setObject(43, timestampValue, Types.TIMESTAMP, 0); - preparedStatement.setClob(44, new SerialClob("clob".toCharArray())); - preparedStatement.setObject(45, bytesValue); - Field bindVariablesMap = preparedStatement.getClass().getDeclaredField("bindVariables"); - bindVariablesMap.setAccessible(true); - Map bindVariables = (Map) bindVariablesMap - .get(preparedStatement); - assertEquals(null, bindVariables.get("v1")); - assertEquals(boolValue, bindVariables.get("v2")); - assertEquals(byteValue, bindVariables.get("v3")); - assertEquals(shortValue, bindVariables.get("v4")); - assertEquals(intValue, bindVariables.get("v5")); - assertEquals(longValue, bindVariables.get("v6")); - assertEquals(floatValue, bindVariables.get("v7")); - assertEquals(doubleValue, bindVariables.get("v8")); - assertEquals(bigDecimalValue, bindVariables.get("v9")); - assertEquals(bigIntegerValue, bindVariables.get("v10")); - assertEquals(stringValue, bindVariables.get("v11")); - assertEquals(bytesValue, bindVariables.get("v12")); - assertEquals(dateValue.toString(), bindVariables.get("v13")); - assertEquals(timeValue.toString(), bindVariables.get("v14")); - assertEquals(timestampValue.toString(), bindVariables.get("v15")); - assertEquals(dateValue.toString(), bindVariables.get("v16")); - assertEquals(timeValue.toString(), bindVariables.get("v17")); - assertEquals(timestampValue.toString(), bindVariables.get("v18")); - assertEquals(boolValue, bindVariables.get("v19")); - assertEquals(byteValue, bindVariables.get("v20")); - assertEquals(shortValue, bindVariables.get("v21")); - assertEquals(intValue, bindVariables.get("v22")); - assertEquals(longValue, bindVariables.get("v23")); - assertEquals(floatValue, bindVariables.get("v24")); - assertEquals(doubleValue, bindVariables.get("v25")); - assertEquals(bigDecimalValue, bindVariables.get("v26")); - assertEquals(bigIntegerValue, bindVariables.get("v27")); - assertEquals(stringValue, bindVariables.get("v28")); - assertEquals(dateValue.toString(), bindVariables.get("v29")); - assertEquals(timeValue.toString(), bindVariables.get("v30")); - assertEquals(timestampValue.toString(), bindVariables.get("v31")); - assertEquals("a", bindVariables.get("v32")); - assertEquals(null, bindVariables.get("v33")); - assertEquals(true, bindVariables.get("v34")); - assertEquals(shortValue.intValue(), bindVariables.get("v35")); - assertEquals(longValue, bindVariables.get("v36")); - assertEquals((double) floatValue, (double) bindVariables.get("v37"), 0.1); - assertEquals(doubleValue, (double) bindVariables.get("v38"), 0.1); - assertEquals(expectedDecimalValue, bindVariables.get("v39")); - assertEquals(stringValue, bindVariables.get("v40")); - assertEquals(dateValue.toString(), bindVariables.get("v41")); - assertEquals(timeValue.toString(), bindVariables.get("v42")); - assertEquals(timestampValue.toString(), bindVariables.get("v43")); - assertEquals("clob", bindVariables.get("v44")); - Assert.assertArrayEquals(bytesValue, (byte[]) bindVariables.get("v45")); - - preparedStatement.clearParameters(); - } - - @Test - public void testTreatUtilDateAsTimestamp() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); - VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect); - - java.util.Date utilDateValue = new java.util.Date(System.currentTimeMillis()); - Timestamp timestamp = new Timestamp(utilDateValue.getTime()); - try { - preparedStatement.setObject(1, utilDateValue); - fail("setObject on java.util.Date should have failed with SQLException"); - } catch (SQLException e) { - Assert.assertTrue(e.getMessage().startsWith(Constants.SQLExceptionMessages.SQL_TYPE_INFER)); - } - - preparedStatement.clearParameters(); - - Mockito.when(mockConn.getTreatUtilDateAsTimestamp()).thenReturn(true); - preparedStatement = new VitessPreparedStatement(mockConn, sqlSelect); - preparedStatement.setObject(1, utilDateValue); - - Field bindVariablesMap = preparedStatement.getClass().getDeclaredField("bindVariables"); - bindVariablesMap.setAccessible(true); - Map bindVariables = (Map) bindVariablesMap - .get(preparedStatement); - - assertEquals(DateTime.formatTimestamp(timestamp), bindVariables.get("v1")); - } - - @Test - public void testAutoGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - - try { - - long expectedFirstGeneratedId = 121; - long[] expectedGeneratedIds = {121, 122}; - int expectedAffectedRows = 2; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedAffectedRows)); - - //Executing Insert Statement - VitessPreparedStatement preparedStatement = new VitessPreparedStatement(mockConn, sqlInsert, - Statement.RETURN_GENERATED_KEYS); - int updateCount = preparedStatement.executeUpdate(); - assertEquals(expectedAffectedRows, updateCount); - - ResultSet rs = preparedStatement.getGeneratedKeys(); - int i = 0; - while (rs.next()) { - long generatedId = rs.getLong(1); - assertEquals(expectedGeneratedIds[i++], generatedId); - } - - } catch (SQLException e) { - fail("Test failed " + e.getMessage()); - } - } - - @Test - public void testAddBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, sqlInsert); - try { - statement.addBatch(this.sqlInsert); - fail("Should have thrown Exception"); - } catch (SQLException ex) { - assertEquals(Constants.SQLExceptionMessages.METHOD_NOT_ALLOWED, ex.getMessage()); - } - statement.setString(1, "string1"); - statement.addBatch(); - try { - Field privateStringField = VitessPreparedStatement.class.getDeclaredField("batchedArgs"); - privateStringField.setAccessible(true); - assertEquals("string1", - (((List>) privateStringField.get(statement)).get(0)).get("v1")); - } catch (NoSuchFieldException e) { - fail("Private Field should exists: batchedArgs"); - } catch (IllegalAccessException e) { - fail("Private Field should be accessible: batchedArgs"); - } - } - - @Test - public void testClearBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, sqlInsert); - statement.setString(1, "string1"); - statement.addBatch(); - statement.clearBatch(); - try { - Field privateStringField = VitessPreparedStatement.class.getDeclaredField("batchedArgs"); - privateStringField.setAccessible(true); - Assert.assertTrue(((List>) privateStringField.get(statement)).isEmpty()); - } catch (NoSuchFieldException e) { - fail("Private Field should exists: batchedArgs"); - } catch (IllegalAccessException e) { - fail("Private Field should be accessible: batchedArgs"); - } - } - - @Test - public void testExecuteBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, sqlInsert); - int[] updateCounts = statement.executeBatch(); - assertEquals(0, updateCounts.length); - - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); - - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when(mockVtGateConn.executeBatch(nullable(Context.class), Matchers.anyList(), Matchers.anyList(), - nullable(VTSession.class))).thenReturn(mockSqlFutureCursor); - - List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - - CursorWithError mockCursorWithError1 = mock(CursorWithError.class); - when(mockCursorWithError1.getError()).thenReturn(null); - when(mockCursorWithError1.getCursor()).thenReturn(mock(Cursor.class)); - mockCursorWithErrorList.add(mockCursorWithError1); - - statement.setString(1, "string1"); - statement.addBatch(); - updateCounts = statement.executeBatch(); - assertEquals(1, updateCounts.length); - - CursorWithError mockCursorWithError2 = mock(CursorWithError.class); - Vtrpc.RPCError rpcError = Vtrpc.RPCError.newBuilder() - .setMessage("preparedStatement execute batch error").build(); - when(mockCursorWithError2.getError()).thenReturn(rpcError); - mockCursorWithErrorList.add(mockCursorWithError2); - statement.setString(1, "string1"); - statement.addBatch(); - statement.setString(1, "string2"); - statement.addBatch(); - try { - statement.executeBatch(); - fail("Should have thrown Exception"); - } catch (BatchUpdateException ex) { - assertEquals(rpcError.toString(), ex.getMessage()); - assertEquals(2, ex.getUpdateCounts().length); - assertEquals(Statement.EXECUTE_FAILED, ex.getUpdateCounts()[1]); - } - } - - @Test - public void testStatementCount() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - Map testCases = ImmutableMap.builder() - .put("select * from foo where a = ?", 1).put("select * from foo where a = ? and b = ?", 2) - .put("select * from foo where a = ? and b = \"?\"", 1) - .put("select * from foo where a = ? and b = '?'", 1) - .put("select * from foo where a = ? and b = `?`", 1) - .put("select foo.*, `bar.baz?` from foo, bar where foo.a = ? and bar.b = foo.b", 1) - .put("select * from foo where a = ? and b = \"`?`\"", 1) - .put("select * from foo where a = ? --and b = ?", 1) - .put("select * from foo where a = ? /* and b = ? */ and c = ?", 2) - .put("/* leading comment? */ select * from foo where a = ? and b = ?", 2) - .put("select * from foo where a = ? and b = ? and c = 'test' and d = ?", 3) - .put("select * from foo where a = ? and b = \\`?\\`", - 2) // not valid sql but validates escaping - .put("select * from foo where a = ? and b = \\?", 1) // not valid sql but validates escaping - .put("update foo set a = ?, b = ? where c = 'test' and d = ?", 3).put( - "insert into foo (`a`, `b`) values (?, ?), (?, ?) on /* test? */ duplicate key update" - + " a = \"?\"", - 4).put("delete from foo where a = ? and b = '?'", 1).build(); - - for (Map.Entry testCase : testCases.entrySet()) { - VitessPreparedStatement statement = new VitessPreparedStatement(mockConn, testCase.getKey()); - assertEquals(testCase.getKey(), testCase.getValue().longValue(), - statement.getParameterMetaData().getParameterCount()); - } - } -} diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java deleted file mode 100644 index a2be875e0d0..00000000000 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessResultSetTest.java +++ /dev/null @@ -1,875 +0,0 @@ -/* - * Copyright 2019 The Vitess Authors. - - * 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 io.vitess.jdbc; - -import static org.junit.Assert.assertEquals; - -import com.google.protobuf.ByteString; - -import io.vitess.client.cursor.Cursor; -import io.vitess.client.cursor.SimpleCursor; -import io.vitess.proto.Query; -import io.vitess.util.MysqlDefs; -import io.vitess.util.StringUtils; -import io.vitess.util.charset.CharsetMapping; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.sql.Clob; -import java.sql.SQLException; -import java.sql.Time; -import java.sql.Timestamp; -import java.util.Properties; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Matchers; -import org.mockito.internal.verification.VerificationModeFactory; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -/** - * Created by harshit.gangal on 19/01/16. - */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(VitessResultSet.class) -public class VitessResultSetTest extends BaseTest { - - public Cursor getCursorWithRows() { - /* - INT8(1, 257), -50 - UINT8(2, 770), 50 - INT16(3, 259), -23000 - UINT16(4, 772), 23000 - INT24(5, 261), -100 - UINT24(6, 774), 100 - INT32(7, 263), -100 - UINT32(8, 776), 100 - INT64(9, 265), -1000 - UINT64(10, 778), 1000 - FLOAT32(11, 1035), 24.53 - FLOAT64(12, 1036), 100.43 - TIMESTAMP(13, 2061), 2016-02-06 14:15:16 - DATE(14, 2062), 2016-02-06 - TIME(15, 2063), 12:34:56 - DATETIME(16, 2064), 2016-02-06 14:15:16 - YEAR(17, 785), 2016 - DECIMAL(18, 18), 1234.56789 - TEXT(19, 6163), HELLO TDS TEAM - BLOB(20, 10260), HELLO TDS TEAM - VARCHAR(21, 6165), HELLO TDS TEAM - VARBINARY(22, 10262), HELLO TDS TEAM - CHAR(23, 6167), N - BINARY(24, 10264), HELLO TDS TEAM - BIT(25, 2073), 1 - ENUM(26, 2074), val123 - SET(27, 2075), val123 - TUPLE(28, 28), - UNRECOGNIZED(-1, -1); - */ - return new SimpleCursor( - Query.QueryResult.newBuilder().addFields(getField("col1", Query.Type.INT8)) - .addFields(getField("col2", Query.Type.UINT8)) - .addFields(getField("col3", Query.Type.INT16)) - .addFields(getField("col4", Query.Type.UINT16)) - .addFields(getField("col5", Query.Type.INT24)) - .addFields(getField("col6", Query.Type.UINT24)) - .addFields(getField("col7", Query.Type.INT32)) - .addFields(getField("col8", Query.Type.UINT32)) - .addFields(getField("col9", Query.Type.INT64)) - .addFields(getField("col10", Query.Type.UINT64)) - .addFields(getField("col11", Query.Type.FLOAT32)) - .addFields(getField("col12", Query.Type.FLOAT64)) - .addFields(getField("col13", Query.Type.TIMESTAMP)) - .addFields(getField("col14", Query.Type.DATE)) - .addFields(getField("col15", Query.Type.TIME)) - .addFields(getField("col16", Query.Type.DATETIME)) - .addFields(getField("col17", Query.Type.YEAR)) - .addFields(getField("col18", Query.Type.DECIMAL)) - .addFields(getField("col19", Query.Type.TEXT)) - .addFields(getField("col20", Query.Type.BLOB)) - .addFields(getField("col21", Query.Type.VARCHAR)) - .addFields(getField("col22", Query.Type.VARBINARY)) - .addFields(getField("col23", Query.Type.CHAR)) - .addFields(getField("col24", Query.Type.BINARY)) - .addFields(getField("col25", Query.Type.BIT)) - .addFields(getField("col26", Query.Type.ENUM)) - .addFields(getField("col27", Query.Type.SET)) - .addFields(getField("col28", Query.Type.TIMESTAMP)).addRows( - Query.Row.newBuilder().addLengths("-50".length()).addLengths("50".length()) - .addLengths("-23000".length()).addLengths("23000".length()) - .addLengths("-100".length()).addLengths("100".length()).addLengths("-100".length()) - .addLengths("100".length()).addLengths("-1000".length()).addLengths("1000".length()) - .addLengths("24.52".length()).addLengths("100.43".length()) - .addLengths("2016-02-06 14:15:16".length()).addLengths("2016-02-06".length()) - .addLengths("12:34:56".length()).addLengths("2016-02-06 14:15:16".length()) - .addLengths("2016".length()).addLengths("1234.56789".length()) - .addLengths("HELLO TDS TEAM".length()).addLengths("HELLO TDS TEAM".length()) - .addLengths("HELLO TDS TEAM".length()).addLengths("HELLO TDS TEAM".length()) - .addLengths("N".length()).addLengths("HELLO TDS TEAM".length()) - .addLengths("1".length()).addLengths("val123".length()) - .addLengths("val123".length()).addLengths("0000-00-00 00:00:00".length()).setValues( - ByteString.copyFromUtf8( - "-5050-2300023000-100100-100100-1000100024.52100.432016-02-06 " - + "14:15:162016-02-0612:34:562016-02-06 14:15:1620161234.56789HELLO TDS " - + "TEAMHELLO TDS TEAMHELLO" - + " TDS TEAMHELLO TDS TEAMNHELLO TDS TEAM1val123val1230000-00-00 " - + "00:00:00"))) - .build()); - } - - private Query.Field getField(String fieldName, Query.Type typ) { - return Query.Field.newBuilder().setName(fieldName).setType(typ).build(); - } - - private Query.Field getField(String fieldName) { - return Query.Field.newBuilder().setName(fieldName).build(); - } - - public Cursor getCursorWithRowsAsNull() { - /* - INT8(1, 257), -50 - UINT8(2, 770), 50 - INT16(3, 259), -23000 - UINT16(4, 772), 23000 - INT24(5, 261), -100 - UINT24(6, 774), 100 - INT32(7, 263), -100 - UINT32(8, 776), 100 - INT64(9, 265), -1000 - UINT64(10, 778), 1000 - FLOAT32(11, 1035), 24.53 - FLOAT64(12, 1036), 100.43 - TIMESTAMP(13, 2061), 2016-02-06 14:15:16 - DATE(14, 2062), 2016-02-06 - TIME(15, 2063), 12:34:56 - DATETIME(16, 2064), 2016-02-06 14:15:16 - YEAR(17, 785), 2016 - DECIMAL(18, 18), 1234.56789 - TEXT(19, 6163), HELLO TDS TEAM - BLOB(20, 10260), HELLO TDS TEAM - VARCHAR(21, 6165), HELLO TDS TEAM - VARBINARY(22, 10262), HELLO TDS TEAM - CHAR(23, 6167), N - BINARY(24, 10264), HELLO TDS TEAM - BIT(25, 2073), 0 - ENUM(26, 2074), val123 - SET(27, 2075), val123 - TUPLE(28, 28), - UNRECOGNIZED(-1, -1); - */ - return new SimpleCursor( - Query.QueryResult.newBuilder().addFields(getField("col1", Query.Type.INT8)) - .addFields(getField("col2", Query.Type.UINT8)) - .addFields(getField("col3", Query.Type.INT16)) - .addFields(getField("col4", Query.Type.UINT16)) - .addFields(getField("col5", Query.Type.INT24)) - .addFields(getField("col6", Query.Type.UINT24)) - .addFields(getField("col7", Query.Type.INT32)) - .addFields(getField("col8", Query.Type.UINT32)) - .addFields(getField("col9", Query.Type.INT64)) - .addFields(getField("col10", Query.Type.UINT64)) - .addFields(getField("col11", Query.Type.FLOAT32)) - .addFields(getField("col12", Query.Type.FLOAT64)) - .addFields(getField("col13", Query.Type.TIMESTAMP)) - .addFields(getField("col14", Query.Type.DATE)) - .addFields(getField("col15", Query.Type.TIME)) - .addFields(getField("col16", Query.Type.DATETIME)) - .addFields(getField("col17", Query.Type.YEAR)) - .addFields(getField("col18", Query.Type.DECIMAL)) - .addFields(getField("col19", Query.Type.TEXT)) - .addFields(getField("col20", Query.Type.BLOB)) - .addFields(getField("col21", Query.Type.VARCHAR)) - .addFields(getField("col22", Query.Type.VARBINARY)) - .addFields(getField("col23", Query.Type.CHAR)) - .addFields(getField("col24", Query.Type.BINARY)) - .addFields(getField("col25", Query.Type.BIT)) - .addFields(getField("col26", Query.Type.ENUM)) - .addFields(getField("col27", Query.Type.SET)).addRows( - Query.Row.newBuilder().addLengths("-50".length()).addLengths("50".length()) - .addLengths("-23000".length()).addLengths("23000".length()) - .addLengths("-100".length()).addLengths("100".length()).addLengths("-100".length()) - .addLengths("100".length()).addLengths("-1000".length()).addLengths("1000".length()) - .addLengths("24.52".length()).addLengths("100.43".length()) - .addLengths("2016-02-06 14:15:16".length()).addLengths("2016-02-06".length()) - .addLengths("12:34:56".length()).addLengths("2016-02-06 14:15:16".length()) - .addLengths("2016".length()).addLengths("1234.56789".length()) - .addLengths("HELLO TDS TEAM".length()).addLengths("HELLO TDS TEAM".length()) - .addLengths("HELLO TDS TEAM".length()).addLengths("HELLO TDS TEAM".length()) - .addLengths("N".length()).addLengths("HELLO TDS TEAM".length()) - .addLengths("0".length()).addLengths("val123".length()).addLengths(-1).setValues( - ByteString.copyFromUtf8( - "-5050-2300023000-100100-100100-1000100024.52100.432016-02-06 " - + "14:15:162016-02-0612:34:562016-02-06 14:15:1620161234.56789HELLO TDS " - + "TEAMHELLO TDS " - + "TEAMHELLO TDS TEAMHELLO TDS TEAMNHELLO TDS TEAM0val123"))).build()); - } - - @Test - public void testNextWithZeroRows() throws Exception { - Cursor cursor = new SimpleCursor( - Query.QueryResult.newBuilder().addFields(getField("col0")).addFields(getField("col1")) - .addFields(getField("col2")).build()); - - VitessResultSet vitessResultSet = new VitessResultSet(cursor); - assertEquals(false, vitessResultSet.next()); - } - - @Test - public void testNextWithNonZeroRows() throws Exception { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor); - assertEquals(true, vitessResultSet.next()); - assertEquals(false, vitessResultSet.next()); - } - - @Test - public void testgetString() throws SQLException { - Cursor cursor = getCursorWithRowsAsNull(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals("-50", vitessResultSet.getString(1)); - assertEquals("50", vitessResultSet.getString(2)); - assertEquals("-23000", vitessResultSet.getString(3)); - assertEquals("23000", vitessResultSet.getString(4)); - assertEquals("-100", vitessResultSet.getString(5)); - assertEquals("100", vitessResultSet.getString(6)); - assertEquals("-100", vitessResultSet.getString(7)); - assertEquals("100", vitessResultSet.getString(8)); - assertEquals("-1000", vitessResultSet.getString(9)); - assertEquals("1000", vitessResultSet.getString(10)); - assertEquals("24.52", vitessResultSet.getString(11)); - assertEquals("100.43", vitessResultSet.getString(12)); - assertEquals("2016-02-06 14:15:16.0", vitessResultSet.getString(13)); - assertEquals("2016-02-06", vitessResultSet.getString(14)); - assertEquals("12:34:56", vitessResultSet.getString(15)); - assertEquals("2016-02-06 14:15:16.0", vitessResultSet.getString(16)); - assertEquals("2016", vitessResultSet.getString(17)); - assertEquals("1234.56789", vitessResultSet.getString(18)); - assertEquals("HELLO TDS TEAM", vitessResultSet.getString(19)); - assertEquals("HELLO TDS TEAM", vitessResultSet.getString(20)); - assertEquals("HELLO TDS TEAM", vitessResultSet.getString(21)); - assertEquals("HELLO TDS TEAM", vitessResultSet.getString(22)); - assertEquals("N", vitessResultSet.getString(23)); - assertEquals("HELLO TDS TEAM", vitessResultSet.getString(24)); - assertEquals("0", vitessResultSet.getString(25)); - assertEquals("val123", vitessResultSet.getString(26)); - assertEquals(null, vitessResultSet.getString(27)); - } - - @Test - public void getObjectUint64AsBigInteger() throws SQLException { - Cursor cursor = getCursorWithRowsAsNull(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - - assertEquals(new BigInteger("1000"), vitessResultSet.getObject(10)); - } - - @Test - public void getBigInteger() throws SQLException { - Cursor cursor = getCursorWithRowsAsNull(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - - assertEquals(new BigInteger("1000"), vitessResultSet.getBigInteger(10)); - } - - @Test - public void testgetBoolean() throws SQLException { - Cursor cursor = getCursorWithRows(); - Cursor cursorWithRowsAsNull = getCursorWithRowsAsNull(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(true, vitessResultSet.getBoolean(25)); - assertEquals(false, vitessResultSet.getBoolean(1)); - vitessResultSet = new VitessResultSet(cursorWithRowsAsNull, getVitessStatement()); - vitessResultSet.next(); - assertEquals(false, vitessResultSet.getBoolean(25)); - assertEquals(false, vitessResultSet.getBoolean(1)); - } - - @Test - public void testgetByte() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(-50, vitessResultSet.getByte(1)); - assertEquals(1, vitessResultSet.getByte(25)); - } - - @Test - public void testgetShort() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(-23000, vitessResultSet.getShort(3)); - } - - @Test - public void testgetInt() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(-100, vitessResultSet.getInt(7)); - } - - @Test - public void testgetLong() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(-1000, vitessResultSet.getInt(9)); - } - - @Test - public void testgetFloat() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(24.52f, vitessResultSet.getFloat(11), 0.001); - } - - @Test - public void testgetDouble() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(100.43, vitessResultSet.getFloat(12), 0.001); - } - - @Test - public void testBigDecimal() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(new BigDecimal(BigInteger.valueOf(123456789), 5), - vitessResultSet.getBigDecimal(18)); - } - - @Test - public void testgetBytes() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - Assert.assertArrayEquals("HELLO TDS TEAM".getBytes("UTF-8"), vitessResultSet.getBytes(19)); - } - - @Test - public void testgetDate() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(new java.sql.Date(116, 1, 6), vitessResultSet.getDate(14)); - } - - @Test - public void testgetTime() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(new Time(12, 34, 56), vitessResultSet.getTime(15)); - } - - @Test - public void testgetTimestamp() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(new Timestamp(116, 1, 6, 14, 15, 16, 0), vitessResultSet.getTimestamp(13)); - } - - @Test - public void testgetZeroTimestampGarble() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, new VitessStatement( - new VitessConnection( - "jdbc:vitess://locahost:9000/vt_keyspace/keyspace?zeroDateTimeBehavior=garble", - new Properties()))); - vitessResultSet.next(); - assertEquals("0002-11-30 00:00:00.0", vitessResultSet.getTimestamp(28).toString()); - } - - @Test - public void testgetZeroTimestampConvertToNill() - throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, new VitessStatement( - new VitessConnection( - "jdbc:vitess://locahost:9000/vt_keyspace/keyspace?zeroDateTimeBehavior=convertToNull", - new Properties()))); - vitessResultSet.next(); - Assert.assertNull(vitessResultSet.getTimestamp(28)); - } - - @Test - public void testgetZeroTimestampException() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, new VitessStatement( - new VitessConnection( - "jdbc:vitess://locahost:9000/vt_keyspace/keyspace?zeroDateTimeBehavior=exception", - new Properties()))); - vitessResultSet.next(); - try { - vitessResultSet.getTimestamp(28); - Assert.fail("expected getTimestamp to throw an exception"); - } catch (SQLException e) { - } - } - - @Test - public void testgetZeroTimestampRound() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, new VitessStatement( - new VitessConnection( - "jdbc:vitess://locahost:9000/vt_keyspace/keyspace?zeroDateTimeBehavior=round", - new Properties()))); - vitessResultSet.next(); - assertEquals("0001-01-01 00:00:00.0", vitessResultSet.getTimestamp(28).toString()); - } - - @Test - public void testgetZeroDateRound() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, new VitessStatement( - new VitessConnection( - "jdbc:vitess://locahost:9000/vt_keyspace/keyspace?zeroDateTimeBehavior=round", - new Properties()))); - vitessResultSet.next(); - assertEquals("0001-01-01", vitessResultSet.getDate(28).toString()); - } - - @Test - public void testgetStringbyColumnLabel() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals("-50", vitessResultSet.getString("col1")); - assertEquals("50", vitessResultSet.getString("col2")); - assertEquals("-23000", vitessResultSet.getString("col3")); - assertEquals("23000", vitessResultSet.getString("col4")); - assertEquals("-100", vitessResultSet.getString("col5")); - assertEquals("100", vitessResultSet.getString("col6")); - assertEquals("-100", vitessResultSet.getString("col7")); - assertEquals("100", vitessResultSet.getString("col8")); - assertEquals("-1000", vitessResultSet.getString("col9")); - assertEquals("1000", vitessResultSet.getString("col10")); - assertEquals("24.52", vitessResultSet.getString("col11")); - assertEquals("100.43", vitessResultSet.getString("col12")); - assertEquals("2016-02-06 14:15:16.0", vitessResultSet.getString("col13")); - assertEquals("2016-02-06", vitessResultSet.getString("col14")); - assertEquals("12:34:56", vitessResultSet.getString("col15")); - assertEquals("2016-02-06 14:15:16.0", vitessResultSet.getString("col16")); - assertEquals("2016", vitessResultSet.getString("col17")); - assertEquals("1234.56789", vitessResultSet.getString("col18")); - assertEquals("HELLO TDS TEAM", vitessResultSet.getString("col19")); - assertEquals("HELLO TDS TEAM", vitessResultSet.getString("col20")); - assertEquals("HELLO TDS TEAM", vitessResultSet.getString("col21")); - assertEquals("HELLO TDS TEAM", vitessResultSet.getString("col22")); - assertEquals("N", vitessResultSet.getString("col23")); - assertEquals("HELLO TDS TEAM", vitessResultSet.getString("col24")); - assertEquals("1", vitessResultSet.getString("col25")); - assertEquals("val123", vitessResultSet.getString("col26")); - assertEquals("val123", vitessResultSet.getString("col27")); - } - - @Test - public void testgetBooleanbyColumnLabel() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(true, vitessResultSet.getBoolean("col25")); - assertEquals(false, vitessResultSet.getBoolean("col1")); - } - - @Test - public void testgetBytebyColumnLabel() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(-50, vitessResultSet.getByte("col1")); - assertEquals(1, vitessResultSet.getByte("col25")); - } - - @Test - public void testgetShortbyColumnLabel() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(-23000, vitessResultSet.getShort("col3")); - } - - @Test - public void testgetIntbyColumnLabel() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(-100, vitessResultSet.getInt("col7")); - } - - @Test - public void testgetLongbyColumnLabel() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(-1000, vitessResultSet.getInt("col9")); - } - - @Test - public void testBigIntegerbyColumnLabel() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(new BigInteger("1000"), vitessResultSet.getBigInteger("col10")); - } - - @Test - public void testgetFloatbyColumnLabel() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(24.52f, vitessResultSet.getFloat("col11"), 0.001); - } - - @Test - public void testgetDoublebyColumnLabel() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(100.43, vitessResultSet.getFloat("col12"), 0.001); - } - - @Test - public void testBigDecimalbyColumnLabel() throws SQLException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(new BigDecimal(BigInteger.valueOf(123456789), 5), - vitessResultSet.getBigDecimal("col18")); - } - - @Test - public void testgetBytesbyColumnLabel() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - Assert.assertArrayEquals("HELLO TDS TEAM".getBytes("UTF-8"), vitessResultSet.getBytes("col19")); - } - - @Test - public void testgetDatebyColumnLabel() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(new java.sql.Date(116, 1, 6), vitessResultSet.getDate("col14")); - } - - @Test - public void testgetTimebyColumnLabel() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(new Time(12, 34, 56), vitessResultSet.getTime("col15")); - } - - @Test - public void testgetTimestampbyColumnLabel() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - assertEquals(new Timestamp(116, 1, 6, 14, 15, 16, 0), vitessResultSet.getTimestamp("col13")); - } - - @Test - public void testgetAsciiStream() throws SQLException, UnsupportedEncodingException { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor); - vitessResultSet.next(); - // Need to implement AssertEquivalant - //Assert.assertEquals((InputStream)(new ByteArrayInputStream("HELLO TDS TEAM".getBytes())), - // vitessResultSet - // .getAsciiStream(19)); - } - - @Test - public void testGetBinaryStream() throws SQLException, IOException { - Cursor cursor = getCursorWithRowsAsNull(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - vitessResultSet.next(); - byte[] ba1 = new byte[128]; - new ByteArrayInputStream("HELLO TDS TEAM".getBytes()).read(ba1, 0, 128); - byte[] ba2 = new byte[128]; - vitessResultSet.getBinaryStream(19).read(ba2, 0, 128); - Assert.assertArrayEquals(ba1, ba2); - - byte[] ba3 = new byte[128]; - vitessResultSet.getBinaryStream(22).read(ba3, 0, 128); - Assert.assertArrayEquals(ba1, ba3); - - assertEquals(null, vitessResultSet.getBinaryStream(27)); - } - - @Test - public void testEnhancedFieldsFromCursor() throws Exception { - Cursor cursor = getCursorWithRows(); - VitessResultSet vitessResultSet = new VitessResultSet(cursor, getVitessStatement()); - assertEquals(cursor.getFields().size(), vitessResultSet.getFields().size()); - } - - @Test - public void testGetStringUsesEncoding() throws Exception { - VitessConnection conn = getVitessConnection(); - VitessResultSet resultOne = PowerMockito - .spy(new VitessResultSet(getCursorWithRows(), new VitessStatement(conn))); - resultOne.next(); - // test all ways to get to convertBytesToString - - // Verify that we're going through convertBytesToString for column types that return bytes - // (string-like), - // but not for those that return a real object - //resultOne.getString("col21"); // is a string, should go through convert bytes - //resultOne.getString("col13"); // is a datetime, should not - //PowerMockito.verifyPrivate(resultOne, VerificationModeFactory.times(1)) - // .invoke("convertBytesToString", Matchers.any(byte[].class), Matchers.anyString()); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - VitessResultSet resultTwo = PowerMockito - .spy(new VitessResultSet(getCursorWithRows(), new VitessStatement(conn))); - resultTwo.next(); - - // neither of these should go through convertBytesToString, because we didn't include all fields - resultTwo.getString("col21"); - resultTwo.getString("col13"); - PowerMockito.verifyPrivate(resultTwo, VerificationModeFactory.times(0)) - .invoke("convertBytesToString", Matchers.any(byte[].class), Matchers.anyString()); - } - - @Test - public void testGetObjectForBitValues() throws Exception { - VitessConnection conn = getVitessConnection(); - - ByteString.Output value = ByteString.newOutput(); - value.write(new byte[]{1}); - value.write(new byte[]{0}); - value.write(new byte[]{1, 2, 3, 4}); - - Query.QueryResult result = Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("col1").setColumnLength(1).setType(Query.Type.BIT)) - .addFields( - Query.Field.newBuilder().setName("col2").setColumnLength(1).setType(Query.Type.BIT)) - .addFields( - Query.Field.newBuilder().setName("col3").setColumnLength(4).setType(Query.Type.BIT)) - .addRows(Query.Row.newBuilder().addLengths(1).addLengths(1).addLengths(4) - .setValues(value.toByteString())).build(); - - VitessResultSet vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - assertEquals(true, vitessResultSet.getObject(1)); - assertEquals(false, vitessResultSet.getObject(2)); - Assert.assertArrayEquals(new byte[]{1, 2, 3, 4}, (byte[]) vitessResultSet.getObject(3)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(3)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - Assert.assertArrayEquals(new byte[]{1}, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(new byte[]{0}, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(new byte[]{1, 2, 3, 4}, (byte[]) vitessResultSet.getObject(3)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(0)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - } - - @Test - public void testGetObjectForVarBinLikeValues() throws Exception { - VitessConnection conn = getVitessConnection(); - - ByteString.Output value = ByteString.newOutput(); - - byte[] binary = new byte[]{1, 2, 3, 4}; - byte[] varbinary = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; - byte[] blob = new byte[MysqlDefs.LENGTH_BLOB]; - for (int i = 0; i < blob.length; i++) { - blob[i] = 1; - } - byte[] fakeGeometry = new byte[]{2, 3, 4}; - - value.write(binary); - value.write(varbinary); - value.write(blob); - value.write(fakeGeometry); - - Query.QueryResult result = Query.QueryResult.newBuilder().addFields( - Query.Field.newBuilder().setName("col1").setColumnLength(4) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary).setType(Query.Type.BINARY) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE)).addFields( - Query.Field.newBuilder().setName("col2").setColumnLength(13) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary).setType(Query.Type.VARBINARY) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE)).addFields( - Query.Field.newBuilder().setName("col3") // should go to LONGVARBINARY due to below settings - .setColumnLength(MysqlDefs.LENGTH_BLOB) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).setType(Query.Type.BLOB)).addFields( - Query.Field.newBuilder().setName("col4").setType(Query.Type.GEOMETRY) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary).setType(Query.Type.BINARY) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE)).addRows( - Query.Row.newBuilder().addLengths(4).addLengths(13).addLengths(MysqlDefs.LENGTH_BLOB) - .addLengths(3).setValues(value.toByteString())).build(); - - VitessResultSet vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - // All of these types should pass straight through, returning the direct bytes - Assert.assertArrayEquals(binary, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(varbinary, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(blob, (byte[]) vitessResultSet.getObject(3)); - Assert.assertArrayEquals(fakeGeometry, (byte[]) vitessResultSet.getObject(4)); - - // We should still call the function 4 times - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(4)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - // Same as above since this doesn't really do much but pass right through for the varbinary type - Assert.assertArrayEquals(binary, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(varbinary, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(blob, (byte[]) vitessResultSet.getObject(3)); - Assert.assertArrayEquals(fakeGeometry, (byte[]) vitessResultSet.getObject(4)); - - // Never call because not including all - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(0)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - } - - @Test - public void testGetObjectForStringLikeValues() throws Exception { - ByteString.Output value = ByteString.newOutput(); - - String trimmedCharStr = "wasting space"; - String varcharStr = "i have a variable length!"; - String masqueradingBlobStr = "look at me, im a blob"; - String textStr = "an enthralling string of TEXT in some foreign language"; - String jsonStr = "{\"status\": \"ok\"}"; - - int paddedCharColLength = 20; - byte[] trimmedChar = StringUtils.getBytes(trimmedCharStr, "UTF-16"); - byte[] varchar = StringUtils.getBytes(varcharStr, "UTF-8"); - byte[] masqueradingBlob = StringUtils.getBytes(masqueradingBlobStr, "US-ASCII"); - byte[] text = StringUtils.getBytes(textStr, "ISO8859_8"); - byte[] opaqueBinary = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; - byte[] json = StringUtils.getBytes(jsonStr, "UTF-8"); - - value.write(trimmedChar); - value.write(varchar); - value.write(opaqueBinary); - value.write(masqueradingBlob); - value.write(text); - value.write(json); - - Query.QueryResult result = Query.QueryResult.newBuilder() - // This tests CHAR - .addFields(Query.Field.newBuilder().setName("col1").setColumnLength(paddedCharColLength) - .setCharset(/* utf-16 collation index from CharsetMapping */ 54) - .setType(Query.Type.CHAR)) - // This tests VARCHAR - .addFields(Query.Field.newBuilder().setName("col2").setColumnLength(varchar.length) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_utf8).setType(Query.Type.VARCHAR)) - // This tests VARCHAR that is an opaque binary - .addFields(Query.Field.newBuilder().setName("col2").setColumnLength(opaqueBinary.length) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_binary) - .setFlags(Query.MySqlFlag.BINARY_FLAG_VALUE).setType(Query.Type.VARCHAR)) - // This tests LONGVARCHAR - .addFields(Query.Field.newBuilder().setName("col3").setColumnLength(masqueradingBlob.length) - .setCharset(/* us-ascii collation index from CharsetMapping */11) - .setType(Query.Type.BLOB)) - // This tests TEXT, which falls through the default case of the switch - .addFields(Query.Field.newBuilder().setName("col4").setColumnLength(text.length) - .setCharset(/* corresponds to greek, from CharsetMapping */25).setType(Query.Type.TEXT)) - .addFields(Query.Field.newBuilder().setName("col5").setColumnLength(json.length) - .setCharset(CharsetMapping.MYSQL_COLLATION_INDEX_utf8).setType(Query.Type.JSON)) - .addRows(Query.Row.newBuilder().addLengths(trimmedChar.length).addLengths(varchar.length) - .addLengths(opaqueBinary.length).addLengths(masqueradingBlob.length) - .addLengths(text.length).addLengths(json.length).setValues(value.toByteString())) - .build(); - - VitessConnection conn = getVitessConnection(); - VitessResultSet vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - assertEquals(trimmedCharStr, vitessResultSet.getObject(1)); - assertEquals(varcharStr, vitessResultSet.getObject(2)); - Assert.assertArrayEquals(opaqueBinary, (byte[]) vitessResultSet.getObject(3)); - assertEquals(masqueradingBlobStr, vitessResultSet.getObject(4)); - assertEquals(textStr, vitessResultSet.getObject(5)); - assertEquals(jsonStr, vitessResultSet.getObject(6)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(6)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - - conn.setIncludedFields(Query.ExecuteOptions.IncludedFields.TYPE_AND_NAME); - vitessResultSet = PowerMockito - .spy(new VitessResultSet(new SimpleCursor(result), new VitessStatement(conn))); - vitessResultSet.next(); - - Assert.assertArrayEquals(trimmedChar, (byte[]) vitessResultSet.getObject(1)); - Assert.assertArrayEquals(varchar, (byte[]) vitessResultSet.getObject(2)); - Assert.assertArrayEquals(opaqueBinary, (byte[]) vitessResultSet.getObject(3)); - Assert.assertArrayEquals(masqueradingBlob, (byte[]) vitessResultSet.getObject(4)); - Assert.assertArrayEquals(text, (byte[]) vitessResultSet.getObject(5)); - Assert.assertArrayEquals(json, (byte[]) vitessResultSet.getObject(6)); - - PowerMockito.verifyPrivate(vitessResultSet, VerificationModeFactory.times(0)) - .invoke("convertBytesIfPossible", Matchers.any(byte[].class), - Matchers.any(FieldWithMetadata.class)); - } - - @Test - public void testGetClob() throws SQLException { - VitessResultSet vitessResultSet = new VitessResultSet(new String[]{"clob"}, - new Query.Type[]{Query.Type.VARCHAR}, new String[][]{new String[]{"clobValue"}}, - new ConnectionProperties()); - Assert.assertTrue(vitessResultSet.next()); - - Clob clob = vitessResultSet.getClob(1); - assertEquals("clobValue", clob.getSubString(1, (int) clob.length())); - - clob = vitessResultSet.getClob("clob"); - assertEquals("clobValue", clob.getSubString(1, (int) clob.length())); - } -} diff --git a/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java b/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java deleted file mode 100644 index 3f4bb39a44c..00000000000 --- a/java/jdbc/src/test/java/io/vitess/jdbc/VitessStatementTest.java +++ /dev/null @@ -1,721 +0,0 @@ -/* - * Copyright 2019 The Vitess Authors. - - * 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 io.vitess.jdbc; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.nullable; -import static org.mockito.Matchers.anyList; -import static org.mockito.Matchers.anyMap; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.verify; -import static org.powermock.api.mockito.PowerMockito.doReturn; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -import io.vitess.client.Context; -import io.vitess.client.SQLFuture; -import io.vitess.client.VTGateConnection; -import io.vitess.client.VTSession; -import io.vitess.client.cursor.Cursor; -import io.vitess.client.cursor.CursorWithError; -import io.vitess.proto.Query; -import io.vitess.proto.Vtrpc; -import io.vitess.util.Constants; - -import java.lang.reflect.Field; -import java.sql.BatchUpdateException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -/** - * Created by harshit.gangal on 19/01/16. - */ - -@RunWith(PowerMockRunner.class) -@PrepareForTest({VTGateConnection.class, Vtrpc.RPCError.class}) -public class VitessStatementTest { - - private String sqlSelect = "select 1 from test_table"; - private String sqlShow = "show tables"; - private String sqlUpdate = "update test_table set msg = null"; - private String sqlInsert = "insert into test_table(msg) values ('abc')"; - private String sqlUpsert = "insert into test_table(msg) values ('abc') on duplicate key update " - + "msg = 'def'"; - - - @Test - public void testGetConnection() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - - VitessStatement statement = new VitessStatement(mockConn); - assertEquals(mockConn, statement.getConnection()); - } - - @Test - public void testGetResultSet() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VitessStatement statement = new VitessStatement(mockConn); - assertEquals(null, statement.getResultSet()); - } - - @Test - public void testExecuteQuery() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - - VitessStatement statement = new VitessStatement(mockConn); - //Empty Sql Statement - try { - statement.executeQuery(""); - fail("Should have thrown exception for empty sql"); - } catch (SQLException ex) { - assertEquals("SQL statement is not valid", ex.getMessage()); - } - - ResultSet rs = statement.executeQuery(sqlSelect); - assertEquals(-1, statement.getUpdateCount()); - - //autocommit is false and not in transaction - when(mockConn.getAutoCommit()).thenReturn(false); - when(mockConn.isInTransaction()).thenReturn(false); - rs = statement.executeQuery(sqlSelect); - assertEquals(-1, statement.getUpdateCount()); - - //when returned cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); - try { - statement.executeQuery(sqlSelect); - fail("Should have thrown exception for cursor null"); - } catch (SQLException ex) { - assertEquals("Failed to execute this method", ex.getMessage()); - } - } - - @Test - public void testExecuteQueryWithStreamExecuteType() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn - .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.STREAM); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - - VitessStatement statement = new VitessStatement(mockConn); - //Empty Sql Statement - try { - statement.executeQuery(""); - fail("Should have thrown exception for empty sql"); - } catch (SQLException ex) { - assertEquals("SQL statement is not valid", ex.getMessage()); - } - - //select on replica - ResultSet rs = statement.executeQuery(sqlSelect); - assertEquals(-1, statement.getUpdateCount()); - - //show query - rs = statement.executeQuery(sqlShow); - assertEquals(-1, statement.getUpdateCount()); - - //select on primary when tx is null and autocommit is false - when(mockConn.getAutoCommit()).thenReturn(false); - when(mockConn.isInTransaction()).thenReturn(false); - rs = statement.executeQuery(sqlSelect); - assertEquals(-1, statement.getUpdateCount()); - - //when returned cursor is null - when(mockVtGateConn - .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(null); - try { - statement.executeQuery(sqlSelect); - fail("Should have thrown exception for cursor null"); - } catch (SQLException ex) { - assertEquals("Failed to execute this method", ex.getMessage()); - } - } - - @Test - public void testExecuteFetchSizeAsStreaming() throws SQLException { - testExecute(5, true, false, true); - testExecute(5, false, false, true); - testExecute(0, true, true, false); - testExecute(0, false, false, true); - } - - private void testExecute(int fetchSize, boolean simpleExecute, boolean shouldRunExecute, - boolean shouldRunStreamExecute) throws SQLException { - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - - VitessConnection mockConn = mock(VitessConnection.class); - when(mockConn.isSimpleExecute()).thenReturn(simpleExecute); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockVtGateConn - .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockCursor); - - VitessStatement statement = new VitessStatement(mockConn); - statement.setFetchSize(fetchSize); - statement.executeQuery(sqlSelect); - - if (shouldRunExecute) { - verify(mockVtGateConn, Mockito.times(2)) - .execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class)); - } - - if (shouldRunStreamExecute) { - verify(mockVtGateConn) - .streamExecute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class)); - } - } - - @Test - public void testExecuteUpdate() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List fieldList = mock(ArrayList.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - - VitessStatement statement = new VitessStatement(mockConn); - //executing dml on primary - int updateCount = statement.executeUpdate(sqlUpdate); - assertEquals(0, updateCount); - - //tx is null & autoCommit is true - when(mockConn.getAutoCommit()).thenReturn(true); - updateCount = statement.executeUpdate(sqlUpdate); - assertEquals(0, updateCount); - - //cursor fields is not null - when(mockCursor.getFields()).thenReturn(fieldList); - when(fieldList.isEmpty()).thenReturn(false); - try { - statement.executeUpdate(sqlSelect); - fail("Should have thrown exception for field not null"); - } catch (SQLException ex) { - assertEquals("ResultSet generation is not allowed through this method", ex.getMessage()); - } - - //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); - try { - statement.executeUpdate(sqlUpdate); - fail("Should have thrown exception for cursor null"); - } catch (SQLException ex) { - assertEquals("Failed to execute this method", ex.getMessage()); - } - - //read only - when(mockConn.isReadOnly()).thenReturn(true); - try { - statement.execute("UPDATE SET foo = 1 ON mytable WHERE id = 1"); - fail("Should have thrown exception for read only"); - } catch (SQLException ex) { - assertEquals(Constants.SQLExceptionMessages.READ_ONLY, ex.getMessage()); - } - - //read only - when(mockConn.isReadOnly()).thenReturn(true); - try { - statement.executeBatch(); - fail("Should have thrown exception for read only"); - } catch (SQLException ex) { - assertEquals(Constants.SQLExceptionMessages.READ_ONLY, ex.getMessage()); - } - } - - @Test - public void testExecute() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - List mockFieldList = PowerMockito.spy(new ArrayList<>()); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockConn.getAutoCommit()).thenReturn(true); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); - - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(mockFieldList); - - VitessStatement statement = new VitessStatement(mockConn); - int fieldSize = 5; - when(mockCursor.getFields()).thenReturn(mockFieldList); - doReturn(fieldSize).when(mockFieldList).size(); - doReturn(false).when(mockFieldList).isEmpty(); - - boolean hasResultSet = statement.execute(sqlSelect); - assertTrue(hasResultSet); - assertNotNull(statement.getResultSet()); - - hasResultSet = statement.execute(sqlShow); - assertTrue(hasResultSet); - assertNotNull(statement.getResultSet()); - - int mockUpdateCount = 10; - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - when(mockCursor.getRowsAffected()).thenReturn((long) mockUpdateCount); - hasResultSet = statement.execute(sqlUpdate); - assertFalse(hasResultSet); - assertNull(statement.getResultSet()); - assertEquals(mockUpdateCount, statement.getUpdateCount()); - - //cursor is null - when(mockSqlFutureCursor.checkedGet()).thenReturn(null); - try { - statement.execute(sqlUpdate); - fail("Should have thrown exception for cursor null"); - } catch (SQLException ex) { - assertEquals("Failed to execute this method", ex.getMessage()); - } - } - - @Test - public void testGetUpdateCount() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFuture = mock(SQLFuture.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFuture); - when(mockSqlFuture.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - - VitessStatement statement = new VitessStatement(mockConn); - when(mockCursor.getRowsAffected()).thenReturn(10L); - int updateCount = statement.executeUpdate(sqlUpdate); - assertEquals(10L, updateCount); - assertEquals(10L, statement.getUpdateCount()); - - // Truncated Update Count - when(mockCursor.getRowsAffected()).thenReturn((long) Integer.MAX_VALUE + 10); - updateCount = statement.executeUpdate(sqlUpdate); - assertEquals(Integer.MAX_VALUE, updateCount); - assertEquals(Integer.MAX_VALUE, statement.getUpdateCount()); - - when(mockConn.isSimpleExecute()).thenReturn(true); - statement.executeQuery(sqlSelect); - assertEquals(-1, statement.getUpdateCount()); - } - - @Test - public void testClose() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockConn.getExecuteType()).thenReturn(Constants.QueryExecuteType.SIMPLE); - when(mockConn.isSimpleExecute()).thenReturn(true); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - - VitessStatement statement = new VitessStatement(mockConn); - ResultSet rs = statement.executeQuery(sqlSelect); - statement.close(); - try { - statement.executeQuery(sqlSelect); - fail("Should have thrown exception for statement closed"); - } catch (SQLException ex) { - assertEquals("Statement is closed", ex.getMessage()); - } - } - - @Test - public void testGetMaxFieldSize() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - - VitessStatement statement = new VitessStatement(mockConn); - assertEquals(65535, statement.getMaxFieldSize()); - } - - @Test - public void testGetMaxRows() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - - VitessStatement statement = new VitessStatement(mockConn); - - statement.setMaxRows(10); - assertEquals(10, statement.getMaxRows()); - - try { - statement.setMaxRows(-1); - fail("Should have thrown exception for wrong value"); - } catch (SQLException ex) { - assertEquals("Illegal value for max row", ex.getMessage()); - } - - } - - @Test - public void testGetQueryTimeout() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - Mockito.when(mockConn.getTimeout()).thenReturn((long) Constants.DEFAULT_TIMEOUT); - - VitessStatement statement = new VitessStatement(mockConn); - assertEquals(30, statement.getQueryTimeout()); - } - - @Test - public void testGetQueryTimeoutZeroDefault() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - Mockito.when(mockConn.getTimeout()).thenReturn(0L); - - VitessStatement statement = new VitessStatement(mockConn); - assertEquals(0, statement.getQueryTimeout()); - } - - @Test - public void testSetQueryTimeout() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - Mockito.when(mockConn.getTimeout()).thenReturn((long) Constants.DEFAULT_TIMEOUT); - - VitessStatement statement = new VitessStatement(mockConn); - - int queryTimeout = 10; - statement.setQueryTimeout(queryTimeout); - assertEquals(queryTimeout, statement.getQueryTimeout()); - try { - queryTimeout = -1; - statement.setQueryTimeout(queryTimeout); - fail("Should have thrown exception for wrong value"); - } catch (SQLException ex) { - assertEquals("Illegal value for query timeout", ex.getMessage()); - } - - statement.setQueryTimeout(0); - assertEquals(30, statement.getQueryTimeout()); - } - - @Test - public void testGetWarnings() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - - VitessStatement statement = new VitessStatement(mockConn); - assertNull(statement.getWarnings()); - } - - @Test - public void testGetFetchDirection() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - - VitessStatement statement = new VitessStatement(mockConn); - assertEquals(ResultSet.FETCH_FORWARD, statement.getFetchDirection()); - } - - @Test - public void testGetFetchSize() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - - VitessStatement statement = new VitessStatement(mockConn); - assertEquals(0, statement.getFetchSize()); - } - - @Test - public void testGetResultSetConcurrency() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - - VitessStatement statement = new VitessStatement(mockConn); - assertEquals(ResultSet.CONCUR_READ_ONLY, statement.getResultSetConcurrency()); - } - - @Test - public void testGetResultSetType() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - - VitessStatement statement = new VitessStatement(mockConn); - assertEquals(ResultSet.TYPE_FORWARD_ONLY, statement.getResultSetType()); - } - - @Test - public void testIsClosed() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - - VitessStatement statement = new VitessStatement(mockConn); - assertFalse(statement.isClosed()); - statement.close(); - assertTrue(statement.isClosed()); - } - - @Test - public void testAutoGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockVtGateConn.execute(nullable(Context.class), nullable(String.class), nullable(Map.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - - VitessStatement statement = new VitessStatement(mockConn); - long expectedFirstGeneratedId = 121; - long[] expectedGeneratedIds = {121, 122, 123, 124, 125}; - int expectedAffectedRows = 5; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedAffectedRows)); - - //Executing Insert Statement - int updateCount = statement.executeUpdate(sqlInsert, Statement.RETURN_GENERATED_KEYS); - assertEquals(expectedAffectedRows, updateCount); - - ResultSet rs = statement.getGeneratedKeys(); - int i = 0; - while (rs.next()) { - long generatedId = rs.getLong(1); - assertEquals(expectedGeneratedIds[i++], generatedId); - } - - //Fetching Generated Keys without notifying the driver - statement.executeUpdate(sqlInsert); - try { - statement.getGeneratedKeys(); - fail("Should have thrown exception for not setting autoGeneratedKey flag"); - } catch (SQLException ex) { - assertEquals("Generated keys not requested. You need to specify Statement" - + ".RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection" - + ".prepareStatement()", - ex.getMessage()); - } - - //Fetching Generated Keys on update query - expectedFirstGeneratedId = 0; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - updateCount = statement.executeUpdate(sqlUpdate, Statement.RETURN_GENERATED_KEYS); - assertEquals(expectedAffectedRows, updateCount); - - rs = statement.getGeneratedKeys(); - assertFalse(rs.next()); - } - - @Test - public void testAddBatch() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); - VitessStatement statement = new VitessStatement(mockConn); - statement.addBatch(sqlInsert); - Field privateStringField = VitessStatement.class.getDeclaredField("batchedArgs"); - privateStringField.setAccessible(true); - assertEquals(sqlInsert, ((List) privateStringField.get(statement)).get(0)); - } - - @Test - public void testClearBatch() throws Exception { - VitessConnection mockConn = mock(VitessConnection.class); - VitessStatement statement = new VitessStatement(mockConn); - statement.addBatch(sqlInsert); - statement.clearBatch(); - Field privateStringField = VitessStatement.class.getDeclaredField("batchedArgs"); - privateStringField.setAccessible(true); - assertTrue(((List) privateStringField.get(statement)).isEmpty()); - } - - @Test - public void testExecuteBatch() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VitessStatement statement = new VitessStatement(mockConn); - int[] updateCounts = statement.executeBatch(); - assertEquals(0, updateCounts.length); - - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); - - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - when( - mockVtGateConn.executeBatch(nullable(Context.class), nullable(List.class), nullable(List.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - - List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - - CursorWithError mockCursorWithError1 = mock(CursorWithError.class); - when(mockCursorWithError1.getError()).thenReturn(null); - when(mockCursorWithError1.getCursor()).thenReturn(mock(Cursor.class)); - mockCursorWithErrorList.add(mockCursorWithError1); - - statement.addBatch(sqlUpdate); - updateCounts = statement.executeBatch(); - assertEquals(1, updateCounts.length); - - CursorWithError mockCursorWithError2 = mock(CursorWithError.class); - Vtrpc.RPCError rpcError = Vtrpc.RPCError.newBuilder() - .setMessage("statement execute batch error").build(); - when(mockCursorWithError2.getError()).thenReturn(rpcError); - mockCursorWithErrorList.add(mockCursorWithError2); - statement.addBatch(sqlUpdate); - statement.addBatch(sqlUpdate); - try { - statement.executeBatch(); - fail("Should have thrown Exception"); - } catch (BatchUpdateException ex) { - assertEquals(rpcError.toString(), ex.getMessage()); - assertEquals(2, ex.getUpdateCounts().length); - assertEquals(Statement.EXECUTE_FAILED, ex.getUpdateCounts()[1]); - } - - } - - @Test - public void testBatchGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VitessStatement statement = new VitessStatement(mockConn); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); - - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - - when( - mockVtGateConn.executeBatch(nullable(Context.class), nullable(List.class), nullable(List.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - - CursorWithError mockCursorWithError = mock(CursorWithError.class); - when(mockCursorWithError.getError()).thenReturn(null); - when(mockCursorWithError.getCursor()).thenReturn(mockCursor); - mockCursorWithErrorList.add(mockCursorWithError); - - long expectedFirstGeneratedId = 121; - long[] expectedGeneratedIds = {121, 122, 123, 124, 125}; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedGeneratedIds.length)); - - statement.addBatch(sqlInsert); - statement.executeBatch(); - - ResultSet rs = statement.getGeneratedKeys(); - int i = 0; - while (rs.next()) { - long generatedId = rs.getLong(1); - assertEquals(expectedGeneratedIds[i++], generatedId); - } - } - - @Test - public void testBatchUpsertGeneratedKeys() throws SQLException { - VitessConnection mockConn = mock(VitessConnection.class); - VitessStatement statement = new VitessStatement(mockConn); - Cursor mockCursor = mock(Cursor.class); - SQLFuture mockSqlFutureCursor = mock(SQLFuture.class); - - VTGateConnection mockVtGateConn = mock(VTGateConnection.class); - when(mockConn.getVtGateConn()).thenReturn(mockVtGateConn); - when(mockConn.getAutoCommit()).thenReturn(true); - - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursor); - when(mockCursor.getFields()).thenReturn(Query.QueryResult.getDefaultInstance().getFieldsList()); - - when( - mockVtGateConn.executeBatch(nullable(Context.class), nullable(List.class), nullable(List.class), nullable(VTSession.class))) - .thenReturn(mockSqlFutureCursor); - List mockCursorWithErrorList = new ArrayList<>(); - when(mockSqlFutureCursor.checkedGet()).thenReturn(mockCursorWithErrorList); - - CursorWithError mockCursorWithError = mock(CursorWithError.class); - when(mockCursorWithError.getError()).thenReturn(null); - when(mockCursorWithError.getCursor()).thenReturn(mockCursor); - mockCursorWithErrorList.add(mockCursorWithError); - - long expectedFirstGeneratedId = 121; - long[] expectedGeneratedIds = {121, 122}; - when(mockCursor.getInsertId()).thenReturn(expectedFirstGeneratedId); - when(mockCursor.getRowsAffected()).thenReturn(Long.valueOf(expectedGeneratedIds.length)); - - statement.addBatch(sqlUpsert); - statement.executeBatch(); - - ResultSet rs = statement.getGeneratedKeys(); - int i = 0; - while (rs.next()) { - long generatedId = rs.getLong(1); - assertEquals(expectedGeneratedIds[i], generatedId); - assertEquals(i, 0); // we should only have one - i++; - } - - VitessStatement noUpdate = new VitessStatement(mockConn); - when(mockCursor.getInsertId()).thenReturn(0L); - when(mockCursor.getRowsAffected()).thenReturn(1L); - - noUpdate.addBatch(sqlUpsert); - noUpdate.executeBatch(); - - ResultSet empty = noUpdate.getGeneratedKeys(); - assertFalse(empty.next()); - } -}