Skip to content

Commit 7a23fa4

Browse files
authored
[ISSUE-176] bug fix for jdbc sql insert (#506)
* fix: sql insert pattern bug fix * fix: sql insert pattern bug fix
1 parent e3068aa commit 7a23fa4

File tree

3 files changed

+43
-9
lines changed

3 files changed

+43
-9
lines changed

geaflow/geaflow-dsl/geaflow-dsl-connector/geaflow-dsl-connector-jdbc/src/main/java/com/antgroup/geaflow/dsl/connector/jdbc/util/JDBCUtils.java

+29-6
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919

2020
package com.antgroup.geaflow.dsl.connector.jdbc.util;
2121

22+
import com.antgroup.geaflow.common.type.IType;
2223
import com.antgroup.geaflow.common.type.Types;
24+
import com.antgroup.geaflow.common.type.primitive.BinaryStringType;
25+
import com.antgroup.geaflow.common.type.primitive.StringType;
2326
import com.antgroup.geaflow.dsl.common.data.Row;
2427
import com.antgroup.geaflow.dsl.common.data.impl.ObjectRow;
2528
import com.antgroup.geaflow.dsl.common.exception.GeaFlowDSLException;
@@ -29,7 +32,6 @@
2932
import java.sql.SQLException;
3033
import java.sql.Statement;
3134
import java.util.ArrayList;
32-
import java.util.Arrays;
3335
import java.util.List;
3436
import java.util.stream.Collectors;
3537
import org.apache.calcite.sql.type.SqlTypeName;
@@ -72,14 +74,35 @@ public static void createTemporaryTable(Statement statement, String tableName,
7274
public static void insertIntoTable(Statement statement, String tableName,
7375
List<TableField> fields, Row row) throws SQLException {
7476
Object[] values = new Object[fields.size()];
77+
boolean isFirst = true;
78+
StringBuilder builder = new StringBuilder();
7579
for (int i = 0; i < fields.size(); i++) {
80+
if (isFirst) {
81+
isFirst = false;
82+
} else {
83+
builder.append(",");
84+
}
85+
IType type = fields.get(i).getType();
86+
Object value = row.getField(i, type);
87+
if (value == null) {
88+
if (fields.get(i).isNullable()) {
89+
builder.append("null");
90+
} else {
91+
throw new RuntimeException("filed " + fields.get(i).getName() + " can not be null");
92+
}
93+
} else if (type.getClass() == BinaryStringType.class || type.getClass() == StringType.class) {
94+
builder.append("'").append(value).append("'");
95+
} else {
96+
builder.append(value);
97+
}
7698
values[i] = row.getField(i, fields.get(i).getType());
7799
}
78-
String insertIntoValues = StringUtils.join(
79-
Arrays.stream(values).map(value -> "'" + value + "'").collect(Collectors.toList()),
80-
",");
81-
String insertIntoTableQuery = String.format("INSERT INTO %s VALUES (%s);", tableName,
82-
insertIntoValues);
100+
101+
String insertIntoValues = builder.toString();
102+
String insertColumns = StringUtils.join(fields.stream().map(
103+
field -> field.getName()).collect(Collectors.toList()), ",");
104+
String insertIntoTableQuery = String.format("INSERT INTO %s (%s) VALUES (%s);", tableName, insertColumns,
105+
insertIntoValues);
83106
statement.execute(insertIntoTableQuery);
84107
}
85108

geaflow/geaflow-dsl/geaflow-dsl-connector/geaflow-dsl-connector-jdbc/src/test/java/com/antgroup/geaflow/dsl/connector/jdbc/JDBCTableConnectorTest.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,20 @@ public void testCreateTable() throws SQLException {
8383
public void testInsertIntoTable() throws SQLException {
8484
List<TableField> tableFieldList = new ArrayList<>();
8585
tableFieldList.add(new TableField("id", Types.INTEGER, false));
86-
tableFieldList.add(new TableField("name", Types.BINARY_STRING, false));
87-
Row row = ObjectRow.create(5, "Test5");
86+
tableFieldList.add(new TableField("name", Types.BINARY_STRING, true));
87+
Row row = ObjectRow.create(new Object[]{5, null});
8888
JDBCUtils.insertIntoTable(statement, "test_table", tableFieldList, row);
89+
List<Row> rowList = JDBCUtils.selectRowsFromTable(statement, "test_table",
90+
"", 2, 0, 20, "id");
91+
Row resultRow = null;
92+
for (Row queryRow : rowList) {
93+
if ((Integer) queryRow.getField(0, Types.INTEGER) == 5) {
94+
resultRow = queryRow;
95+
break;
96+
}
97+
}
98+
assert resultRow != null;
99+
assert resultRow.getField(1, Types.BINARY_STRING) == null;
89100
}
90101

91102
@Test

geaflow/geaflow-dsl/geaflow-dsl-runtime/src/test/resources/query/jdbc_write_001.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
CREATE TABLE tbl_result (
2121
user_name varchar,
22-
user_count bigint
22+
count bigint
2323
) WITH (
2424
type='jdbc',
2525
geaflow.dsl.jdbc.driver = 'org.h2.Driver',

0 commit comments

Comments
 (0)