return null; final Object schemaDefault = fieldDefn.schema().defaultValue(); return schemaDefault != null ? schemaDefault : fallback;
@Test public void numberTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("NUMBER_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); Schema schemaC = record.valueSchema().fields().get(1).schema().fields().get(2).schema(); Schema schemaD = record.valueSchema().fields().get(1).schema().fields().get(3).schema(); Schema schemaE = record.valueSchema().fields().get(1).schema().fields().get(4).schema(); assertThat(schemaA.defaultValue()).isEqualTo((short) 10); assertThat(schemaB.defaultValue()).isEqualTo((short) 5); assertThat(schemaC.defaultValue()).isEqualTo(0); assertThat(schemaD.defaultValue()).isEqualTo(20L); assertThat(schemaE.defaultValue()).isEqualTo(null); assertEmptyFieldValue(record, "F"); }
@Test public void booleanTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("BOOLEAN_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); Schema schemaC = record.valueSchema().fields().get(1).schema().fields().get(2).schema(); Schema schemaD = record.valueSchema().fields().get(1).schema().fields().get(3).schema(); Schema schemaE = record.valueSchema().fields().get(1).schema().fields().get(4).schema(); assertThat(schemaA.defaultValue()).isEqualTo((short) 0); assertThat(schemaB.defaultValue()).isEqualTo((short) 1); assertThat(schemaC.defaultValue()).isEqualTo((short) 1); assertThat(schemaD.defaultValue()).isEqualTo((short) 1); assertThat(schemaE.defaultValue()).isEqualTo(null); }
@Test public void numericAndDecimalToDecimalTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .with(MySqlConnectorConfig.DECIMAL_HANDLING_MODE, JdbcValueConverters.DecimalMode.PRECISE) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("NUMERIC_DECIMAL_TABLE")).get(0); // TODO can't validate due to https://github.com/confluentinc/schema-registry/issues/833 // enable once that's resolved upstream // validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); assertThat(schemaA.defaultValue()).isEqualTo(BigDecimal.valueOf(1.23)); assertThat(schemaB.defaultValue()).isEqualTo(BigDecimal.valueOf(2.321)); assertEmptyFieldValue(record, "D"); }
@Test public void stringTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("STRING_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); Schema schemaC = record.valueSchema().fields().get(1).schema().fields().get(2).schema(); Schema schemaD = record.valueSchema().fields().get(1).schema().fields().get(3).schema(); Schema schemaE = record.valueSchema().fields().get(1).schema().fields().get(4).schema(); Schema schemaF = record.valueSchema().fields().get(1).schema().fields().get(5).schema(); Schema schemaG = record.valueSchema().fields().get(1).schema().fields().get(6).schema(); Schema schemaH = record.valueSchema().fields().get(1).schema().fields().get(7).schema(); assertThat(schemaA.defaultValue()).isEqualTo("A"); assertThat(schemaB.defaultValue()).isEqualTo("b"); assertThat(schemaC.defaultValue()).isEqualTo("CC"); assertThat(schemaD.defaultValue()).isEqualTo("10"); assertThat(schemaE.defaultValue()).isEqualTo("0"); assertThat(schemaF.defaultValue()).isEqualTo(null); assertThat(schemaG.defaultValue()).isEqualTo(null); assertThat(schemaH.defaultValue()).isEqualTo(null); assertEmptyFieldValue(record, "I"); }
@Test public void floatAndDoubleTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("FlOAT_DOUBLE_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); assertThat(schemaA.defaultValue()).isEqualTo(0d); assertThat(schemaB.defaultValue()).isEqualTo(1.0d); assertEmptyFieldValue(record, "H"); }
Objects.equals(schema1.doc(), schema2.doc()) && Objects.equals(schema1.type(), schema2.type()) && Objects.deepEquals(schema1.defaultValue(), schema2.defaultValue()) && fieldsEqual && keySchemasEqual &&
Schema schemaI = record.valueSchema().fields().get(1).schema().fields().get(8).schema(); Schema schemaJ = record.valueSchema().fields().get(1).schema().fields().get(9).schema(); assertThat(schemaA.defaultValue()).isEqualTo(null); assertThat(schemaB.defaultValue()).isEqualTo(false); assertThat(schemaC.defaultValue()).isEqualTo(true); assertThat(schemaD.defaultValue()).isEqualTo(false); assertThat(schemaE.defaultValue()).isEqualTo(true); assertThat(schemaF.defaultValue()).isEqualTo(true); assertThat(schemaG.defaultValue()).isEqualTo(false); assertThat(schemaH.defaultValue()).isEqualTo(new byte[] {66, 1}); assertThat(schemaI.defaultValue()).isEqualTo(null); assertThat(schemaJ.defaultValue()).isEqualTo(new byte[] {15, 97, 1, 0}); assertEmptyFieldValue(record, "K");
@Test public void realTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("REAL_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); assertThat(schemaA.defaultValue()).isEqualTo(1d); assertThat(schemaB.defaultValue()).isEqualTo(null); assertEmptyFieldValue(record, "C"); }
@Test public void numericAndDecimalToDoubleTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .with(MySqlConnectorConfig.DECIMAL_HANDLING_MODE, JdbcValueConverters.DecimalMode.DOUBLE) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("NUMERIC_DECIMAL_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); Schema schemaC = record.valueSchema().fields().get(1).schema().fields().get(2).schema(); assertThat(schemaA.defaultValue()).isEqualTo(1.23d); assertThat(schemaB.defaultValue()).isEqualTo(2.321d); assertThat(schemaC.defaultValue()).isEqualTo(12.678d); assertEmptyFieldValue(record, "D"); }
Schema schemaI = record.valueSchema().fields().get(1).schema().fields().get(8).schema(); assertThat(schemaA.defaultValue()).isEqualTo(2426); assertThat(schemaB.defaultValue()).isEqualTo(isoString); assertThat(schemaC.defaultValue()).isEqualTo(toEpochMillis1); assertThat(schemaD.defaultValue()).isEqualTo(toEpochMillis2); assertThat(schemaE.defaultValue()).isEqualTo(toEpochMicro); assertThat(schemaF.defaultValue()).isEqualTo(2001); assertThat(schemaG.defaultValue()).isEqualTo(0); assertThat(schemaH.defaultValue()).isEqualTo(82800700); assertThat(schemaI.defaultValue()).isEqualTo(82800123456L); assertEmptyFieldValue(record, "K");
assertThat(schemaA.defaultValue()).isEqualTo(isoStringA); assertThat(schemaB.defaultValue()).isEqualTo(null); assertThat(schemaC.defaultValue()).isEqualTo(0); assertThat(schemaD.defaultValue()).isEqualTo(null); assertThat(schemaE.defaultValue()).isEqualTo(toEpochMillisE); assertThat(schemaF.defaultValue()).isEqualTo(null);
@Test public void unsignedMediumIntTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("UNSIGNED_MEDIUMINT_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); Schema schemaC = record.valueSchema().fields().get(1).schema().fields().get(2).schema(); Schema schemaD = record.valueSchema().fields().get(1).schema().fields().get(3).schema(); Schema schemaE = record.valueSchema().fields().get(1).schema().fields().get(4).schema(); Schema schemaF = record.valueSchema().fields().get(1).schema().fields().get(5).schema(); assertThat(schemaA.isOptional()).isEqualTo(true); assertThat(schemaA.defaultValue()).isEqualTo(0); assertThat(schemaB.isOptional()).isEqualTo(true); assertThat(schemaB.defaultValue()).isEqualTo(10); assertThat(schemaC.isOptional()).isEqualTo(true); assertThat(schemaC.defaultValue()).isEqualTo(null); assertThat(schemaD.isOptional()).isEqualTo(false); assertThat(schemaE.isOptional()).isEqualTo(false); assertThat(schemaE.defaultValue()).isEqualTo(0); assertThat(schemaF.isOptional()).isEqualTo(false); assertThat(schemaF.defaultValue()).isEqualTo(0); assertEmptyFieldValue(record, "G"); }
@Test public void unsignedSmallIntTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("UNSIGNED_SMALLINT_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); Schema schemaC = record.valueSchema().fields().get(1).schema().fields().get(2).schema(); Schema schemaD = record.valueSchema().fields().get(1).schema().fields().get(3).schema(); Schema schemaE = record.valueSchema().fields().get(1).schema().fields().get(4).schema(); Schema schemaF = record.valueSchema().fields().get(1).schema().fields().get(5).schema(); assertThat(schemaA.isOptional()).isEqualTo(true); assertThat(schemaA.defaultValue()).isEqualTo(0); assertThat(schemaB.isOptional()).isEqualTo(true); assertThat(schemaB.defaultValue()).isEqualTo(10); assertThat(schemaC.isOptional()).isEqualTo(true); assertThat(schemaC.defaultValue()).isEqualTo(null); assertThat(schemaD.isOptional()).isEqualTo(false); assertThat(schemaE.isOptional()).isEqualTo(false); assertThat(schemaE.defaultValue()).isEqualTo(0); assertThat(schemaF.isOptional()).isEqualTo(false); assertThat(schemaF.defaultValue()).isEqualTo(0); assertEmptyFieldValue(record, "G"); }
Schema schemaF = record.valueSchema().fields().get(1).schema().fields().get(5).schema(); assertThat(schemaA.isOptional()).isEqualTo(true); assertThat(schemaA.defaultValue()).isEqualTo(BigDecimal.ZERO); assertThat(schemaB.isOptional()).isEqualTo(true); assertThat(schemaB.defaultValue()).isEqualTo(new BigDecimal(10)); assertThat(schemaC.isOptional()).isEqualTo(true); assertThat(schemaC.defaultValue()).isEqualTo(null); assertThat(schemaD.isOptional()).isEqualTo(false); assertThat(schemaE.isOptional()).isEqualTo(false); assertThat(schemaE.defaultValue()).isEqualTo(BigDecimal.ZERO); assertThat(schemaF.isOptional()).isEqualTo(false); assertThat(schemaF.defaultValue()).isEqualTo(BigDecimal.ZERO); assertEmptyFieldValue(record, "G");
@Test public void unsignedIntTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("UNSIGNED_INT_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); Schema schemaC = record.valueSchema().fields().get(1).schema().fields().get(2).schema(); Schema schemaD = record.valueSchema().fields().get(1).schema().fields().get(3).schema(); Schema schemaE = record.valueSchema().fields().get(1).schema().fields().get(4).schema(); Schema schemaF = record.valueSchema().fields().get(1).schema().fields().get(5).schema(); assertThat(schemaA.isOptional()).isEqualTo(true); assertThat(schemaA.defaultValue()).isEqualTo(0L); assertThat(schemaB.isOptional()).isEqualTo(true); assertThat(schemaB.defaultValue()).isEqualTo(10L); assertThat(schemaC.isOptional()).isEqualTo(true); assertThat(schemaC.defaultValue()).isEqualTo(null); assertThat(schemaD.isOptional()).isEqualTo(false); assertThat(schemaE.isOptional()).isEqualTo(false); assertThat(schemaE.defaultValue()).isEqualTo(0L); assertThat(schemaF.isOptional()).isEqualTo(false); assertThat(schemaF.defaultValue()).isEqualTo(0L); assertEmptyFieldValue(record, "G"); }
@Test public void unsignedBigIntToLongTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("UNSIGNED_BIGINT_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); Schema schemaC = record.valueSchema().fields().get(1).schema().fields().get(2).schema(); Schema schemaD = record.valueSchema().fields().get(1).schema().fields().get(3).schema(); Schema schemaE = record.valueSchema().fields().get(1).schema().fields().get(4).schema(); Schema schemaF = record.valueSchema().fields().get(1).schema().fields().get(5).schema(); assertThat(schemaA.isOptional()).isEqualTo(true); assertThat(schemaA.defaultValue()).isEqualTo(0L); assertThat(schemaB.isOptional()).isEqualTo(true); assertThat(schemaB.defaultValue()).isEqualTo(10L); assertThat(schemaC.isOptional()).isEqualTo(true); assertThat(schemaC.defaultValue()).isEqualTo(null); assertThat(schemaD.isOptional()).isEqualTo(false); assertThat(schemaE.isOptional()).isEqualTo(false); assertThat(schemaE.defaultValue()).isEqualTo(0L); assertThat(schemaF.isOptional()).isEqualTo(false); assertThat(schemaF.defaultValue()).isEqualTo(0L); assertEmptyFieldValue(record, "G"); }
@Test public void unsignedTinyIntTest() throws InterruptedException { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .with(MySqlConnectorConfig.DDL_PARSER_MODE, "antlr") .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("UNSIGNED_TINYINT_TABLE")).get(0); validate(record); Schema schemaA = record.valueSchema().fields().get(1).schema().fields().get(0).schema(); Schema schemaB = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); Schema schemaC = record.valueSchema().fields().get(1).schema().fields().get(2).schema(); Schema schemaD = record.valueSchema().fields().get(1).schema().fields().get(3).schema(); Schema schemaE = record.valueSchema().fields().get(1).schema().fields().get(4).schema(); Schema schemaF = record.valueSchema().fields().get(1).schema().fields().get(5).schema(); assertThat(schemaA.isOptional()).isEqualTo(true); assertThat(schemaA.defaultValue()).isEqualTo((short) 0); assertThat(schemaB.isOptional()).isEqualTo(true); assertThat(schemaB.defaultValue()).isEqualTo((short) 10); assertThat(schemaC.isOptional()).isEqualTo(true); assertThat(schemaC.defaultValue()).isEqualTo(null); assertThat(schemaD.isOptional()).isEqualTo(false); assertThat(schemaE.isOptional()).isEqualTo(false); assertThat(schemaE.defaultValue()).isEqualTo((short) 0); assertThat(schemaF.isOptional()).isEqualTo(false); assertThat(schemaF.defaultValue()).isEqualTo((short) 0); assertEmptyFieldValue(record, "G"); }
assertThat(customerTypeSchema.defaultValue()).isEqualTo("b2c"); assertThat(customerTypeSchema.defaultValue()).isNull();
@Test @FixFor("DBZ-771") public void columnTypeAndDefaultValueChange() throws Exception { config = DATABASE.defaultConfig() .with(MySqlConnectorConfig.SNAPSHOT_MODE, MySqlConnectorConfig.SnapshotMode.INITIAL) .build(); start(MySqlConnector.class, config); // Testing.Print.enable(); SourceRecords records = consumeRecordsByTopic(EVENT_COUNT); SourceRecord record = records.recordsForTopic(DATABASE.topicForTable("DBZ_771_CUSTOMERS")).get(0); validate(record); Schema customerTypeSchema = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); assertThat(customerTypeSchema.defaultValue()).isEqualTo("b2c"); // Connect to the DB and issue our insert statement to test. try (MySQLConnection db = MySQLConnection.forTestDatabase(DATABASE.getDatabaseName())) { try (JdbcConnection connection = db.connect()) { // Enable Query log option connection.execute("SET binlog_rows_query_log_events=ON"); connection.execute("alter table DBZ_771_CUSTOMERS change customer_type customer_type int default 42;"); connection.execute("insert into DBZ_771_CUSTOMERS (id) values (2);"); } } // consume the records for the two executed statements records = consumeRecordsByTopic(2); record = records.recordsForTopic(DATABASE.topicForTable("DBZ_771_CUSTOMERS")).get(0); validate(record); customerTypeSchema = record.valueSchema().fields().get(1).schema().fields().get(1).schema(); assertThat(customerTypeSchema.defaultValue()).isEqualTo(42); }