DBZ-7374 Fix parsing NULL as the default value for SQL server (Unicode) character strings
This commit is contained in:
parent
d73f008884
commit
1d8a56778d
@ -240,6 +240,7 @@ Jakub Cechacek
|
|||||||
James Gormley
|
James Gormley
|
||||||
James Johnston
|
James Johnston
|
||||||
Jan-Hendrik Dolling
|
Jan-Hendrik Dolling
|
||||||
|
Jan Lieskovsky
|
||||||
Jan Uyttenhove
|
Jan Uyttenhove
|
||||||
JapuDCret
|
JapuDCret
|
||||||
Jaromir Hamala
|
Jaromir Hamala
|
||||||
@ -579,4 +580,4 @@ Pavithrananda Prabhu
|
|||||||
حمود سمبول
|
حمود سمبول
|
||||||
Peter Hamer
|
Peter Hamer
|
||||||
Artem Shubovych
|
Artem Shubovych
|
||||||
leoloel
|
leoloel
|
||||||
|
@ -153,14 +153,14 @@ private Map<String, DefaultValueMapper> createDefaultValueMappers() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Character strings
|
// Character strings
|
||||||
result.put("char", (c, v) -> v.substring(2, v.length() - 2)); // Sample value: ('aaa')
|
result.put("char", (c, v) -> nullableStringDefaultValueMapper(c, v, (col, value) -> String.valueOf(value))); // Sample value: ('aaa')
|
||||||
result.put("text", (c, v) -> v.substring(2, v.length() - 2)); // Sample value: ('aaa')
|
result.put("text", (c, v) -> nullableStringDefaultValueMapper(c, v, (col, value) -> String.valueOf(value))); // Sample value: ('aaa')
|
||||||
result.put("varchar", (c, v) -> v.substring(2, v.length() - 2)); // Sample value: ('aaa')
|
result.put("varchar", (c, v) -> nullableStringDefaultValueMapper(c, v, (col, value) -> String.valueOf(value))); // Sample value: ('aaa')
|
||||||
|
|
||||||
// Unicode character strings
|
// Unicode character strings
|
||||||
result.put("nchar", (c, v) -> v.substring(2, v.length() - 2)); // Sample value: ('aaa')
|
result.put("nchar", (c, v) -> nullableStringDefaultValueMapper(c, v, (col, value) -> String.valueOf(value))); // Sample value: ('aaa')
|
||||||
result.put("ntext", (c, v) -> v.substring(2, v.length() - 2)); // Sample value: ('aaa')
|
result.put("ntext", (c, v) -> nullableStringDefaultValueMapper(c, v, (col, value) -> String.valueOf(value))); // Sample value: ('aaa')
|
||||||
result.put("nvarchar", (c, v) -> v.substring(2, v.length() - 2)); // Sample value: ('aaa')
|
result.put("nvarchar", (c, v) -> nullableStringDefaultValueMapper(c, v, (col, value) -> String.valueOf(value))); // Sample value: ('aaa')
|
||||||
|
|
||||||
// Binary strings
|
// Binary strings
|
||||||
result.put("binary", (c, v) -> HexConverter.convertFromHex(v.substring(3, v.length() - 1))); // Sample value: (0x0102030405)
|
result.put("binary", (c, v) -> HexConverter.convertFromHex(v.substring(3, v.length() - 1))); // Sample value: (0x0102030405)
|
||||||
@ -182,4 +182,12 @@ public static Object nullableDefaultValueMapper(Column column, String v, Default
|
|||||||
return mapper.parse(column, value);
|
return mapper.parse(column, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Object nullableStringDefaultValueMapper(Column column, String v, DefaultValueMapper mapper) throws Exception {
|
||||||
|
int start = v.indexOf('\'') == -1 ? 0 : v.indexOf('\'') + 1;
|
||||||
|
int end = !v.contains("'") ? v.length() : v.lastIndexOf('\'');
|
||||||
|
final String value = v.substring(start, end); // trim (a single occurrence) of leading and trailing single quote
|
||||||
|
// Call the default nullable mapper to trim any leftover parentheses yet, e.g. when (NULL) sample value arrived
|
||||||
|
return nullableDefaultValueMapper(column, value, mapper);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,14 +197,60 @@ public void shouldProperlyGetDefaultColumnValues() throws Exception {
|
|||||||
|
|
||||||
// and issue a test call to a CDC wrapper function
|
// and issue a test call to a CDC wrapper function
|
||||||
Thread.sleep(5_000); // Need to wait to make sure the min_lsn is available
|
Thread.sleep(5_000); // Need to wait to make sure the min_lsn is available
|
||||||
List<String> capturedColumns = Arrays.asList("int_no_default_not_null", "int_no_default", "bigint_column", "int_column", "smallint_column", "tinyint_column",
|
List<String> capturedColumns = Arrays
|
||||||
"bit_column", "decimal_column", "decimal_mismatch_default", "numeric_column", "numeric_mismatch_default", "money_column", "money_mismatch_default",
|
.asList(
|
||||||
"smallmoney_column", "smallmoney_mismatch_default", "float_column", "real_column",
|
"int_no_default_not_null",
|
||||||
"date_column", "datetime_column", "datetime2_column", "datetime2_0_column", "datetime2_1_column", "datetime2_2_column", "datetime2_3_column",
|
"int_no_default",
|
||||||
"datetime2_4_column", "datetime2_5_column", "datetime2_6_column", "datetime2_7_column", "datetimeoffset_column", "smalldatetime_column",
|
"bigint_column",
|
||||||
"time_column", "time_0_column", "time_1_column", "time_2_column", "time_3_column", "time_4_column", "time_5_column", "time_6_column",
|
"int_column",
|
||||||
"time_7_column", "char_column", "varchar_column", "text_column", "nchar_column", "nvarchar_column", "ntext_column", "binary_column",
|
"smallint_column",
|
||||||
"varbinary_column", "image_column");
|
"tinyint_column",
|
||||||
|
"bit_column",
|
||||||
|
"decimal_column",
|
||||||
|
"decimal_mismatch_default",
|
||||||
|
"numeric_column",
|
||||||
|
"numeric_mismatch_default",
|
||||||
|
"money_column",
|
||||||
|
"money_mismatch_default",
|
||||||
|
"smallmoney_column",
|
||||||
|
"smallmoney_mismatch_default",
|
||||||
|
"float_column",
|
||||||
|
"real_column",
|
||||||
|
|
||||||
|
"date_column",
|
||||||
|
"datetime_column",
|
||||||
|
"datetime2_column",
|
||||||
|
"datetime2_0_column",
|
||||||
|
"datetime2_1_column",
|
||||||
|
"datetime2_2_column",
|
||||||
|
"datetime2_3_column",
|
||||||
|
"datetime2_4_column",
|
||||||
|
"datetime2_5_column",
|
||||||
|
"datetime2_6_column",
|
||||||
|
"datetime2_7_column",
|
||||||
|
"datetimeoffset_column",
|
||||||
|
"smalldatetime_column",
|
||||||
|
|
||||||
|
"time_column",
|
||||||
|
"time_0_column",
|
||||||
|
"time_1_column",
|
||||||
|
"time_2_column",
|
||||||
|
"time_3_column",
|
||||||
|
"time_4_column",
|
||||||
|
"time_5_column",
|
||||||
|
"time_6_column",
|
||||||
|
"time_7_column",
|
||||||
|
|
||||||
|
"char_column",
|
||||||
|
"varchar_column",
|
||||||
|
"text_column",
|
||||||
|
"nchar_column",
|
||||||
|
"nvarchar_column",
|
||||||
|
"ntext_column",
|
||||||
|
|
||||||
|
"binary_column",
|
||||||
|
"varbinary_column",
|
||||||
|
"image_column");
|
||||||
|
|
||||||
SqlServerChangeTable changeTable = new SqlServerChangeTable(new TableId("testDB1", "dbo", "table_with_defaults"),
|
SqlServerChangeTable changeTable = new SqlServerChangeTable(new TableId("testDB1", "dbo", "table_with_defaults"),
|
||||||
null, 0, null, capturedColumns);
|
null, 0, null, capturedColumns);
|
||||||
@ -333,6 +379,26 @@ public void shouldProperlyGetDefaultColumnNullValues() throws Exception {
|
|||||||
+ " real_no_default real,"
|
+ " real_no_default real,"
|
||||||
+ " real_default_null real default null,"
|
+ " real_default_null real default null,"
|
||||||
+ " real_column real default (1.2345e3),"
|
+ " real_column real default (1.2345e3),"
|
||||||
|
|
||||||
|
+ " char_default_null_no_paren char(10) default null,"
|
||||||
|
+ " char_default_null_single_paren char(10) default (NULL),"
|
||||||
|
+ " char_default_null_double_paren char(10) default ((NULL)),"
|
||||||
|
+ " varchar_default_null_no_paren varchar(10) default null,"
|
||||||
|
+ " varchar_default_null_single_paren varchar(10) default (NULL),"
|
||||||
|
+ " varchar_default_null_double_paren varchar(10) default ((NULL)),"
|
||||||
|
+ " text_default_null_no_paren text default null,"
|
||||||
|
+ " text_default_null_single_paren text default (NULL),"
|
||||||
|
+ " text_default_null_double_paren text default ((NULL)),"
|
||||||
|
+ " nchar_default_null_no_paren nchar(10) default null,"
|
||||||
|
+ " nchar_default_null_single_paren nchar(10) default (NULL),"
|
||||||
|
+ " nchar_default_null_double_paren nchar(10) default ((NULL)),"
|
||||||
|
+ " nvarchar_default_null_no_paren nvarchar(10) default null,"
|
||||||
|
+ " nvarchar_default_null_single_paren nvarchar(10) default (NULL),"
|
||||||
|
+ " nvarchar_default_null_double_paren nvarchar(10) default ((NULL)),"
|
||||||
|
+ " ntext_default_null_no_paren ntext default null,"
|
||||||
|
+ " ntext_default_null_single_paren ntext default (NULL),"
|
||||||
|
+ " ntext_default_null_double_paren ntext default ((NULL)),"
|
||||||
|
|
||||||
+ ");";
|
+ ");";
|
||||||
|
|
||||||
connection.execute(sql);
|
connection.execute(sql);
|
||||||
@ -375,7 +441,26 @@ public void shouldProperlyGetDefaultColumnNullValues() throws Exception {
|
|||||||
"real_no_default_not_null",
|
"real_no_default_not_null",
|
||||||
"real_no_default",
|
"real_no_default",
|
||||||
"real_default_null",
|
"real_default_null",
|
||||||
"real_column");
|
"real_column",
|
||||||
|
|
||||||
|
"char_default_null_no_paren",
|
||||||
|
"char_default_null_single_paren",
|
||||||
|
"char_default_null_double_paren",
|
||||||
|
"varchar_default_null_no_paren",
|
||||||
|
"varchar_default_null_single_paren",
|
||||||
|
"varchar_default_null_double_paren",
|
||||||
|
"text_default_null_no_paren",
|
||||||
|
"text_default_null_single_paren",
|
||||||
|
"text_default_null_double_paren",
|
||||||
|
"nchar_default_null_no_paren",
|
||||||
|
"nchar_default_null_single_paren",
|
||||||
|
"nchar_default_null_double_paren",
|
||||||
|
"nvarchar_default_null_no_paren",
|
||||||
|
"nvarchar_default_null_single_paren",
|
||||||
|
"nvarchar_default_null_double_paren",
|
||||||
|
"ntext_default_null_no_paren",
|
||||||
|
"ntext_default_null_single_paren",
|
||||||
|
"ntext_default_null_double_paren");
|
||||||
|
|
||||||
SqlServerChangeTable changeTable = new SqlServerChangeTable(new TableId("testDB1", "dbo", "table_with_defaults"),
|
SqlServerChangeTable changeTable = new SqlServerChangeTable(new TableId("testDB1", "dbo", "table_with_defaults"),
|
||||||
null, 0, null, capturedColumns);
|
null, 0, null, capturedColumns);
|
||||||
@ -416,6 +501,25 @@ SchemaNameAdjuster.NO_OP, new CustomConverterRegistry(null), SchemaBuilder.struc
|
|||||||
assertColumnHasDefaultValue(table, "real_no_default", null, tableSchemaBuilder);
|
assertColumnHasDefaultValue(table, "real_no_default", null, tableSchemaBuilder);
|
||||||
assertColumnHasDefaultValue(table, "real_default_null", null, tableSchemaBuilder);
|
assertColumnHasDefaultValue(table, "real_default_null", null, tableSchemaBuilder);
|
||||||
assertColumnHasDefaultValue(table, "real_column", 1234.5f, tableSchemaBuilder);
|
assertColumnHasDefaultValue(table, "real_column", 1234.5f, tableSchemaBuilder);
|
||||||
|
|
||||||
|
assertColumnHasDefaultValue(table, "char_default_null_no_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "char_default_null_single_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "char_default_null_double_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "varchar_default_null_no_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "varchar_default_null_single_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "varchar_default_null_double_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "text_default_null_no_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "text_default_null_single_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "text_default_null_double_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "nchar_default_null_no_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "nchar_default_null_single_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "nchar_default_null_double_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "nvarchar_default_null_no_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "nvarchar_default_null_single_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "nvarchar_default_null_double_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "ntext_default_null_no_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "ntext_default_null_single_paren", null, tableSchemaBuilder);
|
||||||
|
assertColumnHasDefaultValue(table, "ntext_default_null_double_paren", null, tableSchemaBuilder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,4 +249,5 @@ Lourens Naude,Lourens Naudé
|
|||||||
overwatcheddude,حمود سمبول
|
overwatcheddude,حمود سمبول
|
||||||
wukachn,Peter Hamer
|
wukachn,Peter Hamer
|
||||||
shybovycha,Artem Shubovych
|
shybovycha,Artem Shubovych
|
||||||
Liaoyuxing,leoloel
|
Liaoyuxing,leoloel
|
||||||
|
iankko,Jan Lieskovsky
|
||||||
|
Loading…
Reference in New Issue
Block a user