42
Rules for merging different types of fields in UNION
44
NOTE: to avoid 256*256 table, gap in table types numeration is skiped
45
following #defines describe that gap and how to canculate number of fields
46
and index of field in thia array.
48
#define FIELDTYPE_TEAR_FROM (DRIZZLE_TYPE_VARCHAR + 1)
49
#define FIELDTYPE_TEAR_TO (DRIZZLE_TYPE_NEWDECIMAL - 1)
50
#define FIELDTYPE_NUM (FIELDTYPE_TEAR_FROM + (255 - FIELDTYPE_TEAR_TO))
51
inline int field_type2index (enum_field_types field_type)
53
return (field_type < FIELDTYPE_TEAR_FROM ?
55
((int)FIELDTYPE_TEAR_FROM) + (field_type - FIELDTYPE_TEAR_TO) - 1);
59
static enum_field_types field_types_merge_rules [FIELDTYPE_NUM][FIELDTYPE_NUM]=
61
/* DRIZZLE_TYPE_DECIMAL -> */
63
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
64
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_NEWDECIMAL,
66
DRIZZLE_TYPE_NEWDECIMAL,
69
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
70
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
71
//DRIZZLE_TYPE_LONGLONG
72
DRIZZLE_TYPE_NEWDECIMAL,
75
//DRIZZLE_TYPE_DATETIME
77
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
78
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
79
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
80
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
60
static enum_field_types
61
field_types_merge_rules [DRIZZLE_TYPE_MAX+1][DRIZZLE_TYPE_MAX+1]=
84
63
/* DRIZZLE_TYPE_TINY -> */
86
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
87
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_TINY,
91
70
DRIZZLE_TYPE_DOUBLE,
92
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
93
DRIZZLE_TYPE_TINY, DRIZZLE_TYPE_VARCHAR,
94
//DRIZZLE_TYPE_LONGLONG
73
//DRIZZLE_TYPE_TIMESTAMP
75
//DRIZZLE_TYPE_LONGLONG
95
76
DRIZZLE_TYPE_LONGLONG,
98
//DRIZZLE_TYPE_DATETIME
100
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
101
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
102
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
103
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
77
//DRIZZLE_TYPE_DATETIME
81
//DRIZZLE_TYPE_VARCHAR
83
//DRIZZLE_TYPE_VIRTUAL
85
//DRIZZLE_TYPE_NEWDECIMAL
86
DRIZZLE_TYPE_NEWDECIMAL,
105
90
DRIZZLE_TYPE_BLOB,
107
92
/* DRIZZLE_TYPE_LONG -> */
109
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
110
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_LONG,
113
//DRIZZLE_TYPE_DOUBLE
114
99
DRIZZLE_TYPE_DOUBLE,
115
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
116
DRIZZLE_TYPE_LONG, DRIZZLE_TYPE_VARCHAR,
117
//DRIZZLE_TYPE_LONGLONG
102
//DRIZZLE_TYPE_TIMESTAMP
103
DRIZZLE_TYPE_VARCHAR,
104
//DRIZZLE_TYPE_LONGLONG
118
105
DRIZZLE_TYPE_LONGLONG,
120
DRIZZLE_TYPE_VARCHAR,
121
//DRIZZLE_TYPE_DATETIME
122
DRIZZLE_TYPE_VARCHAR,
123
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
124
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
125
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
126
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
106
//DRIZZLE_TYPE_DATETIME
107
DRIZZLE_TYPE_VARCHAR,
109
DRIZZLE_TYPE_VARCHAR,
110
//DRIZZLE_TYPE_VARCHAR
111
DRIZZLE_TYPE_VARCHAR,
112
//DRIZZLE_TYPE_VIRTUAL
113
DRIZZLE_TYPE_VIRTUAL,
114
//DRIZZLE_TYPE_NEWDECIMAL
115
DRIZZLE_TYPE_NEWDECIMAL,
117
DRIZZLE_TYPE_VARCHAR,
128
119
DRIZZLE_TYPE_BLOB,
130
121
/* DRIZZLE_TYPE_DOUBLE -> */
132
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
133
DRIZZLE_TYPE_DOUBLE, DRIZZLE_TYPE_DOUBLE,
136
//DRIZZLE_TYPE_DOUBLE
138
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
139
DRIZZLE_TYPE_DOUBLE, DRIZZLE_TYPE_VARCHAR,
140
//DRIZZLE_TYPE_LONGLONG
143
DRIZZLE_TYPE_VARCHAR,
144
//DRIZZLE_TYPE_DATETIME
145
DRIZZLE_TYPE_VARCHAR,
146
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
147
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
148
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
149
DRIZZLE_TYPE_DOUBLE, DRIZZLE_TYPE_VARCHAR,
127
//DRIZZLE_TYPE_DOUBLE
131
//DRIZZLE_TYPE_TIMESTAMP
132
DRIZZLE_TYPE_VARCHAR,
133
//DRIZZLE_TYPE_LONGLONG
135
//DRIZZLE_TYPE_DATETIME
136
DRIZZLE_TYPE_VARCHAR,
138
DRIZZLE_TYPE_VARCHAR,
139
//DRIZZLE_TYPE_VARCHAR
140
DRIZZLE_TYPE_VARCHAR,
141
//DRIZZLE_TYPE_VIRTUAL
142
DRIZZLE_TYPE_VIRTUAL,
143
//DRIZZLE_TYPE_NEWDECIMAL
146
DRIZZLE_TYPE_VARCHAR,
151
148
DRIZZLE_TYPE_BLOB,
153
150
/* DRIZZLE_TYPE_NULL -> */
155
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
156
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_TINY,
158
155
DRIZZLE_TYPE_LONG,
159
//DRIZZLE_TYPE_DOUBLE
156
//DRIZZLE_TYPE_DOUBLE
160
157
DRIZZLE_TYPE_DOUBLE,
161
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
162
DRIZZLE_TYPE_NULL, DRIZZLE_TYPE_TIMESTAMP,
163
//DRIZZLE_TYPE_LONGLONG
160
//DRIZZLE_TYPE_TIMESTAMP
161
DRIZZLE_TYPE_TIMESTAMP,
162
//DRIZZLE_TYPE_LONGLONG
164
163
DRIZZLE_TYPE_LONGLONG,
167
//DRIZZLE_TYPE_DATETIME
164
//DRIZZLE_TYPE_DATETIME
168
165
DRIZZLE_TYPE_DATETIME,
169
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
170
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
171
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
172
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_ENUM,
168
//DRIZZLE_TYPE_VARCHAR
169
DRIZZLE_TYPE_VARCHAR,
170
//DRIZZLE_TYPE_VIRTUAL
171
DRIZZLE_TYPE_VIRTUAL,
172
//DRIZZLE_TYPE_NEWDECIMAL
173
DRIZZLE_TYPE_NEWDECIMAL,
174
177
DRIZZLE_TYPE_BLOB,
176
179
/* DRIZZLE_TYPE_TIMESTAMP -> */
178
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
179
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
181
DRIZZLE_TYPE_VARCHAR,
182
//DRIZZLE_TYPE_DOUBLE
183
DRIZZLE_TYPE_VARCHAR,
184
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
185
DRIZZLE_TYPE_TIMESTAMP, DRIZZLE_TYPE_TIMESTAMP,
186
//DRIZZLE_TYPE_LONGLONG
187
DRIZZLE_TYPE_VARCHAR,
189
DRIZZLE_TYPE_DATETIME,
190
//DRIZZLE_TYPE_DATETIME
191
DRIZZLE_TYPE_DATETIME,
192
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
193
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
194
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
195
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
182
DRIZZLE_TYPE_VARCHAR,
184
DRIZZLE_TYPE_VARCHAR,
185
//DRIZZLE_TYPE_DOUBLE
186
DRIZZLE_TYPE_VARCHAR,
188
DRIZZLE_TYPE_TIMESTAMP,
189
//DRIZZLE_TYPE_TIMESTAMP
190
DRIZZLE_TYPE_TIMESTAMP,
191
//DRIZZLE_TYPE_LONGLONG
192
DRIZZLE_TYPE_VARCHAR,
193
//DRIZZLE_TYPE_DATETIME
194
DRIZZLE_TYPE_DATETIME,
197
//DRIZZLE_TYPE_VARCHAR
198
DRIZZLE_TYPE_VARCHAR,
199
//DRIZZLE_TYPE_VIRTUAL
200
DRIZZLE_TYPE_VIRTUAL,
201
//DRIZZLE_TYPE_NEWDECIMAL
202
DRIZZLE_TYPE_VARCHAR,
204
DRIZZLE_TYPE_VARCHAR,
197
206
DRIZZLE_TYPE_BLOB,
199
208
/* DRIZZLE_TYPE_LONGLONG -> */
201
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
202
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_LONGLONG,
204
DRIZZLE_TYPE_LONGLONG,
205
//DRIZZLE_TYPE_DOUBLE
211
DRIZZLE_TYPE_LONGLONG,
213
DRIZZLE_TYPE_LONGLONG,
214
//DRIZZLE_TYPE_DOUBLE
206
215
DRIZZLE_TYPE_DOUBLE,
207
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
208
DRIZZLE_TYPE_LONGLONG, DRIZZLE_TYPE_VARCHAR,
209
//DRIZZLE_TYPE_LONGLONG
210
DRIZZLE_TYPE_LONGLONG,
212
DRIZZLE_TYPE_VARCHAR,
213
//DRIZZLE_TYPE_DATETIME
214
DRIZZLE_TYPE_VARCHAR,
215
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
216
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
217
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
218
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
222
/* DRIZZLE_TYPE_TIME -> */
224
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
225
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
227
DRIZZLE_TYPE_VARCHAR,
228
//DRIZZLE_TYPE_DOUBLE
229
DRIZZLE_TYPE_VARCHAR,
230
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
231
DRIZZLE_TYPE_TIME, DRIZZLE_TYPE_DATETIME,
232
//DRIZZLE_TYPE_LONGLONG
233
DRIZZLE_TYPE_VARCHAR,
236
//DRIZZLE_TYPE_DATETIME
237
DRIZZLE_TYPE_DATETIME,
238
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
239
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
240
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
241
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
217
DRIZZLE_TYPE_LONGLONG,
218
//DRIZZLE_TYPE_TIMESTAMP
219
DRIZZLE_TYPE_VARCHAR,
220
//DRIZZLE_TYPE_LONGLONG
221
DRIZZLE_TYPE_LONGLONG,
222
//DRIZZLE_TYPE_DATETIME
223
DRIZZLE_TYPE_VARCHAR,
226
//DRIZZLE_TYPE_VARCHAR
227
DRIZZLE_TYPE_VARCHAR,
228
//DRIZZLE_TYPE_VIRTUAL
229
DRIZZLE_TYPE_VIRTUAL,
230
//DRIZZLE_TYPE_NEWDECIMAL
232
DRIZZLE_TYPE_NEWDECIMAL,
233
DRIZZLE_TYPE_VARCHAR,
243
235
DRIZZLE_TYPE_BLOB,
245
237
/* DRIZZLE_TYPE_DATETIME -> */
247
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
248
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
250
DRIZZLE_TYPE_VARCHAR,
251
//DRIZZLE_TYPE_DOUBLE
252
DRIZZLE_TYPE_VARCHAR,
253
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
254
DRIZZLE_TYPE_DATETIME, DRIZZLE_TYPE_DATETIME,
255
//DRIZZLE_TYPE_LONGLONG
256
DRIZZLE_TYPE_VARCHAR,
258
DRIZZLE_TYPE_DATETIME,
259
//DRIZZLE_TYPE_DATETIME
260
DRIZZLE_TYPE_DATETIME,
261
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
262
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
263
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
264
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
240
DRIZZLE_TYPE_VARCHAR,
242
DRIZZLE_TYPE_VARCHAR,
243
//DRIZZLE_TYPE_DOUBLE
244
DRIZZLE_TYPE_VARCHAR,
246
DRIZZLE_TYPE_DATETIME,
247
//DRIZZLE_TYPE_TIMESTAMP
248
DRIZZLE_TYPE_DATETIME,
249
//DRIZZLE_TYPE_LONGLONG
250
DRIZZLE_TYPE_VARCHAR,
251
//DRIZZLE_TYPE_DATETIME
252
DRIZZLE_TYPE_DATETIME,
255
//DRIZZLE_TYPE_VARCHAR
256
DRIZZLE_TYPE_VARCHAR,
257
//DRIZZLE_TYPE_VIRTUAL
258
DRIZZLE_TYPE_VIRTUAL,
259
//DRIZZLE_TYPE_NEWDECIMAL
260
DRIZZLE_TYPE_VARCHAR,
262
DRIZZLE_TYPE_VARCHAR,
266
264
DRIZZLE_TYPE_BLOB,
268
/* DRIZZLE_TYPE_NEWDATE -> */
266
/* DRIZZLE_TYPE_DATE -> */
270
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
271
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
273
DRIZZLE_TYPE_VARCHAR,
274
//DRIZZLE_TYPE_DOUBLE
275
DRIZZLE_TYPE_VARCHAR,
276
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
277
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_DATETIME,
278
//DRIZZLE_TYPE_LONGLONG
279
DRIZZLE_TYPE_VARCHAR,
281
DRIZZLE_TYPE_DATETIME,
282
//DRIZZLE_TYPE_DATETIME
283
DRIZZLE_TYPE_DATETIME,
284
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
285
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
286
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
287
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
269
DRIZZLE_TYPE_VARCHAR,
271
DRIZZLE_TYPE_VARCHAR,
272
//DRIZZLE_TYPE_DOUBLE
273
DRIZZLE_TYPE_VARCHAR,
276
//DRIZZLE_TYPE_TIMESTAMP
277
DRIZZLE_TYPE_DATETIME,
278
//DRIZZLE_TYPE_LONGLONG
279
DRIZZLE_TYPE_VARCHAR,
280
//DRIZZLE_TYPE_DATETIME
281
DRIZZLE_TYPE_DATETIME,
284
//DRIZZLE_TYPE_VARCHAR
285
DRIZZLE_TYPE_VARCHAR,
286
//DRIZZLE_TYPE_VIRTUAL
287
DRIZZLE_TYPE_VIRTUAL,
288
//DRIZZLE_TYPE_NEWDECIMAL
289
DRIZZLE_TYPE_VARCHAR,
291
DRIZZLE_TYPE_VARCHAR,
289
293
DRIZZLE_TYPE_BLOB,
291
295
/* DRIZZLE_TYPE_VARCHAR -> */
293
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
294
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
296
DRIZZLE_TYPE_VARCHAR,
297
//DRIZZLE_TYPE_DOUBLE
298
DRIZZLE_TYPE_VARCHAR,
299
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
300
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
301
//DRIZZLE_TYPE_LONGLONG
302
DRIZZLE_TYPE_VARCHAR,
304
DRIZZLE_TYPE_VARCHAR,
305
//DRIZZLE_TYPE_DATETIME
306
DRIZZLE_TYPE_VARCHAR,
307
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
308
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
309
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
310
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
298
DRIZZLE_TYPE_VARCHAR,
300
DRIZZLE_TYPE_VARCHAR,
301
//DRIZZLE_TYPE_DOUBLE
302
DRIZZLE_TYPE_VARCHAR,
304
DRIZZLE_TYPE_VARCHAR,
305
//DRIZZLE_TYPE_TIMESTAMP
306
DRIZZLE_TYPE_VARCHAR,
307
//DRIZZLE_TYPE_LONGLONG
308
DRIZZLE_TYPE_VARCHAR,
309
//DRIZZLE_TYPE_DATETIME
310
DRIZZLE_TYPE_VARCHAR,
312
DRIZZLE_TYPE_VARCHAR,
313
//DRIZZLE_TYPE_VARCHAR
314
DRIZZLE_TYPE_VARCHAR,
315
//DRIZZLE_TYPE_VIRTUAL
316
DRIZZLE_TYPE_VIRTUAL,
317
//DRIZZLE_TYPE_NEWDECIMAL
318
DRIZZLE_TYPE_VARCHAR,
320
DRIZZLE_TYPE_VARCHAR,
312
322
DRIZZLE_TYPE_BLOB,
324
/* DRIZZLE_TYPE_VIRTUAL -> */
327
DRIZZLE_TYPE_VIRTUAL,
329
DRIZZLE_TYPE_VIRTUAL,
330
//DRIZZLE_TYPE_DOUBLE
331
DRIZZLE_TYPE_VIRTUAL,
333
DRIZZLE_TYPE_VIRTUAL,
334
//DRIZZLE_TYPE_TIMESTAMP
335
DRIZZLE_TYPE_VIRTUAL,
336
//DRIZZLE_TYPE_LONGLONG
337
DRIZZLE_TYPE_VIRTUAL,
338
//DRIZZLE_TYPE_DATETIME
339
DRIZZLE_TYPE_VIRTUAL,
341
DRIZZLE_TYPE_VIRTUAL,
342
//DRIZZLE_TYPE_VARCHAR
343
DRIZZLE_TYPE_VIRTUAL,
344
//DRIZZLE_TYPE_VIRTUAL
345
DRIZZLE_TYPE_VIRTUAL,
346
//DRIZZLE_TYPE_NEWDECIMAL
347
DRIZZLE_TYPE_VIRTUAL,
349
DRIZZLE_TYPE_VIRTUAL,
351
DRIZZLE_TYPE_VIRTUAL,
314
353
/* DRIZZLE_TYPE_NEWDECIMAL -> */
316
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
317
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_NEWDECIMAL,
319
DRIZZLE_TYPE_NEWDECIMAL,
320
//DRIZZLE_TYPE_DOUBLE
356
DRIZZLE_TYPE_NEWDECIMAL,
358
DRIZZLE_TYPE_NEWDECIMAL,
359
//DRIZZLE_TYPE_DOUBLE
321
360
DRIZZLE_TYPE_DOUBLE,
322
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
323
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
324
//DRIZZLE_TYPE_LONGLONG
325
DRIZZLE_TYPE_NEWDECIMAL,
327
DRIZZLE_TYPE_VARCHAR,
328
//DRIZZLE_TYPE_DATETIME
329
DRIZZLE_TYPE_VARCHAR,
330
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
331
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
332
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
333
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
362
DRIZZLE_TYPE_NEWDECIMAL,
363
//DRIZZLE_TYPE_TIMESTAMP
364
DRIZZLE_TYPE_VARCHAR,
365
//DRIZZLE_TYPE_LONGLONG
366
DRIZZLE_TYPE_NEWDECIMAL,
367
//DRIZZLE_TYPE_DATETIME
368
DRIZZLE_TYPE_VARCHAR,
370
DRIZZLE_TYPE_VARCHAR,
371
//DRIZZLE_TYPE_VARCHAR
372
DRIZZLE_TYPE_VARCHAR,
373
//DRIZZLE_TYPE_VIRTUAL
374
DRIZZLE_TYPE_VIRTUAL,
375
//DRIZZLE_TYPE_NEWDECIMAL
376
DRIZZLE_TYPE_NEWDECIMAL,
378
DRIZZLE_TYPE_VARCHAR,
335
380
DRIZZLE_TYPE_BLOB,
337
382
/* DRIZZLE_TYPE_ENUM -> */
339
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
340
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
342
DRIZZLE_TYPE_VARCHAR,
343
//DRIZZLE_TYPE_DOUBLE
344
DRIZZLE_TYPE_VARCHAR,
345
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
346
DRIZZLE_TYPE_ENUM, DRIZZLE_TYPE_VARCHAR,
347
//DRIZZLE_TYPE_LONGLONG
348
DRIZZLE_TYPE_VARCHAR,
350
DRIZZLE_TYPE_VARCHAR,
351
//DRIZZLE_TYPE_DATETIME
352
DRIZZLE_TYPE_VARCHAR,
353
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
354
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
355
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
356
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
385
DRIZZLE_TYPE_VARCHAR,
387
DRIZZLE_TYPE_VARCHAR,
388
//DRIZZLE_TYPE_DOUBLE
389
DRIZZLE_TYPE_VARCHAR,
392
//DRIZZLE_TYPE_TIMESTAMP
393
DRIZZLE_TYPE_VARCHAR,
394
//DRIZZLE_TYPE_LONGLONG
395
DRIZZLE_TYPE_VARCHAR,
396
//DRIZZLE_TYPE_DATETIME
397
DRIZZLE_TYPE_VARCHAR,
399
DRIZZLE_TYPE_VARCHAR,
400
//DRIZZLE_TYPE_VARCHAR
401
DRIZZLE_TYPE_VARCHAR,
402
//DRIZZLE_TYPE_VIRTUAL
403
DRIZZLE_TYPE_VIRTUAL,
404
//DRIZZLE_TYPE_NEWDECIMAL
405
DRIZZLE_TYPE_VARCHAR,
407
DRIZZLE_TYPE_VARCHAR,
358
409
DRIZZLE_TYPE_BLOB,
360
411
/* DRIZZLE_TYPE_BLOB -> */
362
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
363
DRIZZLE_TYPE_BLOB, DRIZZLE_TYPE_BLOB,
366
//DRIZZLE_TYPE_DOUBLE
368
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
369
DRIZZLE_TYPE_BLOB, DRIZZLE_TYPE_BLOB,
370
//DRIZZLE_TYPE_LONGLONG
374
//DRIZZLE_TYPE_DATETIME
376
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
377
DRIZZLE_TYPE_BLOB, DRIZZLE_TYPE_BLOB,
378
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
379
DRIZZLE_TYPE_BLOB, DRIZZLE_TYPE_BLOB,
417
//DRIZZLE_TYPE_DOUBLE
421
//DRIZZLE_TYPE_TIMESTAMP
423
//DRIZZLE_TYPE_LONGLONG
425
//DRIZZLE_TYPE_DATETIME
429
//DRIZZLE_TYPE_VARCHAR
431
//DRIZZLE_TYPE_VIRTUAL
432
DRIZZLE_TYPE_VIRTUAL,
433
//DRIZZLE_TYPE_NEWDECIMAL
381
438
DRIZZLE_TYPE_BLOB,
457
Detect Item_result by given field type of UNION merge result.
459
@param field_type given field type
462
Item_result (type of internal MySQL expression result)
465
518
Item_result Field::result_merge_type(enum_field_types field_type)
467
assert(field_type < FIELDTYPE_TEAR_FROM || field_type
468
> FIELDTYPE_TEAR_TO);
469
return field_types_result_type[field_type2index(field_type)];
520
assert(field_type <= DRIZZLE_TYPE_MAX);
521
return field_types_result_type[field_type];
525
bool Field::eq(Field *field)
527
return (ptr == field->ptr && null_ptr == field->null_ptr &&
528
null_bit == field->null_bit);
532
uint32_t Field::pack_length() const
538
uint32_t Field::pack_length_in_rec() const
540
return pack_length();
544
uint32_t Field::pack_length_from_metadata(uint32_t field_metadata)
546
return field_metadata;
550
uint32_t Field::row_pack_length()
556
int Field::save_field_metadata(unsigned char *first_byte)
558
return do_save_field_metadata(first_byte);
562
uint32_t Field::data_length()
564
return pack_length();
568
uint32_t Field::used_length()
570
return pack_length();
574
uint32_t Field::sort_length() const
576
return pack_length();
580
uint32_t Field::max_data_length() const
582
return pack_length();
586
int Field::reset(void)
588
memset(ptr, 0, pack_length());
593
void Field::reset_fields()
597
void Field::set_default()
599
my_ptrdiff_t l_offset= (my_ptrdiff_t) (table->getDefaultValues() - table->record[0]);
600
memcpy(ptr, ptr + l_offset, pack_length());
602
*null_ptr= ((*null_ptr & (unsigned char) ~null_bit) | (null_ptr[l_offset] & null_bit));
606
bool Field::binary() const
612
bool Field::zero_pack() const
618
enum ha_base_keytype Field::key_type() const
620
return HA_KEYTYPE_BINARY;
624
uint32_t Field::key_length() const
626
return pack_length();
630
enum_field_types Field::real_type() const
636
int Field::cmp_max(const unsigned char *a, const unsigned char *b, uint32_t)
642
int Field::cmp_binary(const unsigned char *a,const unsigned char *b, uint32_t)
644
return memcmp(a,b,pack_length());
648
int Field::cmp_offset(uint32_t row_offset)
650
return cmp(ptr,ptr+row_offset);
654
int Field::cmp_binary_offset(uint32_t row_offset)
656
return cmp_binary(ptr, ptr+row_offset);
660
int Field::key_cmp(const unsigned char *a,const unsigned char *b)
666
int Field::key_cmp(const unsigned char *str, uint32_t)
672
uint32_t Field::decimals() const
678
bool Field::is_null(my_ptrdiff_t row_offset)
681
(null_ptr[row_offset] & null_bit ? true : false) :
686
bool Field::is_real_null(my_ptrdiff_t row_offset)
688
return null_ptr ? (null_ptr[row_offset] & null_bit ? true : false) : false;
692
bool Field::is_null_in_record(const unsigned char *record)
696
return test(record[(uint32_t) (null_ptr -table->record[0])] &
701
bool Field::is_null_in_record_with_offset(my_ptrdiff_t with_offset)
705
return test(null_ptr[with_offset] & null_bit);
709
void Field::set_null(my_ptrdiff_t row_offset)
712
null_ptr[row_offset]|= null_bit;
716
void Field::set_notnull(my_ptrdiff_t row_offset)
719
null_ptr[row_offset]&= (unsigned char) ~null_bit;
723
bool Field::maybe_null(void)
725
return null_ptr != 0 || table->maybe_null;
729
bool Field::real_maybe_null(void)
731
return null_ptr != 0;
735
size_t Field::last_null_byte() const
737
size_t bytes= do_last_null_byte();
738
assert(bytes <= table->getNullBytes());
472
743
/*****************************************************************************
473
744
Static help functions
474
745
*****************************************************************************/
478
Check whether a field type can be partially indexed by a key.
480
This is a static method, rather than a virtual function, because we need
481
to check the type of a non-Field in mysql_alter_table().
483
@param type field type
486
true Type can have a prefixed key
488
false Type can not have a prefixed key
491
747
bool Field::type_can_have_key_part(enum enum_field_types type)
504
Numeric fields base class constructor.
506
Field_num::Field_num(unsigned char *ptr_arg,uint32_t len_arg, unsigned char *null_ptr_arg,
507
unsigned char null_bit_arg, utype unireg_check_arg,
508
const char *field_name_arg,
509
uint8_t dec_arg, bool zero_arg, bool unsigned_arg)
510
:Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
511
unireg_check_arg, field_name_arg),
512
dec(dec_arg),decimal_precision(zero_arg),unsigned_flag(unsigned_arg)
515
flags|=UNSIGNED_FLAG;
520
Test if given number is a int.
523
Make this multi-byte-character safe
525
@param str String to test
526
@param length Length of 'str'
527
@param int_end Pointer to char after last used digit
528
@param cs Character set
531
This is called after one has called strntoull10rnd() function.
536
1 error: empty string or wrong integer.
538
2 error: garbage at the end of string.
541
int Field_num::check_int(const CHARSET_INFO * const cs, const char *str, int length,
542
const char *int_end, int error)
544
/* Test if we get an empty string or wrong integer */
545
if (str == int_end || error == MY_ERRNO_EDOM)
548
String tmp(buff, (uint32_t) sizeof(buff), system_charset_info);
549
tmp.copy(str, length, system_charset_info);
550
push_warning_printf(table->in_use, DRIZZLE_ERROR::WARN_LEVEL_WARN,
551
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
552
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
553
"integer", tmp.c_ptr(), field_name,
554
(uint32_t) table->in_use->row_count);
557
/* Test if we have garbage at the end of the given string. */
558
if (test_if_important_data(cs, int_end, str + length))
560
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
568
Conver a string to an integer then check bounds.
573
from String to convert
574
len Length of the string
575
rnd OUT int64_t value
576
unsigned_max max unsigned value
577
signed_min min signed value
578
signed_max max signed value
581
The function calls strntoull10rnd() to get an integer value then
582
check bounds and errors returned. In case of any error a warning
590
bool Field_num::get_int(const CHARSET_INFO * const cs, const char *from, uint32_t len,
591
int64_t *rnd, uint64_t unsigned_max,
592
int64_t signed_min, int64_t signed_max)
597
*rnd= (int64_t) cs->cset->strntoull10rnd(cs, from, len,
603
if ((((uint64_t) *rnd > unsigned_max) && (*rnd= (int64_t) unsigned_max)) ||
604
error == MY_ERRNO_ERANGE)
611
if (*rnd < signed_min)
616
else if (*rnd > signed_max)
622
if (table->in_use->count_cuted_fields &&
623
check_int(cs, from, len, end, error))
628
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
633
760
Process decimal library return codes and issue warnings for overflow and
1028
Storing decimal in integer fields.
1030
@param val value for storing
1033
This method is used by all integer fields, real/decimal redefine it
1041
int Field_num::store_decimal(const my_decimal *val)
1044
int64_t i= convert_decimal2int64_t(val, unsigned_flag, &err);
1045
return test(err | store(i, unsigned_flag));
1050
Return decimal value of integer field.
1052
@param decimal_value buffer for storing decimal value
1055
This method is used by all integer fields, real/decimal redefine it.
1056
All int64_t values fit in our decimal buffer which cal store 8*9=72
1057
digits of integer number
1060
pointer to decimal buffer with value of field
1063
my_decimal* Field_num::val_decimal(my_decimal *decimal_value)
1065
assert(result_type() == INT_RESULT);
1066
int64_t nr= val_int();
1067
int2my_decimal(E_DEC_FATAL_ERROR, nr, unsigned_flag, decimal_value);
1068
return decimal_value;
1072
Field_str::Field_str(unsigned char *ptr_arg,uint32_t len_arg, unsigned char *null_ptr_arg,
1073
unsigned char null_bit_arg, utype unireg_check_arg,
1074
const char *field_name_arg, const CHARSET_INFO * const charset_arg)
1075
:Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
1076
unireg_check_arg, field_name_arg)
1078
field_charset= charset_arg;
1079
if (charset_arg->state & MY_CS_BINSORT)
1081
field_derivation= DERIVATION_IMPLICIT;
1085
void Field_num::make_field(Send_field *field)
1087
Field::make_field(field);
1088
field->decimals= dec;
1092
Decimal representation of Field_str.
1094
@param d value for storing
1097
Field_str is the base class for fields like Field_enum,
1098
Field_date and some similar. Some dates use fraction and also
1099
string value should be converted to floating point value according
1100
our rules, so we use double to store value of decimal in string.
1111
int Field_str::store_decimal(const my_decimal *d)
1114
/* TODO: use decimal2string? */
1115
int err= warn_if_overflow(my_decimal2double(E_DEC_FATAL_ERROR &
1116
~E_DEC_OVERFLOW, d, &val));
1117
return err | store(val);
1121
my_decimal *Field_str::val_decimal(my_decimal *decimal_value)
1123
int64_t nr= val_int();
1124
int2my_decimal(E_DEC_FATAL_ERROR, nr, 0, decimal_value);
1125
return decimal_value;
1129
1168
uint32_t Field::fill_cache_field(CACHE_FIELD *copy)
1131
1170
uint32_t store_length;
1244
/****************************************************************************
1246
****************************************************************************/
1248
int Field_tiny::store(const char *from,uint32_t len, const CHARSET_INFO * const cs)
1253
error= get_int(cs, from, len, &rnd, 255, -128, 127);
1254
ptr[0]= unsigned_flag ? (char) (uint64_t) rnd : (char) rnd;
1259
int Field_tiny::store(double nr)
1268
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1271
else if (nr > 255.0)
1274
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1285
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1288
else if (nr > 127.0)
1291
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1295
*ptr=(char) (int) nr;
1301
int Field_tiny::store(int64_t nr, bool unsigned_val)
1307
if (nr < 0 && !unsigned_val)
1310
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1313
else if ((uint64_t) nr > (uint64_t) 255)
1316
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1324
if (nr < 0 && unsigned_val)
1325
nr= 256; // Generate overflow
1329
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1335
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1345
double Field_tiny::val_real(void)
1347
int tmp= unsigned_flag ? (int) ptr[0] :
1348
(int) ((signed char*) ptr)[0];
1349
return (double) tmp;
1353
int64_t Field_tiny::val_int(void)
1355
int tmp= unsigned_flag ? (int) ptr[0] :
1356
(int) ((signed char*) ptr)[0];
1357
return (int64_t) tmp;
1361
String *Field_tiny::val_str(String *val_buffer,
1362
String *val_ptr __attribute__((unused)))
1364
const CHARSET_INFO * const cs= &my_charset_bin;
1366
uint32_t mlength=cmax(field_length+1,5*cs->mbmaxlen);
1367
val_buffer->alloc(mlength);
1368
char *to=(char*) val_buffer->ptr();
1371
length= (uint32_t) cs->cset->long10_to_str(cs,to,mlength, 10,
1374
length= (uint32_t) cs->cset->long10_to_str(cs,to,mlength,-10,
1375
(long) *((signed char*) ptr));
1377
val_buffer->length(length);
1382
bool Field_tiny::send_binary(Protocol *protocol)
1384
return protocol->store_tiny((int64_t) (int8_t) ptr[0]);
1387
int Field_tiny::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
1390
a=(signed char) a_ptr[0]; b= (signed char) b_ptr[0];
1392
return ((unsigned char) a < (unsigned char) b) ? -1 : ((unsigned char) a > (unsigned char) b) ? 1 : 0;
1393
return (a < b) ? -1 : (a > b) ? 1 : 0;
1396
void Field_tiny::sort_string(unsigned char *to,uint32_t length __attribute__((unused)))
1401
to[0] = (char) (ptr[0] ^ (unsigned char) 128); /* Revers signbit */
1404
void Field_tiny::sql_type(String &res) const
1406
const CHARSET_INFO * const cs=res.charset();
1407
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
1408
"tinyint(%d)",(int) field_length));
1414
Report "not well formed" or "cannot convert" error
1415
after storing a character string info a field.
1418
check_string_copy_error()
1420
well_formed_error_pos - where not well formed data was first met
1421
cannot_convert_error_pos - where a not-convertable character was first met
1422
end - end of the string
1423
cs - character set of the string
1426
As of version 5.0 both cases return the same error:
1428
"Invalid string value: 'xxx' for column 't' at row 1"
1430
Future versions will possibly introduce a new error message:
1432
"Cannot convert character string: 'xxx' for column 't' at row 1"
1435
false - If errors didn't happen
1436
true - If an error happened
1440
check_string_copy_error(Field_str *field,
1441
const char *well_formed_error_pos,
1442
const char *cannot_convert_error_pos,
1444
const CHARSET_INFO * const cs)
1446
const char *pos, *end_orig;
1449
if (!(pos= well_formed_error_pos) &&
1450
!(pos= cannot_convert_error_pos))
1454
set_if_smaller(end, pos + 6);
1456
for (t= tmp; pos < end; pos++)
1459
If the source string is ASCII compatible (mbminlen==1)
1460
and the source character is in ASCII printable range (0x20..0x7F),
1461
then display the character as is.
1463
Otherwise, if the source string is not ASCII compatible (e.g. UCS2),
1464
or the source character is not in the printable range,
1465
then print the character using HEX notation.
1467
if (((unsigned char) *pos) >= 0x20 &&
1468
((unsigned char) *pos) <= 0x7F &&
1477
*t++= _dig_vec_upper[((unsigned char) *pos) >> 4];
1478
*t++= _dig_vec_upper[((unsigned char) *pos) & 15];
1488
push_warning_printf(field->table->in_use,
1489
field->table->in_use->abort_on_warning ?
1490
DRIZZLE_ERROR::WARN_LEVEL_ERROR :
1491
DRIZZLE_ERROR::WARN_LEVEL_WARN,
1492
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
1493
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
1494
"string", tmp, field->field_name,
1495
(uint32_t) field->table->in_use->row_count);
1501
Check if we lost any important data and send a truncation error/warning
1504
Field_longstr::report_if_important_data()
1505
ptr - Truncated rest of string
1506
end - End of truncated string
1509
0 - None was truncated (or we don't count cut fields)
1510
2 - Some bytes was truncated
1513
Check if we lost any important data (anything in a binary string,
1514
or any non-space in others). If only trailing spaces was lost,
1515
send a truncation note, otherwise send a truncation error.
1519
Field_longstr::report_if_important_data(const char *ptr, const char *end)
1521
if ((ptr < end) && table->in_use->count_cuted_fields)
1523
if (test_if_important_data(field_charset, ptr, end))
1525
if (table->in_use->abort_on_warning)
1526
set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
1528
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1530
else /* If we lost only spaces then produce a NOTE, not a WARNING */
1531
set_warning(DRIZZLE_ERROR::WARN_LEVEL_NOTE, ER_WARN_DATA_TRUNCATED, 1);
1539
Store double value in Field_varstring.
1541
Pretty prints double number into field_length characters buffer.
1546
int Field_str::store(double nr)
1548
char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
1549
uint32_t local_char_length= field_length / charset()->mbmaxlen;
1553
length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
1556
if (table->in_use->abort_on_warning)
1557
set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
1559
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1561
return store(buff, length, charset());
1565
uint32_t Field::is_equal(Create_field *new_field)
1567
return (new_field->sql_type == real_type());
1571
/* If one of the fields is binary and the other one isn't return 1 else 0 */
1573
bool Field_str::compare_str_field_flags(Create_field *new_field, uint32_t flag_arg)
1575
return (((new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
1576
!(flag_arg & (BINCMP_FLAG | BINARY_FLAG))) ||
1577
(!(new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
1578
(flag_arg & (BINCMP_FLAG | BINARY_FLAG))));
1582
uint32_t Field_str::is_equal(Create_field *new_field)
1584
if (compare_str_field_flags(new_field, flags))
1587
return ((new_field->sql_type == real_type()) &&
1588
new_field->charset == field_charset &&
1589
new_field->length == max_display_length());
1593
int Field_longstr::store_decimal(const my_decimal *d)
1595
char buff[DECIMAL_MAX_STR_LENGTH+1];
1596
String str(buff, sizeof(buff), &my_charset_bin);
1597
my_decimal2string(E_DEC_FATAL_ERROR, d, 0, 0, 0, &str);
1598
return store(str.ptr(), str.length(), str.charset());
1601
uint32_t Field_longstr::max_data_length() const
1603
return field_length + (field_length > 255 ? 2 : 1);
1281
uint32_t Field::is_equal(Create_field *new_field_ptr)
1283
return (new_field_ptr->sql_type == real_type());
2063
1773
if (f_is_blob(pack_flag))
2064
return new Field_blob(ptr,null_pos,null_bit,
1774
return new (root) Field_blob(ptr,null_pos,null_bit,
2065
1775
unireg_check, field_name, share,
2066
1776
pack_length, field_charset);
2069
1779
if (f_is_enum(pack_flag))
2070
return new Field_enum(ptr,field_length,null_pos,null_bit,
1781
return new (root) Field_enum(ptr,field_length,null_pos,null_bit,
2071
1782
unireg_check, field_name,
2072
pack_length, interval, field_charset);
1783
get_enum_pack_length(interval->count),
1784
interval, field_charset);
2076
1789
switch (field_type) {
2077
1790
case DRIZZLE_TYPE_NEWDECIMAL:
2078
return new Field_new_decimal(ptr,field_length,null_pos,null_bit,
1791
return new (root) Field_new_decimal(ptr,field_length,null_pos,null_bit,
2079
1792
unireg_check, field_name,
2080
1793
f_decimals(pack_flag),
2081
1794
f_is_decimal_precision(pack_flag) != 0,
2082
1795
f_is_dec(pack_flag) == 0);
2083
1796
case DRIZZLE_TYPE_DOUBLE:
2084
return new Field_double(ptr,field_length,null_pos,null_bit,
1797
return new (root) Field_double(ptr,field_length,null_pos,null_bit,
2085
1798
unireg_check, field_name,
2086
1799
f_decimals(pack_flag),
2088
1801
f_is_dec(pack_flag)== 0);
2089
1802
case DRIZZLE_TYPE_TINY:
2090
return new Field_tiny(ptr,field_length,null_pos,null_bit,
2091
unireg_check, field_name,
2093
f_is_dec(pack_flag) == 0);
2094
1804
case DRIZZLE_TYPE_LONG:
2095
return new Field_long(ptr,field_length,null_pos,null_bit,
1805
return new (root) Field_long(ptr,field_length,null_pos,null_bit,
2096
1806
unireg_check, field_name,
2098
1808
f_is_dec(pack_flag) == 0);
2099
1809
case DRIZZLE_TYPE_LONGLONG:
2100
return new Field_int64_t(ptr,field_length,null_pos,null_bit,
1810
return new (root) Field_int64_t(ptr,field_length,null_pos,null_bit,
2101
1811
unireg_check, field_name,
2103
1813
f_is_dec(pack_flag) == 0);
2104
1814
case DRIZZLE_TYPE_TIMESTAMP:
2105
return new Field_timestamp(ptr,field_length, null_pos, null_bit,
1815
return new (root) Field_timestamp(ptr,field_length, null_pos, null_bit,
2106
1816
unireg_check, field_name, share,
2107
1817
field_charset);
2108
case DRIZZLE_TYPE_NEWDATE:
2109
return new Field_newdate(ptr,null_pos,null_bit,
1818
case DRIZZLE_TYPE_DATE:
1819
return new (root) Field_date(ptr,null_pos,null_bit,
2110
1820
unireg_check, field_name, field_charset);
2111
case DRIZZLE_TYPE_TIME:
2112
return new Field_time(ptr,null_pos,null_bit,
2113
unireg_check, field_name, field_charset);
2114
1821
case DRIZZLE_TYPE_DATETIME:
2115
return new Field_datetime(ptr,null_pos,null_bit,
1822
return new (root) Field_datetime(ptr,null_pos,null_bit,
2116
1823
unireg_check, field_name, field_charset);
2117
1824
case DRIZZLE_TYPE_NULL:
2118
return new Field_null(ptr, field_length, unireg_check, field_name,
1825
return new (root) Field_null(ptr, field_length, unireg_check, field_name,
2119
1826
field_charset);
1827
case DRIZZLE_TYPE_VIRTUAL: // Must not happen
2120
1829
default: // Impossible (Wrong version)