mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Patch for WL#2894: Make stored routine variables work
according to the standard. The idea is to use Field-classes to implement stored routines variables. Also, we should provide facade to Item-hierarchy by Item_field class (it is necessary, since SRVs take part in expressions). The patch fixes the following bugs: - BUG#8702: Stored Procedures: No Error/Warning shown for inappropriate data type matching; - BUG#8768: Functions: For any unsigned data type, -ve values can be passed and returned; - BUG#8769: Functions: For Int datatypes, out of range values can be passed and returned; - BUG#9078: STORED PROCDURE: Decimal digits are not displayed when we use DECIMAL datatype; - BUG#9572: Stored procedures: variable type declarations ignored; - BUG#12903: upper function does not work inside a function; - BUG#13705: parameters to stored procedures are not verified; - BUG#13808: ENUM type stored procedure parameter accepts non-enumerated data; - BUG#13909: Varchar Stored Procedure Parameter always BINARY string (ignores CHARACTER SET); - BUG#14161: Stored procedure cannot retrieve bigint unsigned; - BUG#14188: BINARY variables have no 0x00 padding; - BUG#15148: Stored procedure variables accept non-scalar values;
This commit is contained in:
@ -8911,6 +8911,7 @@ err:
|
||||
TABLE *create_virtual_tmp_table(THD *thd, List<create_field> &field_list)
|
||||
{
|
||||
uint field_count= field_list.elements;
|
||||
uint blob_count= 0;
|
||||
Field **field;
|
||||
create_field *cdef; /* column definition */
|
||||
uint record_length= 0;
|
||||
@ -8927,6 +8928,12 @@ TABLE *create_virtual_tmp_table(THD *thd, List<create_field> &field_list)
|
||||
table->s= s= &table->share_not_to_be_used;
|
||||
s->fields= field_count;
|
||||
|
||||
if (!(s->blob_field= (uint*)thd->alloc((field_list.elements + 1) *
|
||||
sizeof(uint))))
|
||||
return 0;
|
||||
|
||||
s->blob_ptr_size= mi_portable_sizeof_char_ptr;
|
||||
|
||||
/* Create all fields and calculate the total length of record */
|
||||
List_iterator_fast<create_field> it(field_list);
|
||||
while ((cdef= it++))
|
||||
@ -8942,9 +8949,15 @@ TABLE *create_virtual_tmp_table(THD *thd, List<create_field> &field_list)
|
||||
record_length+= (**field).pack_length();
|
||||
if (! ((**field).flags & NOT_NULL_FLAG))
|
||||
++null_count;
|
||||
|
||||
if ((*field)->flags & BLOB_FLAG)
|
||||
s->blob_field[blob_count++]= (uint) (field - table->field);
|
||||
|
||||
++field;
|
||||
}
|
||||
*field= NULL; /* mark the end of the list */
|
||||
s->blob_field[blob_count]= 0; /* mark the end of the list */
|
||||
s->blob_fields= blob_count;
|
||||
|
||||
null_pack_length= (null_count + 7)/8;
|
||||
s->reclength= record_length + null_pack_length;
|
||||
|
Reference in New Issue
Block a user