From 5008947e326f24fa88f9c06c970630047d6b1020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= 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).