1+ /*
2+ Copyright (c) 2025 ProxySQL
3+
4+ This program is free software; you can redistribute it and/or modify
5+ it under the terms of the GNU General Public License as published by
6+ the Free Software Foundation; version 2 of the License.
7+
8+ This program is distributed in the hope that it will be useful,
9+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ GNU General Public License for more details.
12+
13+ You should have received a copy of the GNU General Public License
14+ along with this program; if not, write to the Free Software
15+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
16+
17+ #include < stdlib.h>
18+ #include < stdio.h>
19+ #include < string.h>
20+ #include < vector>
21+ #include < string>
22+ #include " tap.h"
23+ #include " command_line.h"
24+ #include " utils.h"
25+ #include " mysql.h"
26+
27+ int main (int argc, char ** argv) {
28+ plan (14 );
29+
30+ CommandLine cl;
31+ if (cl.getEnv ()) {
32+ diag (" Failed to get the required environmental variables." );
33+ return exit_status ();
34+ }
35+
36+ MYSQL *admin = mysql_init (NULL );
37+ ok (admin != NULL , " mysql_init() succeeded" );
38+ if (!admin) {
39+ return exit_status ();
40+ }
41+
42+ // Connect to ProxySQL Admin using command line arguments
43+ if (!mysql_real_connect (admin, cl.host , cl.admin_username , cl.admin_password , NULL , cl.admin_port , NULL , 0 )) {
44+ diag (" Failed to connect to ProxySQL Admin: %s" , mysql_error (admin));
45+ mysql_close (admin);
46+ return exit_status ();
47+ }
48+ ok (true , " Connected to ProxySQL Admin" );
49+
50+ // Clean up any existing test tables
51+ mysql_query (admin, " DROP TABLE IF EXISTS test_table_4855" );
52+ mysql_query (admin, " DROP TABLE IF EXISTS test_table_4855_2" );
53+
54+ // Test 1: Run a DDL query - should return 0 affected rows (this was the bug)
55+ if (mysql_query (admin, " CREATE TABLE test_table_4855 (id INT PRIMARY KEY, name VARCHAR(255))" )) {
56+ diag (" Failed to execute CREATE TABLE query: %s" , mysql_error (admin));
57+ mysql_close (admin);
58+ return exit_status ();
59+ }
60+
61+ my_ulonglong affected_rows = mysql_affected_rows (admin);
62+ ok (affected_rows == 0 , " CREATE TABLE returns 0 affected rows (bug fix verified): %llu" , affected_rows);
63+ diag (" CREATE TABLE query executed successfully" );
64+
65+ // Test 2: Run a DML query that affects rows
66+ if (mysql_query (admin, " INSERT INTO test_table_4855 (id, name) VALUES (1, 'test1')" )) {
67+ diag (" Failed to execute INSERT query: %s" , mysql_error (admin));
68+ mysql_close (admin);
69+ return exit_status ();
70+ }
71+
72+ affected_rows = mysql_affected_rows (admin);
73+ ok (affected_rows == 1 , " INSERT query returns 1 affected row: %llu" , affected_rows);
74+ diag (" INSERT query executed successfully" );
75+
76+ // Test 3: Run another DML query
77+ if (mysql_query (admin, " INSERT INTO test_table_4855 (id, name) VALUES (2, 'test2')" )) {
78+ diag (" Failed to execute second INSERT query: %s" , mysql_error (admin));
79+ mysql_close (admin);
80+ return exit_status ();
81+ }
82+
83+ affected_rows = mysql_affected_rows (admin);
84+ ok (affected_rows == 1 , " Second INSERT query returns 1 affected row: %llu" , affected_rows);
85+ diag (" Second INSERT query executed successfully" );
86+
87+ // Test 4: Run another DDL query - should return 0 affected rows
88+ if (mysql_query (admin, " CREATE TABLE test_table_4855_2 (id INT PRIMARY KEY, value TEXT)" )) {
89+ diag (" Failed to execute second CREATE TABLE query: %s" , mysql_error (admin));
90+ mysql_close (admin);
91+ return exit_status ();
92+ }
93+
94+ affected_rows = mysql_affected_rows (admin);
95+ ok (affected_rows == 0 , " Second CREATE TABLE returns 0 affected rows: %llu" , affected_rows);
96+ diag (" Second CREATE TABLE query executed successfully" );
97+
98+ // Test 5: Run an UPDATE query - should return correct affected rows
99+ if (mysql_query (admin, " UPDATE test_table_4855 SET name = 'updated' WHERE id = 1" )) {
100+ diag (" Failed to execute UPDATE query: %s" , mysql_error (admin));
101+ mysql_close (admin);
102+ return exit_status ();
103+ }
104+
105+ affected_rows = mysql_affected_rows (admin);
106+ ok (affected_rows == 1 , " UPDATE query returns 1 affected row: %llu" , affected_rows);
107+ diag (" UPDATE query executed successfully" );
108+
109+ // Test 6: Run a DELETE query - should return correct affected rows
110+ if (mysql_query (admin, " DELETE FROM test_table_4855 WHERE id IN (1, 2)" )) {
111+ diag (" Failed to execute DELETE query: %s" , mysql_error (admin));
112+ mysql_close (admin);
113+ return exit_status ();
114+ }
115+
116+ affected_rows = mysql_affected_rows (admin);
117+ ok (affected_rows == 2 , " DELETE query returns 2 affected rows: %llu" , affected_rows);
118+ diag (" DELETE query executed successfully" );
119+
120+ // Test 7: Run DROP TABLE - should return 0 affected rows
121+ if (mysql_query (admin, " DROP TABLE test_table_4855" )) {
122+ diag (" Failed to execute DROP TABLE query: %s" , mysql_error (admin));
123+ mysql_close (admin);
124+ return exit_status ();
125+ }
126+
127+ affected_rows = mysql_affected_rows (admin);
128+ ok (affected_rows == 0 , " DROP TABLE returns 0 affected rows: %llu" , affected_rows);
129+ diag (" DROP TABLE query executed successfully" );
130+
131+ // Test 8: Run another DDL to verify the fix again (ALTER TABLE)
132+ if (mysql_query (admin, " ALTER TABLE test_table_4855_2 ADD COLUMN extra INTEGER" )) {
133+ diag (" Failed to execute ALTER TABLE query: %s" , mysql_error (admin));
134+ mysql_close (admin);
135+ return exit_status ();
136+ }
137+
138+ affected_rows = mysql_affected_rows (admin);
139+ ok (affected_rows == 0 , " ALTER TABLE returns 0 affected rows: %llu" , affected_rows);
140+ diag (" ALTER TABLE query executed successfully" );
141+
142+ // Test 9: Test with comments followed by DDL (this was mentioned in the issue)
143+ if (mysql_query (admin, " /* This is a comment */ CREATE TABLE test_table_4855 (id INT PRIMARY KEY)" )) {
144+ diag (" Failed to execute CREATE TABLE with comment: %s" , mysql_error (admin));
145+ mysql_close (admin);
146+ return exit_status ();
147+ }
148+
149+ affected_rows = mysql_affected_rows (admin);
150+ ok (affected_rows == 0 , " CREATE TABLE with comment returns 0 affected rows: %llu" , affected_rows);
151+ diag (" CREATE TABLE with comment executed successfully" );
152+
153+ // Test 10: Insert data and run SELECT to verify normal operation
154+ if (mysql_query (admin, " INSERT INTO test_table_4855 (id) VALUES (1), (2), (3)" )) {
155+ diag (" Failed to execute INSERT with multiple values: %s" , mysql_error (admin));
156+ mysql_close (admin);
157+ return exit_status ();
158+ }
159+
160+ affected_rows = mysql_affected_rows (admin);
161+ ok (affected_rows == 3 , " INSERT with multiple values returns 3 affected rows: %llu" , affected_rows);
162+ diag (" INSERT with multiple values executed successfully" );
163+
164+ // Test 11: Run VACUUM - should return 0 affected rows
165+ if (mysql_query (admin, " VACUUM" )) {
166+ diag (" Failed to execute VACUUM query: %s" , mysql_error (admin));
167+ mysql_close (admin);
168+ return exit_status ();
169+ }
170+
171+ affected_rows = mysql_affected_rows (admin);
172+ ok (affected_rows == 0 , " VACUUM returns 0 affected rows: %llu" , affected_rows);
173+ diag (" VACUUM query executed successfully" );
174+
175+ // Test 12: Clean up - DROP remaining tables individually
176+ if (mysql_query (admin, " DROP TABLE IF EXISTS test_table_4855" )) {
177+ diag (" Failed to execute final DROP TABLE: %s" , mysql_error (admin));
178+ mysql_close (admin);
179+ return exit_status ();
180+ }
181+
182+ affected_rows = mysql_affected_rows (admin);
183+ ok (affected_rows == 0 , " Final DROP TABLE returns 0 affected rows: %llu" , affected_rows);
184+ diag (" Final DROP TABLE query executed successfully" );
185+
186+ // Additional cleanup without test assertion
187+ if (mysql_query (admin, " DROP TABLE IF EXISTS test_table_4855_2" )) {
188+ diag (" Failed to execute second DROP TABLE: %s" , mysql_error (admin));
189+ mysql_close (admin);
190+ return exit_status ();
191+ }
192+ diag (" Additional cleanup DROP TABLE executed" );
193+ mysql_close (admin);
194+ return exit_status ();
195+ }
0 commit comments