@@ -43,6 +43,46 @@ static int pdo_sqlite_stmt_dtor(pdo_stmt_t *stmt)
43
43
return 1 ;
44
44
}
45
45
46
+ /**
47
+ * Change the column count on the statement.
48
+ *
49
+ * Since PHP 7.2 sqlite3_prepare_v2 is used which auto recompile prepared statement on schema change.
50
+ * Instead of raise an error on schema change, the result set will change, and the statement's columns must be updated.
51
+ *
52
+ * See bug #78192
53
+ */
54
+ static void pdo_sqlite_stmt_set_column_count (pdo_stmt_t * stmt , int new_count )
55
+ {
56
+ /* Columns not yet "described" */
57
+ if (!stmt -> columns ) {
58
+ stmt -> column_count = new_count ;
59
+
60
+ return ;
61
+ }
62
+
63
+ /*
64
+ * The column count has not changed : no need to reload columns description
65
+ * Note: Do not handle attribute name change, without column count change
66
+ */
67
+ if (new_count == stmt -> column_count ) {
68
+ return ;
69
+ }
70
+
71
+ /* Free previous columns to force reload description */
72
+ int i ;
73
+
74
+ for (i = 0 ; i < stmt -> column_count ; i ++ ) {
75
+ if (stmt -> columns [i ].name ) {
76
+ zend_string_release (stmt -> columns [i ].name );
77
+ stmt -> columns [i ].name = NULL ;
78
+ }
79
+ }
80
+
81
+ efree (stmt -> columns );
82
+ stmt -> columns = NULL ;
83
+ stmt -> column_count = new_count ;
84
+ }
85
+
46
86
static int pdo_sqlite_stmt_execute (pdo_stmt_t * stmt )
47
87
{
48
88
pdo_sqlite_stmt * S = (pdo_sqlite_stmt * )stmt -> driver_data ;
@@ -55,11 +95,11 @@ static int pdo_sqlite_stmt_execute(pdo_stmt_t *stmt)
55
95
switch (sqlite3_step (S -> stmt )) {
56
96
case SQLITE_ROW :
57
97
S -> pre_fetched = 1 ;
58
- stmt -> column_count = sqlite3_data_count (S -> stmt );
98
+ pdo_sqlite_stmt_set_column_count ( stmt , sqlite3_data_count (S -> stmt ) );
59
99
return 1 ;
60
100
61
101
case SQLITE_DONE :
62
- stmt -> column_count = sqlite3_column_count (S -> stmt );
102
+ pdo_sqlite_stmt_set_column_count ( stmt , sqlite3_column_count (S -> stmt ) );
63
103
stmt -> row_count = sqlite3_changes (S -> H -> db );
64
104
sqlite3_reset (S -> stmt );
65
105
S -> done = 1 ;
0 commit comments