@ -25,117 +25,120 @@
# include "mysql.h"
int main ( int argc , char * * argv ) {
CommandLine cl ;
plan( 12 ) ;
if ( cl . getEnv ( ) )
CommandLine cl ;
if ( cl . getEnv ( ) ) {
diag ( " Failed to get the required environmental variables. " ) ;
return exit_status ( ) ;
plan ( 12 ) ;
}
MYSQL * admin = mysql_init ( NULL ) ;
ok ( admin ! = NULL , " mysql_init() succeeded " ) ;
if ( ! admin ) {
fail ( " mysql_init() failed " ) ;
return exit_status ( ) ;
}
// Connect to ProxySQL Admin using command line arguments
if ( ! mysql_real_connect ( admin , cl . host , cl . admin_username , cl . admin_password , NULL , cl . admin_port , NULL , 0 ) ) {
fail ( " Failed to connect to ProxySQL Admin: %s " , mysql_error ( admin ) ) ;
diag ( " Failed to connect to ProxySQL Admin: %s " , mysql_error ( admin ) ) ;
mysql_close ( admin ) ;
return exit_status ( ) ;
}
pass( " Connected to ProxySQL Admin " ) ;
ok( true , " Connected to ProxySQL Admin " ) ;
// Test 1: Run a DML query that affects rows
if ( mysql_query ( admin , " INSERT INTO mysql_replication_hostgroups (hostgroup_id, hostname, port) VALUES (1000, 'test.example.com', 3306) " ) ) {
fail ( " Failed to execute INSERT query: %s " , mysql_error ( admin ) ) ;
diag ( " Failed to execute INSERT query: %s " , mysql_error ( admin ) ) ;
mysql_close ( admin ) ;
return exit_status ( ) ;
}
my_ulonglong affected_rows = mysql_affected_rows ( admin ) ;
ok ( affected_rows = = 1 , " INSERT query returns 1 affected row: %llu " , affected_rows ) ;
pass ( " INSERT query executed successfully " ) ;
diag ( " INSERT query executed successfully " ) ;
// Test 2: Run another DML query
if ( mysql_query ( admin , " INSERT INTO mysql_replication_hostgroups (hostgroup_id, hostname, port) VALUES (1001, 'test2.example.com', 3306) " ) ) {
fail ( " Failed to execute second INSERT query: %s " , mysql_error ( admin ) ) ;
diag ( " Failed to execute second INSERT query: %s " , mysql_error ( admin ) ) ;
mysql_close ( admin ) ;
return exit_status ( ) ;
}
affected_rows = mysql_affected_rows ( admin ) ;
ok ( affected_rows = = 1 , " Second INSERT query returns 1 affected row: %llu " , affected_rows ) ;
pass ( " Second INSERT query executed successfully " ) ;
diag ( " Second INSERT query executed successfully " ) ;
// Test 3: Now execute a DDL query - this should reset affected_rows to 0 (this was the bug)
if ( mysql_query ( admin , " CREATE TABLE test_table_4855 (id INT PRIMARY KEY, name VARCHAR(255)) " ) ) {
fail ( " Failed to execute CREATE TABLE query: %s " , mysql_error ( admin ) ) ;
diag ( " Failed to execute CREATE TABLE query: %s " , mysql_error ( admin ) ) ;
mysql_close ( admin ) ;
return exit_status ( ) ;
}
affected_rows = mysql_affected_rows ( admin ) ;
ok ( affected_rows = = 0 , " CREATE TABLE returns 0 affected rows (bug fix verified): %llu " , affected_rows ) ;
pass ( " CREATE TABLE query executed successfully " ) ;
diag ( " CREATE TABLE query executed successfully " ) ;
// Test 4: Run DROP TABLE
if ( mysql_query ( admin , " DROP TABLE test_table_4855 " ) ) {
fail ( " Failed to execute DROP TABLE query: %s " , mysql_error ( admin ) ) ;
diag ( " Failed to execute DROP TABLE query: %s " , mysql_error ( admin ) ) ;
mysql_close ( admin ) ;
return exit_status ( ) ;
}
affected_rows = mysql_affected_rows ( admin ) ;
ok ( affected_rows = = 0 , " DROP TABLE returns 0 affected rows: %llu " , affected_rows ) ;
pass ( " DROP TABLE query executed successfully " ) ;
diag ( " DROP TABLE query executed successfully " ) ;
// Test 5: Verify DML still works correctly after DDL
if ( mysql_query ( admin , " UPDATE mysql_replication_hostgroups SET port = 3307 WHERE hostgroup_id = 1000 " ) ) {
fail ( " Failed to execute UPDATE query: %s " , mysql_error ( admin ) ) ;
diag ( " Failed to execute UPDATE query: %s " , mysql_error ( admin ) ) ;
mysql_close ( admin ) ;
return exit_status ( ) ;
}
affected_rows = mysql_affected_rows ( admin ) ;
ok ( affected_rows = = 1 , " UPDATE query after DDL returns 1 affected row: %llu " , affected_rows ) ;
pass ( " UPDATE query executed successfully " ) ;
diag ( " UPDATE query executed successfully " ) ;
// Test 6: Run a different DML query
if ( mysql_query ( admin , " DELETE FROM mysql_replication_hostgroups WHERE hostgroup_id IN (1000, 1001) " ) ) {
fail ( " Failed to execute DELETE query: %s " , mysql_error ( admin ) ) ;
diag ( " Failed to execute DELETE query: %s " , mysql_error ( admin ) ) ;
mysql_close ( admin ) ;
return exit_status ( ) ;
}
affected_rows = mysql_affected_rows ( admin ) ;
ok ( affected_rows = = 2 , " DELETE query returns 2 affected rows: %llu " , affected_rows ) ;
pass ( " DELETE query executed successfully " ) ;
diag ( " DELETE query executed successfully " ) ;
// Test 7: Run another DDL to verify the fix again
if ( mysql_query ( admin , " TRUNCATE TABLE stats_memory_metrics " ) ) {
// TRUNCATE might fail if table doesn't exist, but we test affected rows anyway
diag ( " TRUNCATE TABLE query executed (may fail if table doesn't exist) " ) ;
ok ( true , " TRUNCATE TABLE query attempted " ) ;
} else {
affected_rows = mysql_affected_rows ( admin ) ;
ok ( affected_rows = = 0 , " TRUNCATE TABLE returns 0 affected rows: %llu " , affected_rows ) ;
pass ( " TRUNCATE TABLE query executed successfully " ) ;
diag ( " TRUNCATE TABLE query executed successfully " ) ;
}
// Test 8: Run a VACUUM command on sqlite server
MYSQL * sqlite_mysql = mysql_init ( NULL ) ;
ok ( sqlite_mysql ! = NULL , " Failed to initialize SQLite connection " ) ;
if ( ! sqlite_mysql ) {
fail ( " Failed to initialize SQLite connection " ) ;
mysql_close ( admin ) ;
return exit_status ( ) ;
}
if ( ! mysql_real_connect ( sqlite_mysql , cl . host , cl . username , cl . password , NULL , cl . port , NULL , 0 ) ) {
fail ( " Failed to connect to SQLite3 Server: %s " , mysql_error ( sqlite_mysql ) ) ;
diag ( " Failed to connect to SQLite3 Server: %s " , mysql_error ( sqlite_mysql ) ) ;
mysql_close ( admin ) ;
mysql_close ( sqlite_mysql ) ;
return exit_status ( ) ;
}
ok ( true , " Connected to SQLite3 Server " ) ;
// Insert some data first
mysql_query ( sqlite_mysql , " CREATE TABLE IF NOT EXISTS test_vacuum_4855 (id INTEGER PRIMARY KEY, name TEXT) " ) ;
@ -147,7 +150,7 @@ int main(int argc, char** argv) {
// Now run VACUUM - this should return 0 affected rows
if ( mysql_query ( sqlite_mysql , " VACUUM " ) ) {
fail ( " Failed to execute VACUUM query: %s " , mysql_error ( sqlite_mysql ) ) ;
diag ( " Failed to execute VACUUM query: %s " , mysql_error ( sqlite_mysql ) ) ;
mysql_close ( admin ) ;
mysql_close ( sqlite_mysql ) ;
return exit_status ( ) ;
@ -155,7 +158,7 @@ int main(int argc, char** argv) {
affected_rows = mysql_affected_rows ( sqlite_mysql ) ;
ok ( affected_rows = = 0 , " VACUUM returns 0 affected rows (bug fix verified): %llu " , affected_rows ) ;
pass ( " VACUUM query executed successfully " ) ;
diag ( " VACUUM query executed successfully " ) ;
mysql_close ( sqlite_mysql ) ;
mysql_close ( admin ) ;