summaryrefslogtreecommitdiff
path: root/sql/field.h
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2017-10-30 09:24:39 +0400
committerAlexander Barkov <bar@mariadb.org>2017-10-30 09:24:39 +0400
commit667e4b97aa2fe6fbd5aabcf8510f2eaaa255b1eb (patch)
tree716f415fe88ced08148dcd3d39e29b6167f73aa3 /sql/field.h
parent5dd5253f7e50c21fa758e2eb58f3aa9c9754e733 (diff)
downloadmariadb-git-667e4b97aa2fe6fbd5aabcf8510f2eaaa255b1eb.tar.gz
MDEV-14212 Add Field_row for SP ROW variables
Diffstat (limited to 'sql/field.h')
-rw-r--r--sql/field.h32
1 files changed, 27 insertions, 5 deletions
diff --git a/sql/field.h b/sql/field.h
index 5999f3e0a34..3147374d496 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -44,6 +44,7 @@ class Column_statistics_collected;
class Item_func;
class Item_bool_func;
class Item_equal;
+class Virtual_tmp_table;
enum enum_check_fields
{
@@ -1510,6 +1511,11 @@ public:
/* Mark field in read map. Updates also virtual fields */
void register_field_in_read_map();
+ virtual Virtual_tmp_table **virtual_tmp_table_addr()
+ {
+ return NULL;
+ }
+
friend int cre_myisam(char * name, register TABLE *form, uint options,
ulonglong auto_increment_value);
friend class Copy_field;
@@ -3814,6 +3820,19 @@ public:
};
+class Field_row: public Field_null
+{
+ class Virtual_tmp_table *m_table;
+public:
+ Field_row(uchar *ptr_arg, const LEX_CSTRING *field_name_arg)
+ :Field_null(ptr_arg, 0, Field::NONE, field_name_arg, &my_charset_bin),
+ m_table(NULL)
+ {}
+ ~Field_row();
+ Virtual_tmp_table **virtual_tmp_table_addr() { return &m_table; }
+};
+
+
extern const LEX_CSTRING null_clex_str;
Field *make_field(TABLE_SHARE *share, MEM_ROOT *mem_root,
@@ -4164,9 +4183,7 @@ public:
{ }
const Type_handler *type_handler() const
{
- return is_row() || is_table_rowtype_ref() || is_cursor_rowtype_ref() ?
- &type_handler_row :
- Type_handler_hybrid_field_type::type_handler();
+ return Type_handler_hybrid_field_type::type_handler();
}
bool is_column_type_ref() const { return m_column_type_ref != 0; }
bool is_table_rowtype_ref() const { return m_table_rowtype_ref != 0; }
@@ -4186,6 +4203,8 @@ public:
}
void set_table_rowtype_ref(class Table_ident *ref)
{
+ DBUG_ASSERT(ref);
+ set_handler(&type_handler_row);
m_table_rowtype_ref= ref;
}
@@ -4193,9 +4212,10 @@ public:
{
return m_cursor_rowtype_offset;
}
- void set_cursor_rowtype_ref(bool ref, uint offset)
+ void set_cursor_rowtype_ref(uint offset)
{
- m_cursor_rowtype_ref= ref;
+ set_handler(&type_handler_row);
+ m_cursor_rowtype_ref= true;
m_cursor_rowtype_offset= offset;
}
@@ -4224,6 +4244,8 @@ public:
}
void set_row_field_definitions(Row_definition_list *list)
{
+ DBUG_ASSERT(list);
+ set_handler(&type_handler_row);
m_row_field_definitions= list;
}