Skip to content

Commit 02494b2

Browse files
committed
[improve][jdbc] copy sql hint from user sql to chunk split sql
1 parent ffbfdab commit 02494b2

File tree

2 files changed

+51
-13
lines changed

2 files changed

+51
-13
lines changed

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/source/DynamicChunkSplitter.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,14 @@ String createDynamicSplitQuerySQL(JdbcSourceSplit split, TableSchema schema) {
490490

491491
String splitQuery = split.getSplitQuery();
492492
if (StringUtils.isNotBlank(splitQuery)) {
493-
splitQuery = String.format("SELECT * FROM (%s) tmp", splitQuery);
493+
if (splitQuery.contains("/*+") && splitQuery.contains("*/")) {
494+
String sqlHint =
495+
splitQuery.substring(
496+
splitQuery.indexOf("/*+"), splitQuery.indexOf("*/") + 2);
497+
splitQuery = String.format("SELECT %s * FROM (%s) tmp", sqlHint, splitQuery);
498+
} else {
499+
splitQuery = String.format("SELECT * FROM (%s) tmp", splitQuery);
500+
}
494501
} else {
495502
splitQuery =
496503
String.format(

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/source/FixedChunkSplitter.java

+43-12
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,31 @@ private Collection<JdbcSourceSplit> createStringColumnSplits(
114114
for (int i = 0; i < table.getPartitionNumber(); i++) {
115115
String splitQuery;
116116
if (StringUtils.isNotBlank(table.getQuery())) {
117-
splitQuery =
118-
String.format(
119-
"SELECT * FROM (%s) st_jdbc_splitter WHERE %s = ?",
120-
table.getQuery(),
121-
jdbcDialect.hashModForField(
122-
column.getSourceType(),
123-
splitKeyName,
124-
table.getPartitionNumber()));
117+
if (table.getQuery().contains("/*+") && table.getQuery().contains("*/")) {
118+
String sqlHint =
119+
table.getQuery()
120+
.substring(
121+
table.getQuery().indexOf("/*+"),
122+
table.getQuery().indexOf("*/") + 2);
123+
splitQuery =
124+
String.format(
125+
"SELECT %s * FROM (%s) st_jdbc_splitter WHERE %s = ?",
126+
sqlHint,
127+
table.getQuery(),
128+
jdbcDialect.hashModForField(
129+
column.getSourceType(),
130+
splitKeyName,
131+
table.getPartitionNumber()));
132+
} else {
133+
splitQuery =
134+
String.format(
135+
"SELECT * FROM (%s) st_jdbc_splitter WHERE %s = ?",
136+
table.getQuery(),
137+
jdbcDialect.hashModForField(
138+
column.getSourceType(),
139+
splitKeyName,
140+
table.getPartitionNumber()));
141+
}
125142
} else {
126143
splitQuery =
127144
String.format(
@@ -186,10 +203,24 @@ private PreparedStatement createNumberColumnSplitStatement(JdbcSourceSplit split
186203
String splitQuery;
187204
String splitKeyName = jdbcDialect.quoteIdentifier(split.getSplitKeyName());
188205
if (StringUtils.isNotBlank(split.getSplitQuery())) {
189-
splitQuery =
190-
String.format(
191-
"SELECT * FROM (%s) st_jdbc_splitter WHERE %s >= ? AND %s <= ?",
192-
split.getSplitQuery(), splitKeyName, splitKeyName);
206+
// check if the query contains sql hint
207+
if (split.getSplitQuery().contains("/*+") && split.getSplitQuery().contains("*/")) {
208+
String sqlHint =
209+
split.getSplitQuery()
210+
.substring(
211+
split.getSplitQuery().indexOf("/*+"),
212+
split.getSplitQuery().indexOf("*/") + 2);
213+
splitQuery =
214+
String.format(
215+
"SELECT %s * FROM (%s) st_jdbc_splitter WHERE %s >= ? AND %s <= ?",
216+
sqlHint, split.getSplitQuery(), splitKeyName, splitKeyName);
217+
} else {
218+
splitQuery =
219+
String.format(
220+
"SELECT * FROM (%s) st_jdbc_splitter WHERE %s >= ? AND %s <= ?",
221+
split.getSplitQuery(), splitKeyName, splitKeyName);
222+
}
223+
193224
} else {
194225
splitQuery =
195226
String.format(

0 commit comments

Comments
 (0)