This is an automated email from the ASF dual-hosted git repository.
terrymanu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new cc3ab134810 Fix No value specified for parameter exception when sql is
'INSERT INTO tableName *** ON CONFLICT *** DO UPDATE set ** WHERE ***' (#38668)
cc3ab134810 is described below
commit cc3ab1348109451d73f978f4a4402d91205a974e
Author: Claire <[email protected]>
AuthorDate: Sun May 24 21:33:03 2026 +0800
Fix No value specified for parameter exception when sql is 'INSERT INTO
tableName *** ON CONFLICT *** DO UPDATE set ** WHERE ***' (#38668)
* update whereclause
* update release-notes
* update
---
RELEASE-NOTES.md | 1 +
.../statement/PostgreSQLStatementVisitor.java | 6 ++++
.../parser/src/main/resources/case/dml/insert.xml | 32 ++++++++++++++++++++++
.../main/resources/sql/supported/dml/insert.xml | 1 +
4 files changed, 40 insertions(+)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 9c6818c23e7..038786d901d 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -10,6 +10,7 @@
1. SQL Parser: Preserve unary NOT as NotExpression for scalar-subquery table
extraction in PostgreSQL -
[#38187](https://github.com/apache/shardingsphere/pull/38187)
1. SQL Parser: Fix wrong parameter index parse in MySQL, Doris -
[#38624](https://github.com/apache/shardingsphere/pull/38624)
+1. SQL Parser: Fix No value specified for parameter exception when sql is
'INSERT INTO tableName ON CONFLICT DO UPDATE set WHERE ' -
[#38668](https://github.com/apache/shardingsphere/pull/38668)
1. SQL Binder: Add DialectFunctionOption to handle wrong skip column bind in
ColumnSegmentBinder -
[#38350](https://github.com/apache/shardingsphere/pull/38350)
1. SQL Binder: Fix wrong bind info when order by refer column from with
temporary table - [#38353](https://github.com/apache/shardingsphere/pull/38353)
1. JDBC: Fix stale generated values leaking into prepared statement
executeBatch calls without pending batches -
[#38160](https://github.com/apache/shardingsphere/pull/38160)
diff --git
a/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
b/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
index 4798df9f902..a83f3b5b8ec 100644
---
a/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
+++
b/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
@@ -730,9 +730,15 @@ public abstract class PostgreSQLStatementVisitor extends
PostgreSQLStatementPars
@Override
public ASTNode visitOptOnConflict(final OptOnConflictContext ctx) {
Collection<ColumnAssignmentSegment> assignments = new LinkedList<>();
+ if (null != ctx.optConfExpr()) {
+ visit(ctx.optConfExpr());
+ }
if (null != ctx.setClauseList()) {
assignments = ((SetAssignmentSegment)
visit(ctx.setClauseList())).getAssignments();
}
+ if (null != ctx.whereClause()) {
+ visit(ctx.whereClause());
+ }
return new
OnDuplicateKeyColumnsSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), assignments);
}
diff --git a/test/it/parser/src/main/resources/case/dml/insert.xml
b/test/it/parser/src/main/resources/case/dml/insert.xml
index b1f2ed573d5..b665c657e33 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -5785,4 +5785,36 @@
</value>
</values>
</insert>
+
+ <insert sql-case-id="insert_on_conflit_do_update" parameters="1,'init',1">
+ <table name="t_order" start-index="12" stop-index="18" />
+ <columns start-index="21" stop-index="32">
+ <column name="c1" start-index="22" stop-index="23" />
+ <column name="c2" start-index="26" stop-index="27" />
+ <column name="c3" start-index="30" stop-index="31" />
+ </columns>
+ <values>
+ <value>
+ <assignment-value>
+ <parameter-marker-expression parameter-index="0"
start-index="44" stop-index="44" />
+ <literal-expression value="1" start-index="44"
stop-index="44" />
+ </assignment-value>
+ <assignment-value>
+ <function function-name="now" text="now()"
start-index="47" stop-index="51" literal-start-index="47"
literal-stop-index="51" />
+ </assignment-value>
+ <assignment-value>
+ <parameter-marker-expression parameter-index="1"
start-index="54" stop-index="54" />
+ <literal-expression value="init" start-index="54"
stop-index="59" />
+ </assignment-value>
+ </value>
+ </values>
+ <on-duplicate-key-columns start-index="58" stop-index="121"
literal-start-index="63" literal-stop-index="126">
+ <assignment start-index="95" stop-index="97">
+ <column name="c2" start-index="95" stop-index="96"
literal-start-index="100" literal-stop-index="101"/>
+ <assignment-value>
+ <function function-name="now" text="now()"
start-index="100" stop-index="104" literal-start-index="105"
literal-stop-index="109" />
+ </assignment-value>
+ </assignment>
+ </on-duplicate-key-columns>
+ </insert>
</sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
index 1832fc7ea40..f6dd2e0c60a 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
@@ -207,4 +207,5 @@
<sql-case id="insert_without_columns_sql92" value="INSERT INTO t_order
VALUES (1, 'ok')" db-types="SQL92" />
<sql-case id="insert_with_default_sql92" value="INSERT INTO
t_order(status) VALUES (DEFAULT)" db-types="SQL92" />
<sql-case id="insert_table_collection_oracle" value="INSERT INTO
TABLE(SELECT t.nested_col FROM t_nested t) VALUES (1)" db-types="Oracle" />
+ <sql-case id="insert_on_conflit_do_update" value="INSERT INTO t_order (
c1, c2, c3 ) VALUES ( ?, now(), ? ) ON CONFLICT ( c1, c3 ) DO UPDATE set c2 =
now() WHERE user_id= ?" db-types="PostgreSQL" />
</sql-cases>