Skip to content

Commit 4c7bfc7

Browse files
liyafan82emkornfield
authored andcommitted
ARROW-7301: [Java] Sql type DATE should correspond to DateDayVector
According to SQL convertion, sql type DATE should correspond to a format of YYYY-MM-DD, without the components for hour/minute/second/millis Therefore, JDBC type DATE should correspond to DateDayVector, with a type width of 4, instead of 8. Closes #5944 from liyafan82/fly_1203_date and squashes the following commits: a6de377 <liyafan82> Remove division in time conversion be73192 <liyafan82> Resolve comments eea8b79 <liyafan82> Sql type DATE should correspond to DateDayVector Authored-by: liyafan82 <fan_li_ya@foxmail.com> Signed-off-by: Micah Kornfield <emkornfield@gmail.com>
1 parent 85996e6 commit 4c7bfc7

File tree

15 files changed

+110
-83
lines changed

15 files changed

+110
-83
lines changed

java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/JdbcToArrowUtils.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
import org.apache.arrow.util.Preconditions;
6060
import org.apache.arrow.vector.BigIntVector;
6161
import org.apache.arrow.vector.BitVector;
62-
import org.apache.arrow.vector.DateMilliVector;
62+
import org.apache.arrow.vector.DateDayVector;
6363
import org.apache.arrow.vector.DecimalVector;
6464
import org.apache.arrow.vector.FieldVector;
6565
import org.apache.arrow.vector.Float4Vector;
@@ -210,7 +210,7 @@ public static Schema jdbcToArrowSchema(ResultSetMetaData rsmd, JdbcToArrowConfig
210210
* <li>BINARY --> ArrowType.Binary</li>
211211
* <li>VARBINARY --> ArrowType.Binary</li>
212212
* <li>LONGVARBINARY --> ArrowType.Binary</li>
213-
* <li>DATE --> ArrowType.Date(DateUnit.MILLISECOND)</li>
213+
* <li>DATE --> ArrowType.Date(DateUnit.DAY)</li>
214214
* <li>TIME --> ArrowType.Time(TimeUnit.MILLISECOND, 32)</li>
215215
* <li>TIMESTAMP --> ArrowType.Timestamp(TimeUnit.MILLISECOND, calendar timezone)</li>
216216
* <li>CLOB --> ArrowType.Utf8</li>
@@ -265,7 +265,7 @@ public static ArrowType getArrowTypeForJdbcField(JdbcFieldInfo fieldInfo, Calend
265265
case Types.CLOB:
266266
return new ArrowType.Utf8();
267267
case Types.DATE:
268-
return new ArrowType.Date(DateUnit.MILLISECOND);
268+
return new ArrowType.Date(DateUnit.DAY);
269269
case Types.TIME:
270270
return new ArrowType.Time(TimeUnit.MILLISECOND, 32);
271271
case Types.TIMESTAMP:
@@ -402,7 +402,7 @@ static JdbcConsumer getConsumer(ResultSet resultSet, int columnIndex, int jdbcCo
402402
case Types.LONGNVARCHAR:
403403
return VarCharConsumer.createConsumer((VarCharVector) vector, columnIndex, nullable);
404404
case Types.DATE:
405-
return DateConsumer.createConsumer((DateMilliVector) vector, columnIndex, nullable, calendar);
405+
return DateConsumer.createConsumer((DateDayVector) vector, columnIndex, nullable, calendar);
406406
case Types.TIME:
407407
return TimeConsumer.createConsumer((TimeMilliVector) vector, columnIndex, nullable, calendar);
408408
case Types.TIMESTAMP:

java/adapter/jdbc/src/main/java/org/apache/arrow/adapter/jdbc/consumer/DateConsumer.java

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@
1717

1818
package org.apache.arrow.adapter.jdbc.consumer;
1919

20+
import java.sql.Date;
2021
import java.sql.ResultSet;
2122
import java.sql.SQLException;
23+
import java.text.ParseException;
24+
import java.text.SimpleDateFormat;
2225
import java.util.Calendar;
23-
import java.util.Date;
26+
import java.util.concurrent.TimeUnit;
2427

28+
import org.apache.arrow.vector.DateDayVector;
2529
import org.apache.arrow.vector.DateMilliVector;
2630

2731
/**
@@ -30,11 +34,23 @@
3034
*/
3135
public class DateConsumer {
3236

37+
public static final int MAX_DAY;
38+
39+
static {
40+
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
41+
try {
42+
java.util.Date date = dateFormat.parse("9999-12-31");
43+
MAX_DAY = (int) TimeUnit.MILLISECONDS.toDays(date.getTime());
44+
} catch (ParseException e) {
45+
throw new IllegalArgumentException("Failed to parse max day", e);
46+
}
47+
}
48+
3349
/**
3450
* Creates a consumer for {@link DateMilliVector}.
3551
*/
36-
public static JdbcConsumer<DateMilliVector> createConsumer(
37-
DateMilliVector vector, int index, boolean nullable, Calendar calendar) {
52+
public static JdbcConsumer<DateDayVector> createConsumer(
53+
DateDayVector vector, int index, boolean nullable, Calendar calendar) {
3854
if (nullable) {
3955
return new NullableDateConsumer(vector, index, calendar);
4056
} else {
@@ -45,21 +61,21 @@ public static JdbcConsumer<DateMilliVector> createConsumer(
4561
/**
4662
* Nullable consumer for date.
4763
*/
48-
static class NullableDateConsumer extends BaseConsumer<DateMilliVector> {
64+
static class NullableDateConsumer extends BaseConsumer<DateDayVector> {
4965

5066
protected final Calendar calendar;
5167

5268
/**
5369
* Instantiate a DateConsumer.
5470
*/
55-
public NullableDateConsumer(DateMilliVector vector, int index) {
71+
public NullableDateConsumer(DateDayVector vector, int index) {
5672
this(vector, index, /* calendar */null);
5773
}
5874

5975
/**
6076
* Instantiate a DateConsumer.
6177
*/
62-
public NullableDateConsumer(DateMilliVector vector, int index, Calendar calendar) {
78+
public NullableDateConsumer(DateDayVector vector, int index, Calendar calendar) {
6379
super(vector, index);
6480
this.calendar = calendar;
6581
}
@@ -69,7 +85,11 @@ public void consume(ResultSet resultSet) throws SQLException {
6985
Date date = calendar == null ? resultSet.getDate(columnIndexInResultSet) :
7086
resultSet.getDate(columnIndexInResultSet, calendar);
7187
if (!resultSet.wasNull()) {
72-
vector.setSafe(currentIndex, date.getTime());
88+
int day = (int) TimeUnit.MILLISECONDS.toDays(date.getTime());
89+
if (day < 0 || day > MAX_DAY) {
90+
throw new IllegalArgumentException("Day overflow: " + day);
91+
}
92+
vector.setSafe(currentIndex, day);
7393
}
7494
currentIndex++;
7595
}
@@ -78,21 +98,21 @@ public void consume(ResultSet resultSet) throws SQLException {
7898
/**
7999
* Non-nullable consumer for date.
80100
*/
81-
static class NonNullableDateConsumer extends BaseConsumer<DateMilliVector> {
101+
static class NonNullableDateConsumer extends BaseConsumer<DateDayVector> {
82102

83103
protected final Calendar calendar;
84104

85105
/**
86106
* Instantiate a DateConsumer.
87107
*/
88-
public NonNullableDateConsumer(DateMilliVector vector, int index) {
108+
public NonNullableDateConsumer(DateDayVector vector, int index) {
89109
this(vector, index, /* calendar */null);
90110
}
91111

92112
/**
93113
* Instantiate a DateConsumer.
94114
*/
95-
public NonNullableDateConsumer(DateMilliVector vector, int index, Calendar calendar) {
115+
public NonNullableDateConsumer(DateDayVector vector, int index, Calendar calendar) {
96116
super(vector, index);
97117
this.calendar = calendar;
98118
}
@@ -101,7 +121,11 @@ public NonNullableDateConsumer(DateMilliVector vector, int index, Calendar calen
101121
public void consume(ResultSet resultSet) throws SQLException {
102122
Date date = calendar == null ? resultSet.getDate(columnIndexInResultSet) :
103123
resultSet.getDate(columnIndexInResultSet, calendar);
104-
vector.setSafe(currentIndex, date.getTime());
124+
int day = (int) TimeUnit.MILLISECONDS.toDays(date.getTime());
125+
if (day < 0 || day > MAX_DAY) {
126+
throw new IllegalArgumentException("Day overflow: " + day);
127+
}
128+
vector.setSafe(currentIndex, day);
105129
currentIndex++;
106130
}
107131
}

java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/JdbcToArrowTestHelper.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import org.apache.arrow.vector.BaseValueVector;
3333
import org.apache.arrow.vector.BigIntVector;
3434
import org.apache.arrow.vector.BitVector;
35-
import org.apache.arrow.vector.DateMilliVector;
35+
import org.apache.arrow.vector.DateDayVector;
3636
import org.apache.arrow.vector.DecimalVector;
3737
import org.apache.arrow.vector.Float4Vector;
3838
import org.apache.arrow.vector.Float8Vector;
@@ -173,14 +173,14 @@ public static void assertTimeVectorValues(TimeMilliVector timeMilliVector, int r
173173
}
174174
}
175175

176-
public static void assertDateVectorValues(DateMilliVector dateMilliVector, int rowCount, Long[] values) {
177-
assertEquals(rowCount, dateMilliVector.getValueCount());
176+
public static void assertDateVectorValues(DateDayVector dateDayVector, int rowCount, Integer[] values) {
177+
assertEquals(rowCount, dateDayVector.getValueCount());
178178

179-
for (int j = 0; j < dateMilliVector.getValueCount(); j++) {
179+
for (int j = 0; j < dateDayVector.getValueCount(); j++) {
180180
if (values[j] == null) {
181-
assertTrue(dateMilliVector.isNull(j));
181+
assertTrue(dateDayVector.isNull(j));
182182
} else {
183-
assertEquals(values[j].longValue(), dateMilliVector.get(j));
183+
assertEquals(values[j].longValue(), dateDayVector.get(j));
184184
}
185185
}
186186
}

java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowDataTypesTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
import org.apache.arrow.memory.RootAllocator;
5151
import org.apache.arrow.vector.BigIntVector;
5252
import org.apache.arrow.vector.BitVector;
53-
import org.apache.arrow.vector.DateMilliVector;
53+
import org.apache.arrow.vector.DateDayVector;
5454
import org.apache.arrow.vector.DecimalVector;
5555
import org.apache.arrow.vector.Float4Vector;
5656
import org.apache.arrow.vector.Float8Vector;
@@ -202,8 +202,8 @@ public void testDataSets(VectorSchemaRoot root) {
202202
table.getCharValues());
203203
break;
204204
case DATE:
205-
assertDateVectorValues((DateMilliVector) root.getVector(table.getVector()), table.getValues().length,
206-
table.getLongValues());
205+
assertDateVectorValues((DateDayVector) root.getVector(table.getVector()), table.getValues().length,
206+
table.getIntValues());
207207
break;
208208
case TIME:
209209
assertTimeVectorValues((TimeMilliVector) root.getVector(table.getVector()), table.getValues().length,

java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowNullTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
import org.apache.arrow.memory.RootAllocator;
5959
import org.apache.arrow.vector.BigIntVector;
6060
import org.apache.arrow.vector.BitVector;
61-
import org.apache.arrow.vector.DateMilliVector;
61+
import org.apache.arrow.vector.DateDayVector;
6262
import org.apache.arrow.vector.DecimalVector;
6363
import org.apache.arrow.vector.Float4Vector;
6464
import org.apache.arrow.vector.Float8Vector;
@@ -206,8 +206,8 @@ private void testAllVectorValues(VectorSchemaRoot root) {
206206
assertBooleanVectorValues((BitVector) root.getVector(BOOL), table.getRowCount(),
207207
getBooleanValues(table.getValues(), BOOL));
208208

209-
assertDateVectorValues((DateMilliVector) root.getVector(DATE), table.getRowCount(),
210-
getLongValues(table.getValues(), DATE));
209+
assertDateVectorValues((DateDayVector) root.getVector(DATE), table.getRowCount(),
210+
getIntValues(table.getValues(), DATE));
211211

212212
assertTimeVectorValues((TimeMilliVector) root.getVector(TIME), table.getRowCount(),
213213
getLongValues(table.getValues(), TIME));
@@ -242,7 +242,7 @@ public void sqlToArrowTestNullValues(String[] vectors, VectorSchemaRoot root, in
242242
assertNullValues((Float8Vector) root.getVector(vectors[6]), rowCount);
243243
assertNullValues((Float4Vector) root.getVector(vectors[7]), rowCount);
244244
assertNullValues((TimeMilliVector) root.getVector(vectors[8]), rowCount);
245-
assertNullValues((DateMilliVector) root.getVector(vectors[9]), rowCount);
245+
assertNullValues((DateDayVector) root.getVector(vectors[9]), rowCount);
246246
assertNullValues((TimeStampVector) root.getVector(vectors[10]), rowCount);
247247
assertNullValues((VarBinaryVector) root.getVector(vectors[11]), rowCount);
248248
assertNullValues((VarCharVector) root.getVector(vectors[12]), rowCount);
@@ -265,7 +265,7 @@ public void sqlToArrowTestSelectedNullColumnsValues(String[] vectors, VectorSche
265265
assertNullValues((Float8Vector) root.getVector(vectors[2]), rowCount);
266266
assertNullValues((Float4Vector) root.getVector(vectors[3]), rowCount);
267267
assertNullValues((TimeMilliVector) root.getVector(vectors[4]), rowCount);
268-
assertNullValues((DateMilliVector) root.getVector(vectors[5]), rowCount);
268+
assertNullValues((DateDayVector) root.getVector(vectors[5]), rowCount);
269269
assertNullValues((TimeStampVector) root.getVector(vectors[6]), rowCount);
270270
assertNullValues((VarBinaryVector) root.getVector(vectors[7]), rowCount);
271271
assertNullValues((VarCharVector) root.getVector(vectors[8]), rowCount);

java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
import org.apache.arrow.memory.RootAllocator;
8080
import org.apache.arrow.vector.BigIntVector;
8181
import org.apache.arrow.vector.BitVector;
82-
import org.apache.arrow.vector.DateMilliVector;
82+
import org.apache.arrow.vector.DateDayVector;
8383
import org.apache.arrow.vector.DecimalVector;
8484
import org.apache.arrow.vector.Float4Vector;
8585
import org.apache.arrow.vector.Float8Vector;
@@ -202,8 +202,8 @@ public void testDataSets(VectorSchemaRoot root) {
202202
assertBooleanVectorValues((BitVector) root.getVector(BOOL), table.getRowCount(),
203203
getBooleanValues(table.getValues(), BOOL));
204204

205-
assertDateVectorValues((DateMilliVector) root.getVector(DATE), table.getRowCount(),
206-
getLongValues(table.getValues(), DATE));
205+
assertDateVectorValues((DateDayVector) root.getVector(DATE), table.getRowCount(),
206+
getIntValues(table.getValues(), DATE));
207207

208208
assertTimeVectorValues((TimeMilliVector) root.getVector(TIME), table.getRowCount(),
209209
getLongValues(table.getValues(), TIME));

java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowTimeZoneTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
import org.apache.arrow.adapter.jdbc.JdbcToArrowUtils;
3838
import org.apache.arrow.adapter.jdbc.Table;
3939
import org.apache.arrow.memory.RootAllocator;
40-
import org.apache.arrow.vector.DateMilliVector;
40+
import org.apache.arrow.vector.DateDayVector;
4141
import org.apache.arrow.vector.TimeMilliVector;
4242
import org.apache.arrow.vector.TimeStampVector;
4343
import org.apache.arrow.vector.VectorSchemaRoot;
@@ -145,8 +145,8 @@ public void testDataSets(VectorSchemaRoot root) {
145145
case EST_DATE:
146146
case GMT_DATE:
147147
case PST_DATE:
148-
assertDateVectorValues((DateMilliVector) root.getVector(table.getVector()), table.getValues().length,
149-
table.getLongValues());
148+
assertDateVectorValues((DateDayVector) root.getVector(table.getVector()), table.getValues().length,
149+
table.getIntValues());
150150
break;
151151
case EST_TIME:
152152
case GMT_TIME:

java/adapter/jdbc/src/test/java/org/apache/arrow/adapter/jdbc/h2/JdbcToArrowVectorIteratorTest.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
import org.apache.arrow.memory.RootAllocator;
3939
import org.apache.arrow.vector.BigIntVector;
4040
import org.apache.arrow.vector.BitVector;
41-
import org.apache.arrow.vector.DateMilliVector;
41+
import org.apache.arrow.vector.DateDayVector;
4242
import org.apache.arrow.vector.DecimalVector;
4343
import org.apache.arrow.vector.Float4Vector;
4444
import org.apache.arrow.vector.Float8Vector;
@@ -51,6 +51,7 @@
5151
import org.apache.arrow.vector.VarBinaryVector;
5252
import org.apache.arrow.vector.VarCharVector;
5353
import org.apache.arrow.vector.VectorSchemaRoot;
54+
import org.junit.Test;
5455
import org.junit.runner.RunWith;
5556
import org.junit.runners.Parameterized;
5657

@@ -66,6 +67,7 @@ public JdbcToArrowVectorIteratorTest(Table table) {
6667
super(table);
6768
}
6869

70+
@Test
6971
@Override
7072
public void testJdbcToArrowValues() throws SQLException, IOException {
7173

@@ -91,7 +93,7 @@ private void validate(ArrowVectorIterator iterator) throws SQLException, IOExcep
9193
List<VarCharVector> vectorsForChar = new ArrayList<>();
9294
List<BitVector> vectorsForBit = new ArrayList<>();
9395
List<BitVector> vectorsForBool = new ArrayList<>();
94-
List<DateMilliVector> dateMilliVectors = new ArrayList<>();
96+
List<DateDayVector> dateDayVectors = new ArrayList<>();
9597
List<TimeMilliVector> timeMilliVectors = new ArrayList<>();
9698
List<TimeStampVector> timeStampVectors = new ArrayList<>();
9799
List<DecimalVector> decimalVectors = new ArrayList<>();
@@ -115,7 +117,7 @@ private void validate(ArrowVectorIterator iterator) throws SQLException, IOExcep
115117
vectorsForChar.add((VarCharVector) root.getVector(CHAR));
116118
vectorsForBit.add((BitVector) root.getVector(BIT));
117119
vectorsForBool.add((BitVector) root.getVector(BOOL));
118-
dateMilliVectors.add((DateMilliVector) root.getVector(DATE));
120+
dateDayVectors.add((DateDayVector) root.getVector(DATE));
119121
timeMilliVectors.add((TimeMilliVector) root.getVector(TIME));
120122
timeStampVectors.add((TimeStampVector) root.getVector(TIMESTAMP));
121123
decimalVectors.add((DecimalVector) root.getVector(DECIMAL));
@@ -134,7 +136,7 @@ private void validate(ArrowVectorIterator iterator) throws SQLException, IOExcep
134136
assertVarCharVectorValues(vectorsForChar, table.getRowCount(), getCharArray(table.getValues(), CHAR));
135137
assertBitVectorValues(vectorsForBit, table.getRowCount(), getIntValues(table.getValues(), BIT));
136138
assertBooleanVectorValues(vectorsForBool, table.getRowCount(), getBooleanValues(table.getValues(), BOOL));
137-
assertDateMilliVectorValues(dateMilliVectors, table.getRowCount(), getLongValues(table.getValues(), DATE));
139+
assertDateDayVectorValues(dateDayVectors, table.getRowCount(), getLongValues(table.getValues(), DATE));
138140
assertTimeMilliVectorValues(timeMilliVectors, table.getRowCount(), getLongValues(table.getValues(), TIME));
139141
assertTimeStampVectorValues(timeStampVectors, table.getRowCount(), getLongValues(table.getValues(), TIMESTAMP));
140142
assertDecimalVectorValues(decimalVectors, table.getRowCount(), getDecimalValues(table.getValues(), DECIMAL));
@@ -205,12 +207,12 @@ private void assertTimeMilliVectorValues(List<TimeMilliVector> vectors, int rowC
205207
}
206208
}
207209

208-
private void assertDateMilliVectorValues(List<DateMilliVector> vectors, int rowCount, Long[] values) {
210+
private void assertDateDayVectorValues(List<DateDayVector> vectors, int rowCount, Long[] values) {
209211
int valueCount = vectors.stream().mapToInt(ValueVector::getValueCount).sum();
210212
assertEquals(rowCount, valueCount);
211213

212214
int index = 0;
213-
for (DateMilliVector vector : vectors) {
215+
for (DateDayVector vector : vectors) {
214216
for (int i = 0; i < vector.getValueCount(); i++) {
215217
assertEquals(values[index++].longValue(), vector.get(i));
216218
}

java/adapter/jdbc/src/test/resources/h2/test1_all_datatypes_h2.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ values:
8585
- 'DECIMAL_FIELD6=17345667789.23,17345667789.23,17345667789.23,17345667789.23,17345667789.23,17345667789.23,17345667789.23,17345667789.23,17345667789.23,17345667789.23'
8686
- 'DOUBLE_FIELD7=56478356785.345,56478356785.345,56478356785.345,56478356785.345,56478356785.345,56478356785.345,56478356785.345,56478356785.345,56478356785.345,56478356785.345'
8787
- 'TIME_FIELD9=45935000,45935000,45935000,45935000,45935000,45935000,45935000,45935000,45935000,45935000'
88-
- 'DATE_FIELD10=1518393600000,1518393600000,1518393600000,1518393600000,1518393600000,1518393600000,1518393600000,1518393600000,1518393600000,1518393600000'
88+
- 'DATE_FIELD10=17574,17574,17574,17574,17574,17574,17574,17574,17574,17574'
8989
- 'TIMESTAMP_FIELD11=1518439535000,1518439535000,1518439535000,1518439535000,1518439535000,1518439535000,1518439535000,1518439535000,1518439535000,1518439535000'
9090
- 'CHAR_FIELD16=some char text,some char text,some char text,some char text,some char text,
9191
some char text,some char text,some char text,some char text,some char text'

java/adapter/jdbc/src/test/resources/h2/test1_all_datatypes_selected_null_rows_h2.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ values:
7171
- 'DECIMAL_FIELD6=null,17345667789.23,null,17345667789.23,null'
7272
- 'DOUBLE_FIELD7=null,56478356785.345,null,56478356785.345,null'
7373
- 'TIME_FIELD9=null,45935000,null,45935000,null'
74-
- 'DATE_FIELD10=null,1518393600000,null,1518393600000,null'
74+
- 'DATE_FIELD10=null,17574,null,17574,null'
7575
- 'TIMESTAMP_FIELD11=null,1518439535000,null,1518439535000,null'
7676
- 'CHAR_FIELD16=null,some char text,null,some char text,null'
7777
- 'VARCHAR_FIELD13=null,some text that needs to be converted to varchar,null,

0 commit comments

Comments
 (0)