MySQL 8.0.31
Source Code Documentation
item_row.h
Go to the documentation of this file.
1#ifndef ITEM_ROW_INCLUDED
2#define ITEM_ROW_INCLUDED
3
4/* Copyright (c) 2002, 2022, Oracle and/or its affiliates.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License, version 2.0,
8 as published by the Free Software Foundation.
9
10 This program is also distributed with certain software (including
11 but not limited to OpenSSL) that is licensed under separate terms,
12 as designated in a particular file or component or in included license
13 documentation. The authors of MySQL hereby grant you an additional
14 permission to link the program and your derivative works with the
15 separately licensed software that they have included with MySQL.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License, version 2.0, for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
25
26#include <sys/types.h>
27
28#include "my_compiler.h"
29#include "my_inttypes.h"
30#include "my_table_map.h"
31#include "my_time.h"
33#include "mysql_time.h"
34#include "sql/enum_query_type.h"
35#include "sql/item.h" // Item
36#include "sql/parse_location.h" // POS
37#include "sql/sql_const.h" // Item_processor
38
39struct Parse_context;
40
41class Query_block;
42class Send_field;
43class String;
44class THD;
45class my_decimal;
46template <class T>
47class List;
48
49/**
50 Item which stores (x,y,...) and ROW(x,y,...).
51 Note that this can be recursive: ((x,y),(z,t)) is a ROW of ROWs.
52*/
53class Item_row : public Item {
54 typedef Item super;
55
59 /**
60 If elements are made only of constants, of which one or more are
61 NULL. For example, this item is (1,2,NULL), or ( (1,NULL), (2,3) ).
62 */
64
65 public:
66 /**
67 Row items used for comparing rows and IN operations on rows:
68
69 @param pos current parse context
70 @param head first column in the row
71 @param tail rest of columns in the row
72
73 @verbatim
74 (a, b, c) > (10, 10, 30)
75 (a, b, c) = (select c, d, e, from t1 where x=12)
76 (a, b, c) IN ((1,2,2), (3,4,5), (6,7,8)
77 (a, b, c) IN (select c, d, e, from t1)
78 @endverbatim
79
80 @todo
81 think placing 2-3 component items in item (as it done for function
82 */
83 Item_row(const POS &pos, Item *head, const mem_root_deque<Item *> &tail);
84 Item_row(Item *head, const mem_root_deque<Item *> &tail);
86 : Item(),
87 items(item->items),
90 arg_count(item->arg_count),
91 with_null(false) {
92 /*
93 The convention for data_type() of this class is that it starts as
94 MYSQL_TYPE_INVALID and ends as MYSQL_TYPE_NULL when resolving is complete.
95 This is just used as an indicator of resolver progress. A row object does
96 not have a data type by itself.
97 */
99 }
100 bool itemize(Parse_context *pc, Item **res) override;
101
102 enum Type type() const override { return ROW_ITEM; }
103 void illegal_method_call(const char *) const MY_ATTRIBUTE((cold));
104 bool is_null() override { return null_value; }
105 void make_field(Send_field *) override { illegal_method_call("make_field"); }
106 double val_real() override {
107 illegal_method_call("val_real");
108 return 0;
109 }
110 longlong val_int() override {
111 illegal_method_call("val_int");
112 return 0;
113 }
114 String *val_str(String *) override {
115 illegal_method_call("val_str");
116 return nullptr;
117 }
119 illegal_method_call("val_decimal");
120 return nullptr;
121 }
123 illegal_method_call("get_date");
124 return true;
125 }
126 bool get_time(MYSQL_TIME *) override {
127 illegal_method_call("get_time");
128 return true;
129 }
130
131 bool fix_fields(THD *thd, Item **ref) override;
132 void fix_after_pullout(Query_block *parent_query_block,
133 Query_block *removed_query_block) override;
134 bool propagate_type(THD *thd, const Type_properties &type) override;
135 void cleanup() override;
136 void split_sum_func(THD *thd, Ref_item_array ref_item_array,
137 mem_root_deque<Item *> *fields) override;
138 table_map used_tables() const override { return used_tables_cache; }
139 enum Item_result result_type() const override { return ROW_RESULT; }
140 void update_used_tables() override;
142 void print(const THD *thd, String *str,
143 enum_query_type query_type) const override;
144
145 bool walk(Item_processor processor, enum_walk walk, uchar *arg) override;
146 Item *transform(Item_transformer transformer, uchar *arg) override;
147
148 uint cols() const override { return arg_count; }
149 Item *element_index(uint i) override { return items[i]; }
150 Item **addr(uint i) override { return items + i; }
151 bool check_cols(uint c) override;
152 bool null_inside() override { return with_null; }
153 void bring_value() override;
154 bool check_function_as_value_generator(uchar *) override { return false; }
155};
156
157#endif /* ITEM_ROW_INCLUDED */
Item which stores (x,y,...) and ROW(x,y,...).
Definition: item_row.h:53
void illegal_method_call(const char *) const
Definition: item_row.cc:86
void update_used_tables() override
Updates used tables, not null tables information and accumulates properties up the item tree,...
Definition: item_row.cc:139
void bring_value() override
Definition: item_row.cc:208
Item_row(const POS &pos, Item *head, const mem_root_deque< Item * > &tail)
Row items used for comparing rows and IN operations on rows:
Definition: item_row.cc:39
bool is_null() override
The method allows to determine nullness of a complex expression without fully evaluating it,...
Definition: item_row.h:104
bool itemize(Parse_context *pc, Item **res) override
The same as contextualize() but with additional parameter.
Definition: item_row.cc:77
enum Type type() const override
Definition: item_row.h:102
longlong val_int() override
Definition: item_row.h:110
Item_row(Item_row *item)
Definition: item_row.h:85
Item * transform(Item_transformer transformer, uchar *arg) override
Perform a generic transformation of the Item tree, by adding zero or more additional Item objects to ...
Definition: item_row.cc:200
table_map used_tables_cache
Definition: item_row.h:57
void fix_after_pullout(Query_block *parent_query_block, Query_block *removed_query_block) override
Fix after tables have been moved from one query_block level to the parent level, e....
Definition: item_row.cc:151
uint cols() const override
Definition: item_row.h:148
void split_sum_func(THD *thd, Ref_item_array ref_item_array, mem_root_deque< Item * > *fields) override
Definition: item_row.cc:132
enum Item_result result_type() const override
Definition: item_row.h:139
Item ** items
Definition: item_row.h:56
table_map used_tables() const override
Definition: item_row.h:138
bool get_time(MYSQL_TIME *) override
Definition: item_row.h:126
bool fix_fields(THD *thd, Item **ref) override
Definition: item_row.cc:93
double val_real() override
Definition: item_row.h:106
my_decimal * val_decimal(my_decimal *) override
Definition: item_row.h:118
bool walk(Item_processor processor, enum_walk walk, uchar *arg) override
Traverses a tree of Items in prefix and/or postfix order.
Definition: item_row.cc:191
bool propagate_type(THD *thd, const Type_properties &type) override
Propagate data type specifications into parameters and user variables.
Definition: item_row.cc:162
bool with_null
If elements are made only of constants, of which one or more are NULL.
Definition: item_row.h:63
bool check_cols(uint c) override
Definition: item_row.cc:173
bool check_function_as_value_generator(uchar *) override
Check if this item is allowed for a virtual column or inside a default expression.
Definition: item_row.h:154
void print(const THD *thd, String *str, enum_query_type query_type) const override
This method is used for to:
Definition: item_row.cc:181
table_map not_null_tables_cache
Definition: item_row.h:57
Item ** addr(uint i) override
Definition: item_row.h:150
void make_field(Send_field *) override
Definition: item_row.h:105
bool get_date(MYSQL_TIME *, my_time_flags_t) override
Definition: item_row.h:122
table_map not_null_tables() const override
Return table map of tables that can't be NULL tables (tables that are used in a context where if they...
Definition: item_row.h:141
String * val_str(String *) override
Definition: item_row.h:114
void cleanup() override
Called for every Item after use (preparation and execution).
Definition: item_row.cc:126
Item super
Definition: item_row.h:54
bool null_inside() override
Definition: item_row.h:152
Item * element_index(uint i) override
Definition: item_row.h:149
uint arg_count
Definition: item_row.h:58
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:802
void set_data_type(enum_field_types data_type)
Set the data type of the current Item.
Definition: item.h:1329
bool null_value
True if item is null.
Definition: item.h:3359
Type
Definition: item.h:838
@ ROW_ITEM
Definition: item.h:858
Definition: sql_list.h:433
This class represents a query block, aka a query specification, which is a query consisting of a SELE...
Definition: sql_lex.h:1159
Definition: field.h:4555
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:166
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_class.h:922
Type properties, used to collect type information for later assignment to an Item object.
Definition: item.h:624
A (partial) implementation of std::deque allocating its blocks on a MEM_ROOT.
Definition: mem_root_deque.h:109
my_decimal class limits 'decimal_t' type to what we need in MySQL.
Definition: my_decimal.h:93
char * pos
Definition: do_ctype.cc:76
enum_query_type
Query type constants (usable as bitmap flags).
Definition: enum_query_type.h:30
@ MYSQL_TYPE_INVALID
Definition: field_types.h:74
Item *(Item::* Item_transformer)(uchar *arg)
Type for transformers used by Item::transform and Item::compile.
Definition: item.h:719
Header for compiler-dependent features.
Some integer typedefs for easier portability.
unsigned char uchar
Definition: my_inttypes.h:51
long long int longlong
Definition: my_inttypes.h:54
uint64_t table_map
Definition: my_table_map.h:29
Interface for low level time utilities.
unsigned int my_time_flags_t
Flags to str_to_datetime and number_to_datetime.
Definition: my_time.h:93
Time declarations shared between the server and client API: you should not add anything to this heade...
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1063
PT & ref(PT *tp)
Definition: tablespace_impl.cc:358
File containing constants that can be used throughout the server.
enum_walk
Enumeration for {Item,Query_block[_UNIT],Table_function}walk.
Definition: sql_const.h:286
bool(Item::*)(unsigned char *) Item_processor
Processor type for {Item,Query_block[_UNIT],Table_function}walk.
Definition: sql_const.h:304
Definition: mysql_time.h:81
Environment data for the contextualization phase.
Definition: parse_tree_node_base.h:120
Bison "location" class.
Definition: parse_location.h:42
unsigned int uint
Definition: uca-dump.cc:29
Item_result
Type of the user defined function return slot and arguments.
Definition: udf_registration_types.h:38
@ ROW_RESULT
long long
Definition: udf_registration_types.h:43