db.mysql: fix invalid memory access in exec_one for returned rows with NULL fields (#21317)

This commit is contained in:
Roman 2024-04-20 16:52:58 +07:00 committed by GitHub
parent e235641c29
commit 2192d9b1e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 10 deletions

View File

@ -323,7 +323,7 @@ pub fn (db &DB) exec_one(query string) !Row {
mut row := Row{}
for i in 0 .. num_cols {
if unsafe { row_vals == &u8(0) } {
if unsafe { row_vals == &u8(0) } || unsafe { row_vals[i] == nil } {
row.vals << ''
} else {
row.vals << mystring(unsafe { &u8(row_vals[i]) })

View File

@ -16,7 +16,8 @@ fn test_mysql() {
response = db.exec('create table if not exists users (
id INT PRIMARY KEY AUTO_INCREMENT,
username TEXT
username TEXT,
last_name TEXT NULL DEFAULT NULL
)')!
assert response == []mysql.Row{}
@ -48,36 +49,36 @@ fn test_mysql() {
'jackson',
])!
assert response[0] == mysql.Row{
vals: ['1', 'jackson']
vals: ['1', 'jackson', '']
}
response = db.exec_param_many('select * from users where username = ? and id = ?',
['bailey', '3'])!
assert response[0] == mysql.Row{
vals: ['3', 'bailey']
vals: ['3', 'bailey', '']
}
response = db.exec_param_many('select * from users', [''])!
assert response == [
mysql.Row{
vals: ['1', 'jackson']
vals: ['1', 'jackson', '']
},
mysql.Row{
vals: ['2', 'shannon']
vals: ['2', 'shannon', '']
},
mysql.Row{
vals: ['3', 'bailey']
vals: ['3', 'bailey', '']
},
mysql.Row{
vals: ['4', 'blaze']
vals: ['4', 'blaze', '']
},
mysql.Row{
vals: ['5', 'Hi']
vals: ['5', 'Hi', '']
},
]
response = db.exec_param('select * from users where username = ?', 'blaze')!
assert response[0] == mysql.Row{
vals: ['4', 'blaze']
vals: ['4', 'blaze', '']
}
}