1
0
Fork 0
mirror of https://github.com/processone/ejabberd synced 2025-10-03 01:39:35 +02:00

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
This commit is contained in:
Paweł Chmielowski 2025-03-31 11:49:30 +02:00
parent 85d0e93af5
commit 5008947e32

View file

@ -410,18 +410,21 @@ sqlite_table_copy_t(SchemaInfo, Table) ->
NewTableName = <<"new_", TableName/binary>>, NewTableName = <<"new_", TableName/binary>>,
NewTable = Table#sql_table{name = NewTableName}, NewTable = Table#sql_table{name = NewTableName},
create_table_t(SchemaInfo, NewTable), create_table_t(SchemaInfo, NewTable),
SQL2 = <<"INSERT INTO ", NewTableName/binary, Columns = lists:join(<<",">>,
" SELECT * FROM ", TableName/binary>>, 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", ?INFO_MSG("Copying table ~s to ~s:~n~s~n",
[TableName, NewTableName, SQL2]), [TableName, NewTableName, SQL2]),
ejabberd_sql:sql_query_t(SQL2), ejabberd_sql:sql_query_t(SQL2),
SQL3 = <<"DROP TABLE ", TableName/binary>>, SQL3 = <<"DROP TABLE ", TableName/binary>>,
?INFO_MSG("Droping old table ~s:~n~s~n", ?INFO_MSG("Droping old table ~s:~n~s~n",
[TableName, SQL2]), [TableName, SQL3]),
ejabberd_sql:sql_query_t(SQL3), ejabberd_sql:sql_query_t(SQL3),
SQL4 = <<"ALTER TABLE ", NewTableName/binary, SQL4 = <<"ALTER TABLE ", NewTableName/binary,
" RENAME TO ", TableName/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]), [NewTableName, TableName, SQL4]),
ejabberd_sql:sql_query_t(SQL4). ejabberd_sql:sql_query_t(SQL4).