private Column[] getColumnsForResultSet(Table table, ResultSet rs) throws SQLException { ResultSetMetaData metaData = rs.getMetaData(); Column[] columns = new Column[metaData.getColumnCount()]; for(int i = 0; i < columns.length; i++) { columns[i] = table.columnWithName(metaData.getColumnName(i + 1)); } return columns; }
/** * Determine if the values in the named column is optional. * * @param columnName the name of the column * @return {@code true} if a column exists in this table and is optional, or {@code false} otherwise */ default boolean isOptional(String columnName) { Column column = columnWithName(columnName); return column == null ? false : column.isOptional(); }
/** * Determine if the values in the named column is generated by the database. * * @param columnName the name of the column * @return {@code true} if a column exists in this table and its values are generated, or {@code false} otherwise */ default boolean isGenerated(String columnName) { Column column = columnWithName(columnName); return column == null ? false : column.isGenerated(); }
/** * Determine if the named column is auto-incremented. * * @param columnName the name of the column * @return {@code true} if a column exists in this table and it is auto-incremented, or {@code false} otherwise */ default boolean isAutoIncremented(String columnName) { Column column = columnWithName(columnName); return column == null ? false : column.isAutoIncremented(); }
/** * Determine if the named column is part of the primary key. * * @param columnName the name of the column * @return {@code true} if a column exists in this table and it is part of the primary key, or {@code false} otherwise */ default boolean isPrimaryKeyColumn( String columnName ) { Column column = columnWithName(columnName); return column == null ? false : primaryKeyColumnNames().contains(column.name()); }
@Test public void shouldFindColumnsByNameWithWrongCase() { assertThat(table.columnWithName("c1")).isSameAs(c1); assertThat(table.columnWithName("c2")).isSameAs(c2); assertThat(table.columnWithName("c3")).isSameAs(c3); assertThat(table.columnWithName("c4")).isSameAs(c4); }
@Test public void shouldFindColumnsByNameWithExactCase() { assertThat(table.columnWithName("C1")).isSameAs(c1); assertThat(table.columnWithName("C2")).isSameAs(c2); assertThat(table.columnWithName("C3")).isSameAs(c3); assertThat(table.columnWithName("C4")).isSameAs(c4); }
@Test public void shouldNotFindNonExistantColumnsByName() { assertThat(table.columnWithName("c1 ")).isNull(); assertThat(table.columnWithName("wrong")).isNull(); }
@Test @FixFor("DBZ-901") public void parseAlterTableTruncatedDefaulDateTime() { String sql = "CREATE TABLE TIME_TABLE (" + " A datetime(3) NOT NULL DEFAULT '0000-00-00 00:00:00.000'" + ");"; String alterSql = "ALTER TABLE TIME_TABLE ADD COLUMN B DATETIME(3) NOT NULL DEFAULT '1970-01-01 00:00:00';"; parser.parse(sql, tables); parser.parse(alterSql, tables); Table table = tables.forTable(new TableId(null, null, "TIME_TABLE")); assertThat(table.columnWithName("A").defaultValue()).isEqualTo((Date.from(Instant.ofEpochMilli(0)))); assertThat(table.columnWithName("B").defaultValue()).isEqualTo((Date.from(Instant.ofEpochMilli(0)))); }
@Test public void parseNumericAndDecimalToDecimalDefaultValue() { final MySqlValueConverters converters = new MySqlValueConverters(JdbcValueConverters.DecimalMode.PRECISE, TemporalPrecisionMode.CONNECT, JdbcValueConverters.BigIntUnsignedMode.LONG); final AbstractDdlParser parser = parserProducer.apply(converters); String sql = "CREATE TABLE NUMERIC_DECIMAL_TABLE (\n" + " A NUMERIC NOT NULL DEFAULT 1.23,\n" + " B DECIMAL NOT NULL DEFAULT 2.321,\n" + " C NUMERIC NULL DEFAULT '12.678'\n" + ");"; parser.parse(sql, tables); Table table = tables.forTable(new TableId(null, null, "NUMERIC_DECIMAL_TABLE")); assertThat(table.columnWithName("A").defaultValue()).isEqualTo(BigDecimal.valueOf(1.23)); assertThat(table.columnWithName("B").defaultValue()).isEqualTo(BigDecimal.valueOf(2.321)); assertThat(table.columnWithName("C").defaultValue()).isEqualTo(BigDecimal.valueOf(12.678)); }
@Test public void parseNumericAndDecimalToDoubleDefaultValue() { String sql = "CREATE TABLE NUMERIC_DECIMAL_TABLE (\n" + " A NUMERIC NOT NULL DEFAULT 1.23,\n" + " B DECIMAL NOT NULL DEFAULT 2.321,\n" + " C NUMERIC NULL DEFAULT '12.678'\n" + ");"; parser.parse(sql, tables); Table table = tables.forTable(new TableId(null, null, "NUMERIC_DECIMAL_TABLE")); assertThat(table.columnWithName("A").defaultValue()).isEqualTo(1.23d); assertThat(table.columnWithName("B").defaultValue()).isEqualTo(2.321d); assertThat(table.columnWithName("C").defaultValue()).isEqualTo(12.678d); }
@Test public void parseBooleanDefaultValue() { String sql = "CREATE TABLE BOOLEAN_TABLE (\n" + " A BOOLEAN NULL DEFAULT 0,\n" + " B BOOLEAN NOT NULL DEFAULT '1',\n" + " C BOOLEAN NOT NULL DEFAULT '9',\n" + " D BOOLEAN NOT NULL DEFAULT TRUE,\n" + " E BOOLEAN DEFAULT NULL\n" + ");"; parser.parse(sql, tables); Table table = tables.forTable(new TableId(null, null, "BOOLEAN_TABLE")); assertThat(table.columnWithName("A").defaultValue()).isEqualTo(false); assertThat(table.columnWithName("B").defaultValue()).isEqualTo(true); assertThat(table.columnWithName("C").defaultValue()).isEqualTo(true); assertThat(table.columnWithName("D").defaultValue()).isEqualTo(true); assertThat(table.columnWithName("E").defaultValue()).isEqualTo(null); }
@Test @FixFor("DBZ-870") public void shouldAcceptZeroAsDefaultValueForDateColumn() { String ddl = "CREATE TABLE data(id INT, nullable_date date default 0, not_nullable_date date not null default 0, PRIMARY KEY (id))"; parser.parse(ddl, tables); Table table = tables.forTable(new TableId(null, null, "data")); assertThat(table.columnWithName("nullable_date").hasDefaultValue()).isTrue(); // zero date should be mapped to null for nullable column assertThat(table.columnWithName("nullable_date").defaultValue()).isNull(); assertThat(table.columnWithName("not_nullable_date").hasDefaultValue()).isTrue(); // zero date should be mapped to epoch for non-nullable column (expecting Date, as this test is using "connect" // mode) assertThat(table.columnWithName("not_nullable_date").defaultValue()).isEqualTo(getEpochDate()); }
@Test public void parseRealDefaultValue() { String sql = "CREATE TABLE REAL_TABLE (\n" + " A REAL NOT NULL DEFAULT 1,\n" + " B REAL NULL DEFAULT NULL \n" + ");"; parser.parse(sql, tables); Table table = tables.forTable(new TableId(null, null, "REAL_TABLE")); assertThat(table.columnWithName("A").defaultValue()).isEqualTo(1f); assertThat(table.columnWithName("B").defaultValue()).isEqualTo(null); }
@Test public void shouldCreateTableWhenEditorHasIdButNoColumns() { table = editor.tableId(id).create(); assertThat(table.columnWithName("any")).isNull(); assertThat(table.columns()).isEmpty(); assertThat(table.primaryKeyColumnNames()).isEmpty(); }
@Test public void shouldParseCreateTableWithEnumAndSetColumns() { String ddl = "CREATE TABLE t ( c1 ENUM('a','b','c') NOT NULL, c2 SET('a','b','c') NULL);"; parser.parse(ddl, tables); assertThat(tables.size()).isEqualTo(1); Table t = tables.forTable(new TableId(null, null, "t")); assertThat(t).isNotNull(); assertThat(t.retrieveColumnNames()).containsExactly("c1", "c2"); assertThat(t.primaryKeyColumnNames()).isEmpty(); assertColumn(t, "c1", "ENUM", Types.CHAR, 1, -1, false, false, false); assertColumn(t, "c2", "SET", Types.CHAR, 5, -1, true, false, false); assertThat(t.columnWithName("c1").position()).isEqualTo(1); assertThat(t.columnWithName("c2").position()).isEqualTo(2); }
@Test @FixFor("DBZ-474") public void shouldParseCreateTableStatementWithCollate() { String ddl = "CREATE TABLE c1 (pk INT PRIMARY KEY, v1 CHAR(36) NOT NULL COLLATE utf8_unicode_ci);"; parser.parse(ddl, tables); assertThat(tables.size()).isEqualTo(1); Table table = tables.forTable(new TableId(null, null, "c1")); assertThat(table).isNotNull(); assertColumn(table, "v1", "CHAR", Types.CHAR, 36, -1, false, false, false); Column column = table.columnWithName("v1"); assertThat(column.typeUsesCharset()).isTrue(); }
protected void assertColumn(Table table, String name, String typeName, int jdbcType, int length, int scale, boolean optional, boolean generated, boolean autoIncremented) { Column column = table.columnWithName(name); assertThat(column.name()).isEqualTo(name); assertThat(column.typeName()).isEqualTo(typeName); assertThat(column.jdbcType()).isEqualTo(jdbcType); assertThat(column.length()).isEqualTo(length); if (scale == Column.UNSET_INT_VALUE) { assertFalse(column.scale().isPresent()); } else { assertThat(column.scale().get()).isEqualTo(scale); } assertThat(column.isOptional()).isEqualTo(optional); assertThat(column.isGenerated()).isEqualTo(generated); assertThat(column.isAutoIncremented()).isEqualTo(autoIncremented); }
protected void assertColumn(Table table, String name, String typeName, int jdbcType, int length, int scale, boolean optional, boolean generated, boolean autoIncremented ) { Column column = table.columnWithName(name); assertThat(column.name()).isEqualTo(name); assertThat(column.typeName()).isEqualTo(typeName); assertThat(column.jdbcType()).isEqualTo(jdbcType); assertThat(column.length()).isEqualTo(length); if (scale == Column.UNSET_INT_VALUE) { assertFalse(column.scale().isPresent()); } else { assertThat(column.scale().get()).isEqualTo(scale); } assertThat(column.isOptional()).isEqualTo(optional); assertThat(column.isGenerated()).isEqualTo(generated); assertThat(column.isAutoIncremented()).isEqualTo(autoIncremented); }
protected void assertColumn(Table table, String name, String typeName, int jdbcType, int length, String charsetName, boolean optional) { Column column = table.columnWithName(name); assertThat(column.name()).isEqualTo(name); assertThat(column.typeName()).isEqualTo(typeName); assertThat(column.jdbcType()).isEqualTo(jdbcType); assertThat(column.length()).isEqualTo(length); assertThat(column.charsetName()).isEqualTo(charsetName); assertFalse(column.scale().isPresent()); assertThat(column.isOptional()).isEqualTo(optional); assertThat(column.isGenerated()).isFalse(); assertThat(column.isAutoIncremented()).isFalse(); }