summaryrefslogtreecommitdiff
path: root/libmysql
diff options
context:
space:
mode:
authorvenu@myvenu.com <>2003-01-30 14:33:49 -0800
committervenu@myvenu.com <>2003-01-30 14:33:49 -0800
commit87206f104ac34eda5ce841f02f2b9822075cbe58 (patch)
treec52676f50266ebcedc4b4c5a6e10c1c47e4f35c1 /libmysql
parent81c580af37b85ea0142668dd1d679f025204de9b (diff)
downloadmariadb-git-87206f104ac34eda5ce841f02f2b9822075cbe58.tar.gz
Fix alloc_stmt_fields for non-select statements
Add tests for show commands + MYSQL_TYPE_NULL coverage
Diffstat (limited to 'libmysql')
-rw-r--r--libmysql/libmysql.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 08011c376fb..376f21a8a78 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -3932,19 +3932,40 @@ mysql_prepare(MYSQL *mysql, const char *query, ulong length)
unsigned int alloc_stmt_fields(MYSQL_STMT *stmt)
{
- MYSQL_FIELD *fields;
+ MYSQL_FIELD *fields, *field, *end;
+ MEM_ROOT *alloc= &stmt->mem_root;
if (!stmt->mysql->field_count)
return 0;
+
stmt->field_count= stmt->mysql->field_count;
- fields= stmt->mysql->fields;
- if (!(stmt->fields= (MYSQL_FIELD *) alloc_root(&stmt->mem_root,
- sizeof(fields))) ||
- !(stmt->bind= (MYSQL_BIND *) alloc_root(&stmt->mem_root,
+ /*
+ Get the field information for non-select statements
+ like SHOW and DESCRIBE commands
+ */
+ if (!(stmt->fields= (MYSQL_FIELD *) alloc_root(alloc,
+ sizeof(MYSQL_FIELD) * stmt->field_count)) ||
+ !(stmt->bind= (MYSQL_BIND *) alloc_root(alloc,
sizeof(MYSQL_BIND ) * stmt->field_count)))
return 0;
- memcpy((char *)stmt->fields, (char *)fields, sizeof(fields));
+
+ for (fields= stmt->mysql->fields, end= fields+stmt->field_count,
+ field= stmt->fields;
+ field && fields < end; fields++, field++)
+ {
+ field->db = strdup_root(alloc,fields->db);
+ field->table = strdup_root(alloc,fields->table);
+ field->org_table= strdup_root(alloc,fields->org_table);
+ field->name = strdup_root(alloc,fields->name);
+ field->org_name = strdup_root(alloc,fields->org_name);
+ field->length = fields->length;
+ field->type = fields->type;
+ field->flags = fields->flags;
+ field->decimals = fields->decimals;
+ field->def = fields->def ? strdup_root(alloc,fields->def): 0;
+ field->max_length= 0;
+ }
return stmt->field_count;
}