From 5008947e326f24fa88f9c06c970630047d6b1020 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= <pawel@process-one.net>
Date: Mon, 31 Mar 2025 11:49:30 +0200
Subject: [PATCH] Make sqlite update_primary_key when copying data use list of
 columns and not *

Since * depends on order of columns, if original table have different
column layout we could get resulting columns in wrong order.

This is fix for issue #4365
---
 src/ejabberd_sql_schema.erl | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/ejabberd_sql_schema.erl b/src/ejabberd_sql_schema.erl
index f798af5b832..8d283010127 100644
--- a/src/ejabberd_sql_schema.erl
+++ b/src/ejabberd_sql_schema.erl
@@ -410,18 +410,21 @@ sqlite_table_copy_t(SchemaInfo, Table) ->
     NewTableName = <<"new_", TableName/binary>>,
     NewTable = Table#sql_table{name = NewTableName},
     create_table_t(SchemaInfo, NewTable),
-    SQL2 = <<"INSERT INTO ", NewTableName/binary,
-             " SELECT * FROM ", TableName/binary>>,
+    Columns = lists:join(<<",">>,
+                         lists:map(fun(C) -> escape_name(SchemaInfo, C#sql_column.name) end,
+                                   Table#sql_table.columns)),
+    SQL2 = [<<"INSERT INTO ">>, NewTableName,
+            <<" SELECT ">>, Columns, <<" FROM ">>, TableName],
     ?INFO_MSG("Copying table ~s to ~s:~n~s~n",
               [TableName, NewTableName, SQL2]),
     ejabberd_sql:sql_query_t(SQL2),
     SQL3 = <<"DROP TABLE ", TableName/binary>>,
     ?INFO_MSG("Droping old table ~s:~n~s~n",
-              [TableName, SQL2]),
+              [TableName, SQL3]),
     ejabberd_sql:sql_query_t(SQL3),
     SQL4 = <<"ALTER TABLE ", NewTableName/binary,
              " RENAME TO ", TableName/binary>>,
-    ?INFO_MSG("Renameing table ~s to ~s:~n~s~n",
+    ?INFO_MSG("Renaming table ~s to ~s:~n~s~n",
               [NewTableName, TableName, SQL4]),
     ejabberd_sql:sql_query_t(SQL4).
 
