From 6cc354330feeddcc44a0b0ca6a287ef3650ac711 Mon Sep 17 00:00:00 2001
From: Pawel Chmielowski <pawel@process-one.net>
Date: Thu, 4 Dec 2025 14:13:19 +0100
Subject: [PATCH] Apply timestamp pass in ?SQL_INSERT queries

---
 src/ejabberd_sql_pt.erl | 43 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/ejabberd_sql_pt.erl b/src/ejabberd_sql_pt.erl
index cc1d62f58..02536a7e8 100644
--- a/src/ejabberd_sql_pt.erl
+++ b/src/ejabberd_sql_pt.erl
@@ -234,13 +234,42 @@ transform_insert(Form, TableArg, FieldsArg) ->
     end,
     ParseResOld =
         filter_upsert_sh(Table, ParseRes),
-    set_pos(
-      make_schema_check(
-        make_sql_insert(Table, ParseRes),
-        make_sql_insert(Table, ParseResOld)
-       ),
-      Pos).
-
+    NeedTimestampPass = lists:any(
+	fun({_, _, State}) -> State#state.need_timestamp_pass
+	end, ParseRes),
+    case NeedTimestampPass of
+	true ->
+	    PR = make_sql_upsert_insert(Table, ParseRes),
+	    PRO = make_sql_upsert_insert(Table, ParseResOld),
+	    set_pos(
+		make_schema_check(
+		    erl_syntax:fun_expr(
+			[erl_syntax:clause(
+			    [erl_syntax:atom(pgsql), erl_syntax:underscore()],
+			    [],
+			    [make_sql_query(PR, pgsql)]),
+			 erl_syntax:clause(
+			     [erl_syntax:underscore()],
+			     [],
+			     [make_sql_query(PR)])]),
+		    erl_syntax:fun_expr(
+			[erl_syntax:clause(
+			    [erl_syntax:atom(pgsql), erl_syntax:underscore()],
+			    [],
+			    [make_sql_query(PRO, pgsql)]),
+			 erl_syntax:clause(
+			     [erl_syntax:underscore()],
+			     [],
+			     [make_sql_query(PRO)])])),
+		Pos);
+	_ ->
+	    set_pos(
+		make_schema_check(
+		    make_sql_insert(Table, ParseRes),
+		    make_sql_insert(Table, ParseResOld)
+		),
+		Pos)
+    end.
 
 parse(S, Loc, UseNewSchema) ->
     parse1(S, [],
-- 
2.51.2

