1 /* Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.
2 
3    This program is free software; you can redistribute it and/or modify
4    it under the terms of the GNU General Public License, version 2.0,
5    as published by the Free Software Foundation.
6 
7    This program is also distributed with certain software (including
8    but not limited to OpenSSL) that is licensed under separate terms,
9    as designated in a particular file or component or in included license
10    documentation.  The authors of MySQL hereby grant you an additional
11    permission to link the program and your derivative works with the
12    separately licensed software that they have included with MySQL.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License, version 2.0, for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA */
22 
23 #ifndef DD__COLUMN_INCLUDED
24 #define DD__COLUMN_INCLUDED
25 
26 #include "lex_string.h"  // LEX_CSTRING
27 #include "my_inttypes.h"
28 #include "nullable.h"
29 #include "sql/dd/collection.h"           // dd::Collection
30 #include "sql/dd/sdi_fwd.h"              // RJ_Document
31 #include "sql/dd/types/entity_object.h"  // dd::Entity_object
32 
33 #include "sql/gis/srid.h"
34 
35 using Mysql::Nullable;
36 
37 namespace dd {
38 
39 ///////////////////////////////////////////////////////////////////////////
40 
41 class Abstract_table;
42 class Column_impl;
43 class Column_type_element;
44 class Properties;
45 
46 namespace tables {
47 class Columns;
48 }
49 
50 ///////////////////////////////////////////////////////////////////////////
51 
52 // Redefined enum_field_types here. We can remove some old types ?
53 enum class enum_column_types {
54   DECIMAL = 1,  // This is 1 > than MYSQL_TYPE_DECIMAL
55   TINY,
56   SHORT,
57   LONG,
58   FLOAT,
59   DOUBLE,
60   TYPE_NULL,
61   TIMESTAMP,
62   LONGLONG,
63   INT24,
64   DATE,
65   TIME,
66   DATETIME,
67   YEAR,
68   NEWDATE,
69   VARCHAR,
70   BIT,
71   TIMESTAMP2,
72   DATETIME2,
73   TIME2,
74   NEWDECIMAL,
75   ENUM,
76   SET,
77   TINY_BLOB,
78   MEDIUM_BLOB,
79   LONG_BLOB,
80   BLOB,
81   VAR_STRING,
82   STRING,
83   GEOMETRY,
84   JSON
85 };
86 
87 class Column : virtual public Entity_object {
88  public:
89   typedef Collection<Column_type_element *> Column_type_element_collection;
90   typedef Column_impl Impl;
91   typedef tables::Columns DD_table;
92 
93   enum enum_column_key { CK_NONE = 1, CK_PRIMARY, CK_UNIQUE, CK_MULTIPLE };
94 
95   enum class enum_hidden_type {
96     /// The column is visible (a normal column)
97     HT_VISIBLE = 1,
98     /// The column is completely invisible to the server
99     HT_HIDDEN_SE = 2,
100     /// The column is visible to the server, but hidden from the user.
101     /// This is used for i.e. implementing functional indexes.
102     HT_HIDDEN_SQL = 3
103   };
104 
~Column()105   virtual ~Column() {}
106 
107   /////////////////////////////////////////////////////////////////////////
108   // Table.
109   /////////////////////////////////////////////////////////////////////////
110 
111   virtual const Abstract_table &table() const = 0;
112 
113   virtual Abstract_table &table() = 0;
114 
115   /////////////////////////////////////////////////////////////////////////
116   // collation.
117   /////////////////////////////////////////////////////////////////////////
118 
119   virtual Object_id collation_id() const = 0;
120   virtual void set_collation_id(Object_id collation_id) = 0;
121 
122   virtual void set_is_explicit_collation(bool is_explicit_collation) = 0;
123   virtual bool is_explicit_collation() const = 0;
124 
125   /////////////////////////////////////////////////////////////////////////
126   // type.
127   /////////////////////////////////////////////////////////////////////////
128 
129   virtual enum_column_types type() const = 0;
130   virtual void set_type(enum_column_types type) = 0;
131 
132   /////////////////////////////////////////////////////////////////////////
133   // nullable.
134   /////////////////////////////////////////////////////////////////////////
135 
136   virtual bool is_nullable() const = 0;
137   virtual void set_nullable(bool nullable) = 0;
138 
139   /////////////////////////////////////////////////////////////////////////
140   // is_zerofill.
141   /////////////////////////////////////////////////////////////////////////
142 
143   virtual bool is_zerofill() const = 0;
144   virtual void set_zerofill(bool zerofill) = 0;
145 
146   /////////////////////////////////////////////////////////////////////////
147   // is_unsigned.
148   /////////////////////////////////////////////////////////////////////////
149 
150   virtual bool is_unsigned() const = 0;
151   virtual void set_unsigned(bool unsigned_flag) = 0;
152 
153   /////////////////////////////////////////////////////////////////////////
154   // auto increment.
155   /////////////////////////////////////////////////////////////////////////
156 
157   virtual bool is_auto_increment() const = 0;
158   virtual void set_auto_increment(bool auto_increment) = 0;
159 
160   /////////////////////////////////////////////////////////////////////////
161   // ordinal_position
162   /////////////////////////////////////////////////////////////////////////
163 
164   virtual uint ordinal_position() const = 0;
165 
166   /////////////////////////////////////////////////////////////////////////
167   // char_length.
168   /////////////////////////////////////////////////////////////////////////
169 
170   virtual size_t char_length() const = 0;
171   virtual void set_char_length(size_t char_length) = 0;
172 
173   /////////////////////////////////////////////////////////////////////////
174   // numeric_precision.
175   /////////////////////////////////////////////////////////////////////////
176 
177   virtual uint numeric_precision() const = 0;
178   virtual void set_numeric_precision(uint numeric_precision) = 0;
179 
180   /////////////////////////////////////////////////////////////////////////
181   // srid
182   /////////////////////////////////////////////////////////////////////////
183 
184   virtual void set_srs_id(Nullable<gis::srid_t> srs_id) = 0;
185   virtual Nullable<gis::srid_t> srs_id() const = 0;
186 
187   /////////////////////////////////////////////////////////////////////////
188   // numeric_scale.
189   /////////////////////////////////////////////////////////////////////////
190 
191   virtual uint numeric_scale() const = 0;
192   virtual void set_numeric_scale(uint numeric_scale) = 0;
193   virtual void set_numeric_scale_null(bool is_null) = 0;
194   virtual bool is_numeric_scale_null() const = 0;
195 
196   /////////////////////////////////////////////////////////////////////////
197   // datetime_precision.
198   /////////////////////////////////////////////////////////////////////////
199 
200   virtual uint datetime_precision() const = 0;
201   virtual void set_datetime_precision(uint datetime_precision) = 0;
202   virtual void set_datetime_precision_null(bool is_null) = 0;
203   virtual bool is_datetime_precision_null() const = 0;
204 
205   /////////////////////////////////////////////////////////////////////////
206   // has_no_default.
207   /////////////////////////////////////////////////////////////////////////
208 
209   virtual bool has_no_default() const = 0;
210   virtual void set_has_no_default(bool has_explicit_default) = 0;
211 
212   /////////////////////////////////////////////////////////////////////////
213   // default_value (binary).
214   /////////////////////////////////////////////////////////////////////////
215 
216   virtual const String_type &default_value() const = 0;
217   virtual void set_default_value(const String_type &default_value) = 0;
218   virtual void set_default_value_null(bool is_null) = 0;
219   virtual bool is_default_value_null() const = 0;
220 
221   /////////////////////////////////////////////////////////////////////////
222   // default_value_utf8
223   /////////////////////////////////////////////////////////////////////////
224 
225   virtual const String_type &default_value_utf8() const = 0;
226   virtual void set_default_value_utf8(
227       const String_type &default_value_utf8) = 0;
228   virtual void set_default_value_utf8_null(bool is_null) = 0;
229   virtual bool is_default_value_utf8_null() const = 0;
230 
231   /////////////////////////////////////////////////////////////////////////
232   // is virtual ?
233   /////////////////////////////////////////////////////////////////////////
234 
235   virtual bool is_virtual() const = 0;
236 
237   virtual void set_virtual(bool is_virtual) = 0;
238 
239   /////////////////////////////////////////////////////////////////////////
240   // generation_expression (binary).
241   /////////////////////////////////////////////////////////////////////////
242 
243   virtual const String_type &generation_expression() const = 0;
244 
245   virtual void set_generation_expression(
246       const String_type &generation_expression) = 0;
247 
248   virtual bool is_generation_expression_null() const = 0;
249 
250   /////////////////////////////////////////////////////////////////////////
251   // generation_expression_utf8
252   /////////////////////////////////////////////////////////////////////////
253 
254   virtual const String_type &generation_expression_utf8() const = 0;
255 
256   virtual void set_generation_expression_utf8(
257       const String_type &generation_expression_utf8) = 0;
258 
259   virtual bool is_generation_expression_utf8_null() const = 0;
260 
261   /////////////////////////////////////////////////////////////////////////
262   // default_option.
263   /////////////////////////////////////////////////////////////////////////
264 
265   virtual const String_type &default_option() const = 0;
266   virtual void set_default_option(const String_type &default_option) = 0;
267 
268   /////////////////////////////////////////////////////////////////////////
269   // update_option.
270   /////////////////////////////////////////////////////////////////////////
271 
272   virtual const String_type &update_option() const = 0;
273   virtual void set_update_option(const String_type &update_option) = 0;
274 
275   /////////////////////////////////////////////////////////////////////////
276   // Comment.
277   /////////////////////////////////////////////////////////////////////////
278 
279   virtual const String_type &comment() const = 0;
280   virtual void set_comment(const String_type &comment) = 0;
281 
282   /////////////////////////////////////////////////////////////////////////
283   // hidden.
284   /////////////////////////////////////////////////////////////////////////
285 
286   virtual enum_hidden_type hidden() const = 0;
287   virtual void set_hidden(enum_hidden_type hidden) = 0;
is_se_hidden()288   bool is_se_hidden() const {
289     return hidden() == enum_hidden_type::HT_HIDDEN_SE;
290   }
291 
292   /////////////////////////////////////////////////////////////////////////
293   // Options.
294   /////////////////////////////////////////////////////////////////////////
295 
296   virtual const Properties &options() const = 0;
297 
298   virtual Properties &options() = 0;
299   virtual bool set_options(const String_type &options_raw) = 0;
300 
301   /////////////////////////////////////////////////////////////////////////
302   // se_private_data.
303   /////////////////////////////////////////////////////////////////////////
304 
305   virtual const Properties &se_private_data() const = 0;
306 
307   virtual Properties &se_private_data() = 0;
308   virtual bool set_se_private_data(const Properties &se_private_data) = 0;
309   virtual bool set_se_private_data(const String_type &se_private_data_raw) = 0;
310 
311   /////////////////////////////////////////////////////////////////////////
312   // SE-specific json attributes
313   /////////////////////////////////////////////////////////////////////////
314 
315   virtual LEX_CSTRING engine_attribute() const = 0;
316   virtual void set_engine_attribute(LEX_CSTRING attrs) = 0;
317 
318   virtual LEX_CSTRING secondary_engine_attribute() const = 0;
319   virtual void set_secondary_engine_attribute(LEX_CSTRING attrs) = 0;
320 
321   /////////////////////////////////////////////////////////////////////////
322   // Column key type.
323   /////////////////////////////////////////////////////////////////////////
324 
325   virtual void set_column_key(enum_column_key column_key) = 0;
326 
327   virtual enum_column_key column_key() const = 0;
328 
329   /////////////////////////////////////////////////////////////////////////
330   // Column display type.
331   /////////////////////////////////////////////////////////////////////////
332 
333   virtual const String_type &column_type_utf8() const = 0;
334 
335   virtual void set_column_type_utf8(const String_type &column_type_utf8) = 0;
336 
337   /////////////////////////////////////////////////////////////////////////
338   // Elements.
339   /////////////////////////////////////////////////////////////////////////
340 
341   virtual Column_type_element *add_element() = 0;
342 
343   virtual const Column_type_element_collection &elements() const = 0;
344 
345   virtual size_t elements_count() const = 0;
346 
347   /**
348     Converts *this into json.
349 
350     Converts all member variables that are to be included in the sdi
351     into json by transforming them appropriately and passing them to
352     the rapidjson writer provided.
353 
354     @param wctx opaque context for data needed by serialization
355     @param w rapidjson writer which will perform conversion to json
356 
357   */
358 
359   virtual void serialize(Sdi_wcontext *wctx, Sdi_writer *w) const = 0;
360 
361   /**
362     Re-establishes the state of *this by reading sdi information from
363     the rapidjson DOM subobject provided.
364 
365     Cross-references encountered within this object are tracked in
366     sdictx, so that they can be updated when the entire object graph
367     has been established.
368 
369     @param rctx stores book-keeping information for the
370     deserialization process
371     @param val subobject of rapidjson DOM containing json
372     representation of this object
373   */
374 
375   virtual bool deserialize(Sdi_rcontext *rctx, const RJ_Value &val) = 0;
376 
377   virtual bool is_array() const = 0;
378 };
379 
380 ///////////////////////////////////////////////////////////////////////////
381 
382 }  // namespace dd
383 
384 #endif  // DD__COLUMN_INCLUDED
385