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,
65
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
66
DRIZZLE_TYPE_NEWDECIMAL, 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,
73
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
74
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
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,
61
static enum_field_types
62
field_types_merge_rules [DRIZZLE_TYPE_MAX+1][DRIZZLE_TYPE_MAX+1]=
84
64
/* DRIZZLE_TYPE_TINY -> */
86
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
87
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_TINY,
88
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
89
DRIZZLE_TYPE_SHORT, DRIZZLE_TYPE_LONG,
92
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
93
DRIZZLE_TYPE_TINY, DRIZZLE_TYPE_VARCHAR,
94
//DRIZZLE_TYPE_LONGLONG
95
DRIZZLE_TYPE_LONGLONG,
96
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
97
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
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,
107
/* DRIZZLE_TYPE_SHORT -> */
109
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
110
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_SHORT,
111
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
112
DRIZZLE_TYPE_SHORT, DRIZZLE_TYPE_LONG,
113
//DRIZZLE_TYPE_DOUBLE
115
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
116
DRIZZLE_TYPE_SHORT, DRIZZLE_TYPE_VARCHAR,
117
//DRIZZLE_TYPE_LONGLONG
118
DRIZZLE_TYPE_LONGLONG,
119
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
120
DRIZZLE_TYPE_VARCHAR, 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,
74
//DRIZZLE_TYPE_TIMESTAMP
76
//DRIZZLE_TYPE_LONGLONG
77
DRIZZLE_TYPE_LONGLONG,
80
//DRIZZLE_TYPE_DATETIME
84
//DRIZZLE_TYPE_VARCHAR
86
//DRIZZLE_TYPE_VIRTUAL
88
//DRIZZLE_TYPE_NEWDECIMAL
89
DRIZZLE_TYPE_NEWDECIMAL,
128
93
DRIZZLE_TYPE_BLOB,
130
95
/* DRIZZLE_TYPE_LONG -> */
132
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
133
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_LONG,
134
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
135
DRIZZLE_TYPE_LONG, DRIZZLE_TYPE_LONG,
136
//DRIZZLE_TYPE_DOUBLE
101
//DRIZZLE_TYPE_DOUBLE
137
102
DRIZZLE_TYPE_DOUBLE,
138
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
139
DRIZZLE_TYPE_LONG, DRIZZLE_TYPE_VARCHAR,
140
//DRIZZLE_TYPE_LONGLONG
105
//DRIZZLE_TYPE_TIMESTAMP
106
DRIZZLE_TYPE_VARCHAR,
107
//DRIZZLE_TYPE_LONGLONG
141
108
DRIZZLE_TYPE_LONGLONG,
142
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
143
DRIZZLE_TYPE_VARCHAR, 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_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
110
DRIZZLE_TYPE_VARCHAR,
111
//DRIZZLE_TYPE_DATETIME
112
DRIZZLE_TYPE_VARCHAR,
114
DRIZZLE_TYPE_VARCHAR,
115
//DRIZZLE_TYPE_VARCHAR
116
DRIZZLE_TYPE_VARCHAR,
117
//DRIZZLE_TYPE_VIRTUAL
118
DRIZZLE_TYPE_VIRTUAL,
119
//DRIZZLE_TYPE_NEWDECIMAL
120
DRIZZLE_TYPE_NEWDECIMAL,
122
DRIZZLE_TYPE_VARCHAR,
151
124
DRIZZLE_TYPE_BLOB,
153
126
/* DRIZZLE_TYPE_DOUBLE -> */
155
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
156
DRIZZLE_TYPE_DOUBLE, DRIZZLE_TYPE_DOUBLE,
157
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
158
DRIZZLE_TYPE_DOUBLE, DRIZZLE_TYPE_DOUBLE,
159
//DRIZZLE_TYPE_DOUBLE
161
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
162
DRIZZLE_TYPE_DOUBLE, DRIZZLE_TYPE_VARCHAR,
163
//DRIZZLE_TYPE_LONGLONG
165
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
166
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
167
//DRIZZLE_TYPE_DATETIME
168
DRIZZLE_TYPE_VARCHAR,
169
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
170
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
171
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
172
DRIZZLE_TYPE_DOUBLE, DRIZZLE_TYPE_VARCHAR,
132
//DRIZZLE_TYPE_DOUBLE
136
//DRIZZLE_TYPE_TIMESTAMP
137
DRIZZLE_TYPE_VARCHAR,
138
//DRIZZLE_TYPE_LONGLONG
141
DRIZZLE_TYPE_VARCHAR,
142
//DRIZZLE_TYPE_DATETIME
143
DRIZZLE_TYPE_VARCHAR,
145
DRIZZLE_TYPE_VARCHAR,
146
//DRIZZLE_TYPE_VARCHAR
147
DRIZZLE_TYPE_VARCHAR,
148
//DRIZZLE_TYPE_VIRTUAL
149
DRIZZLE_TYPE_VIRTUAL,
150
//DRIZZLE_TYPE_NEWDECIMAL
153
DRIZZLE_TYPE_VARCHAR,
174
155
DRIZZLE_TYPE_BLOB,
176
157
/* DRIZZLE_TYPE_NULL -> */
178
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
179
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_TINY,
180
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
181
DRIZZLE_TYPE_SHORT, DRIZZLE_TYPE_LONG,
182
//DRIZZLE_TYPE_DOUBLE
163
//DRIZZLE_TYPE_DOUBLE
183
164
DRIZZLE_TYPE_DOUBLE,
184
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
185
DRIZZLE_TYPE_NULL, DRIZZLE_TYPE_TIMESTAMP,
186
//DRIZZLE_TYPE_LONGLONG
167
//DRIZZLE_TYPE_TIMESTAMP
168
DRIZZLE_TYPE_TIMESTAMP,
169
//DRIZZLE_TYPE_LONGLONG
187
170
DRIZZLE_TYPE_LONGLONG,
188
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
189
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_TIME,
190
//DRIZZLE_TYPE_DATETIME
173
//DRIZZLE_TYPE_DATETIME
191
174
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_NEWDECIMAL, DRIZZLE_TYPE_ENUM,
177
//DRIZZLE_TYPE_VARCHAR
178
DRIZZLE_TYPE_VARCHAR,
179
//DRIZZLE_TYPE_VIRTUAL
180
DRIZZLE_TYPE_VIRTUAL,
181
//DRIZZLE_TYPE_NEWDECIMAL
182
DRIZZLE_TYPE_NEWDECIMAL,
197
186
DRIZZLE_TYPE_BLOB,
199
188
/* DRIZZLE_TYPE_TIMESTAMP -> */
201
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
202
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
203
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
204
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
205
//DRIZZLE_TYPE_DOUBLE
206
DRIZZLE_TYPE_VARCHAR,
207
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
208
DRIZZLE_TYPE_TIMESTAMP, DRIZZLE_TYPE_TIMESTAMP,
209
//DRIZZLE_TYPE_LONGLONG
210
DRIZZLE_TYPE_VARCHAR,
211
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
212
DRIZZLE_TYPE_DATETIME, DRIZZLE_TYPE_DATETIME,
213
//DRIZZLE_TYPE_DATETIME
214
DRIZZLE_TYPE_DATETIME,
215
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
216
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
217
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
218
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
191
DRIZZLE_TYPE_VARCHAR,
193
DRIZZLE_TYPE_VARCHAR,
194
//DRIZZLE_TYPE_DOUBLE
195
DRIZZLE_TYPE_VARCHAR,
197
DRIZZLE_TYPE_TIMESTAMP,
198
//DRIZZLE_TYPE_TIMESTAMP
199
DRIZZLE_TYPE_TIMESTAMP,
200
//DRIZZLE_TYPE_LONGLONG
201
DRIZZLE_TYPE_VARCHAR,
203
DRIZZLE_TYPE_DATETIME,
204
//DRIZZLE_TYPE_DATETIME
205
DRIZZLE_TYPE_DATETIME,
208
//DRIZZLE_TYPE_VARCHAR
209
DRIZZLE_TYPE_VARCHAR,
210
//DRIZZLE_TYPE_VIRTUAL
211
DRIZZLE_TYPE_VIRTUAL,
212
//DRIZZLE_TYPE_NEWDECIMAL
213
DRIZZLE_TYPE_VARCHAR,
215
DRIZZLE_TYPE_VARCHAR,
220
217
DRIZZLE_TYPE_BLOB,
222
219
/* DRIZZLE_TYPE_LONGLONG -> */
224
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
225
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_LONGLONG,
226
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
227
DRIZZLE_TYPE_LONGLONG, DRIZZLE_TYPE_LONGLONG,
228
//DRIZZLE_TYPE_DOUBLE
222
DRIZZLE_TYPE_LONGLONG,
224
DRIZZLE_TYPE_LONGLONG,
225
//DRIZZLE_TYPE_DOUBLE
229
226
DRIZZLE_TYPE_DOUBLE,
230
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
231
DRIZZLE_TYPE_LONGLONG, DRIZZLE_TYPE_VARCHAR,
232
//DRIZZLE_TYPE_LONGLONG
233
DRIZZLE_TYPE_LONGLONG,
234
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
235
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
236
//DRIZZLE_TYPE_DATETIME
237
DRIZZLE_TYPE_VARCHAR,
238
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
239
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
240
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
241
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
245
/* DRIZZLE_TYPE_DATE -> */
247
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
248
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
249
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
250
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
251
//DRIZZLE_TYPE_DOUBLE
252
DRIZZLE_TYPE_VARCHAR,
253
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
254
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_DATETIME,
255
//DRIZZLE_TYPE_LONGLONG
256
DRIZZLE_TYPE_VARCHAR,
257
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
258
DRIZZLE_TYPE_NEWDATE, 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,
228
DRIZZLE_TYPE_LONGLONG,
229
//DRIZZLE_TYPE_TIMESTAMP
230
DRIZZLE_TYPE_VARCHAR,
231
//DRIZZLE_TYPE_LONGLONG
232
DRIZZLE_TYPE_LONGLONG,
234
DRIZZLE_TYPE_VARCHAR,
235
//DRIZZLE_TYPE_DATETIME
236
DRIZZLE_TYPE_VARCHAR,
239
//DRIZZLE_TYPE_VARCHAR
240
DRIZZLE_TYPE_VARCHAR,
241
//DRIZZLE_TYPE_VIRTUAL
242
DRIZZLE_TYPE_VIRTUAL,
243
//DRIZZLE_TYPE_NEWDECIMAL
245
DRIZZLE_TYPE_NEWDECIMAL,
246
DRIZZLE_TYPE_VARCHAR,
266
248
DRIZZLE_TYPE_BLOB,
268
250
/* DRIZZLE_TYPE_TIME -> */
270
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
271
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
272
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
273
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
274
//DRIZZLE_TYPE_DOUBLE
275
DRIZZLE_TYPE_VARCHAR,
276
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
277
DRIZZLE_TYPE_TIME, DRIZZLE_TYPE_DATETIME,
278
//DRIZZLE_TYPE_LONGLONG
279
DRIZZLE_TYPE_VARCHAR,
280
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
281
DRIZZLE_TYPE_DATETIME, DRIZZLE_TYPE_TIME,
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,
253
DRIZZLE_TYPE_VARCHAR,
255
DRIZZLE_TYPE_VARCHAR,
256
//DRIZZLE_TYPE_DOUBLE
257
DRIZZLE_TYPE_VARCHAR,
260
//DRIZZLE_TYPE_TIMESTAMP
261
DRIZZLE_TYPE_DATETIME,
262
//DRIZZLE_TYPE_LONGLONG
263
DRIZZLE_TYPE_VARCHAR,
266
//DRIZZLE_TYPE_DATETIME
267
DRIZZLE_TYPE_DATETIME,
270
//DRIZZLE_TYPE_VARCHAR
271
DRIZZLE_TYPE_VARCHAR,
272
//DRIZZLE_TYPE_VIRTUAL
273
DRIZZLE_TYPE_VIRTUAL,
274
//DRIZZLE_TYPE_NEWDECIMAL
275
DRIZZLE_TYPE_VARCHAR,
277
DRIZZLE_TYPE_VARCHAR,
289
279
DRIZZLE_TYPE_BLOB,
291
281
/* DRIZZLE_TYPE_DATETIME -> */
293
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
294
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
295
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
296
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
297
//DRIZZLE_TYPE_DOUBLE
298
DRIZZLE_TYPE_VARCHAR,
299
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
300
DRIZZLE_TYPE_DATETIME, DRIZZLE_TYPE_DATETIME,
301
//DRIZZLE_TYPE_LONGLONG
302
DRIZZLE_TYPE_VARCHAR,
303
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
304
DRIZZLE_TYPE_DATETIME, DRIZZLE_TYPE_DATETIME,
305
//DRIZZLE_TYPE_DATETIME
306
DRIZZLE_TYPE_DATETIME,
307
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
308
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
309
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
310
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
284
DRIZZLE_TYPE_VARCHAR,
286
DRIZZLE_TYPE_VARCHAR,
287
//DRIZZLE_TYPE_DOUBLE
288
DRIZZLE_TYPE_VARCHAR,
290
DRIZZLE_TYPE_DATETIME,
291
//DRIZZLE_TYPE_TIMESTAMP
292
DRIZZLE_TYPE_DATETIME,
293
//DRIZZLE_TYPE_LONGLONG
294
DRIZZLE_TYPE_VARCHAR,
296
DRIZZLE_TYPE_DATETIME,
297
//DRIZZLE_TYPE_DATETIME
298
DRIZZLE_TYPE_DATETIME,
301
//DRIZZLE_TYPE_VARCHAR
302
DRIZZLE_TYPE_VARCHAR,
303
//DRIZZLE_TYPE_VIRTUAL
304
DRIZZLE_TYPE_VIRTUAL,
305
//DRIZZLE_TYPE_NEWDECIMAL
306
DRIZZLE_TYPE_VARCHAR,
308
DRIZZLE_TYPE_VARCHAR,
312
310
DRIZZLE_TYPE_BLOB,
314
/* DRIZZLE_TYPE_NEWDATE -> */
312
/* DRIZZLE_TYPE_DATE -> */
316
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
317
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
318
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
319
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
320
//DRIZZLE_TYPE_DOUBLE
321
DRIZZLE_TYPE_VARCHAR,
322
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
323
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_DATETIME,
324
//DRIZZLE_TYPE_LONGLONG
325
DRIZZLE_TYPE_VARCHAR,
326
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
327
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_DATETIME,
328
//DRIZZLE_TYPE_DATETIME
329
DRIZZLE_TYPE_DATETIME,
330
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
331
DRIZZLE_TYPE_NEWDATE, DRIZZLE_TYPE_VARCHAR,
332
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
333
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
315
DRIZZLE_TYPE_VARCHAR,
317
DRIZZLE_TYPE_VARCHAR,
318
//DRIZZLE_TYPE_DOUBLE
319
DRIZZLE_TYPE_VARCHAR,
322
//DRIZZLE_TYPE_TIMESTAMP
323
DRIZZLE_TYPE_DATETIME,
324
//DRIZZLE_TYPE_LONGLONG
325
DRIZZLE_TYPE_VARCHAR,
327
DRIZZLE_TYPE_DATETIME,
328
//DRIZZLE_TYPE_DATETIME
329
DRIZZLE_TYPE_DATETIME,
332
//DRIZZLE_TYPE_VARCHAR
333
DRIZZLE_TYPE_VARCHAR,
334
//DRIZZLE_TYPE_VIRTUAL
335
DRIZZLE_TYPE_VIRTUAL,
336
//DRIZZLE_TYPE_NEWDECIMAL
337
DRIZZLE_TYPE_VARCHAR,
339
DRIZZLE_TYPE_VARCHAR,
335
341
DRIZZLE_TYPE_BLOB,
337
343
/* DRIZZLE_TYPE_VARCHAR -> */
339
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
340
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
341
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
342
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
343
//DRIZZLE_TYPE_DOUBLE
344
DRIZZLE_TYPE_VARCHAR,
345
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
346
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
347
//DRIZZLE_TYPE_LONGLONG
348
DRIZZLE_TYPE_VARCHAR,
349
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
350
DRIZZLE_TYPE_VARCHAR, 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,
346
DRIZZLE_TYPE_VARCHAR,
348
DRIZZLE_TYPE_VARCHAR,
349
//DRIZZLE_TYPE_DOUBLE
350
DRIZZLE_TYPE_VARCHAR,
352
DRIZZLE_TYPE_VARCHAR,
353
//DRIZZLE_TYPE_TIMESTAMP
354
DRIZZLE_TYPE_VARCHAR,
355
//DRIZZLE_TYPE_LONGLONG
356
DRIZZLE_TYPE_VARCHAR,
358
DRIZZLE_TYPE_VARCHAR,
359
//DRIZZLE_TYPE_DATETIME
360
DRIZZLE_TYPE_VARCHAR,
362
DRIZZLE_TYPE_VARCHAR,
363
//DRIZZLE_TYPE_VARCHAR
364
DRIZZLE_TYPE_VARCHAR,
365
//DRIZZLE_TYPE_VIRTUAL
366
DRIZZLE_TYPE_VIRTUAL,
367
//DRIZZLE_TYPE_NEWDECIMAL
368
DRIZZLE_TYPE_VARCHAR,
370
DRIZZLE_TYPE_VARCHAR,
358
372
DRIZZLE_TYPE_BLOB,
374
/* DRIZZLE_TYPE_VIRTUAL -> */
377
DRIZZLE_TYPE_VIRTUAL,
379
DRIZZLE_TYPE_VIRTUAL,
380
//DRIZZLE_TYPE_DOUBLE
381
DRIZZLE_TYPE_VIRTUAL,
383
DRIZZLE_TYPE_VIRTUAL,
384
//DRIZZLE_TYPE_TIMESTAMP
385
DRIZZLE_TYPE_VIRTUAL,
386
//DRIZZLE_TYPE_LONGLONG
387
DRIZZLE_TYPE_VIRTUAL,
389
DRIZZLE_TYPE_VIRTUAL,
390
//DRIZZLE_TYPE_DATETIME
391
DRIZZLE_TYPE_VIRTUAL,
393
DRIZZLE_TYPE_VIRTUAL,
394
//DRIZZLE_TYPE_VARCHAR
395
DRIZZLE_TYPE_VIRTUAL,
396
//DRIZZLE_TYPE_VIRTUAL
397
DRIZZLE_TYPE_VIRTUAL,
398
//DRIZZLE_TYPE_NEWDECIMAL
399
DRIZZLE_TYPE_VIRTUAL,
401
DRIZZLE_TYPE_VIRTUAL,
403
DRIZZLE_TYPE_VIRTUAL,
360
405
/* DRIZZLE_TYPE_NEWDECIMAL -> */
362
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
363
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_NEWDECIMAL,
364
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
365
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_NEWDECIMAL,
366
//DRIZZLE_TYPE_DOUBLE
408
DRIZZLE_TYPE_NEWDECIMAL,
410
DRIZZLE_TYPE_NEWDECIMAL,
411
//DRIZZLE_TYPE_DOUBLE
367
412
DRIZZLE_TYPE_DOUBLE,
368
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
369
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
370
//DRIZZLE_TYPE_LONGLONG
371
DRIZZLE_TYPE_NEWDECIMAL,
372
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
373
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
374
//DRIZZLE_TYPE_DATETIME
375
DRIZZLE_TYPE_VARCHAR,
376
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
377
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
378
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
379
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_VARCHAR,
414
DRIZZLE_TYPE_NEWDECIMAL,
415
//DRIZZLE_TYPE_TIMESTAMP
416
DRIZZLE_TYPE_VARCHAR,
417
//DRIZZLE_TYPE_LONGLONG
418
DRIZZLE_TYPE_NEWDECIMAL,
420
DRIZZLE_TYPE_VARCHAR,
421
//DRIZZLE_TYPE_DATETIME
422
DRIZZLE_TYPE_VARCHAR,
424
DRIZZLE_TYPE_VARCHAR,
425
//DRIZZLE_TYPE_VARCHAR
426
DRIZZLE_TYPE_VARCHAR,
427
//DRIZZLE_TYPE_VIRTUAL
428
DRIZZLE_TYPE_VIRTUAL,
429
//DRIZZLE_TYPE_NEWDECIMAL
430
DRIZZLE_TYPE_NEWDECIMAL,
432
DRIZZLE_TYPE_VARCHAR,
381
434
DRIZZLE_TYPE_BLOB,
383
436
/* DRIZZLE_TYPE_ENUM -> */
385
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
386
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
387
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
388
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
389
//DRIZZLE_TYPE_DOUBLE
390
DRIZZLE_TYPE_VARCHAR,
391
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
392
DRIZZLE_TYPE_ENUM, DRIZZLE_TYPE_VARCHAR,
393
//DRIZZLE_TYPE_LONGLONG
394
DRIZZLE_TYPE_VARCHAR,
395
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
396
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
397
//DRIZZLE_TYPE_DATETIME
398
DRIZZLE_TYPE_VARCHAR,
399
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
400
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
401
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
402
DRIZZLE_TYPE_VARCHAR, DRIZZLE_TYPE_VARCHAR,
439
DRIZZLE_TYPE_VARCHAR,
441
DRIZZLE_TYPE_VARCHAR,
442
//DRIZZLE_TYPE_DOUBLE
443
DRIZZLE_TYPE_VARCHAR,
446
//DRIZZLE_TYPE_TIMESTAMP
447
DRIZZLE_TYPE_VARCHAR,
448
//DRIZZLE_TYPE_LONGLONG
449
DRIZZLE_TYPE_VARCHAR,
451
DRIZZLE_TYPE_VARCHAR,
452
//DRIZZLE_TYPE_DATETIME
453
DRIZZLE_TYPE_VARCHAR,
455
DRIZZLE_TYPE_VARCHAR,
456
//DRIZZLE_TYPE_VARCHAR
457
DRIZZLE_TYPE_VARCHAR,
458
//DRIZZLE_TYPE_VIRTUAL
459
DRIZZLE_TYPE_VIRTUAL,
460
//DRIZZLE_TYPE_NEWDECIMAL
461
DRIZZLE_TYPE_VARCHAR,
463
DRIZZLE_TYPE_VARCHAR,
404
465
DRIZZLE_TYPE_BLOB,
406
467
/* DRIZZLE_TYPE_BLOB -> */
408
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
409
DRIZZLE_TYPE_BLOB, DRIZZLE_TYPE_BLOB,
410
//DRIZZLE_TYPE_SHORT DRIZZLE_TYPE_LONG
411
DRIZZLE_TYPE_BLOB, DRIZZLE_TYPE_BLOB,
412
//DRIZZLE_TYPE_DOUBLE
414
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
415
DRIZZLE_TYPE_BLOB, DRIZZLE_TYPE_BLOB,
416
//DRIZZLE_TYPE_LONGLONG
418
//DRIZZLE_TYPE_DATE DRIZZLE_TYPE_TIME
419
DRIZZLE_TYPE_BLOB, DRIZZLE_TYPE_BLOB,
420
//DRIZZLE_TYPE_DATETIME
422
//DRIZZLE_TYPE_NEWDATE DRIZZLE_TYPE_VARCHAR
423
DRIZZLE_TYPE_BLOB, DRIZZLE_TYPE_BLOB,
424
//DRIZZLE_TYPE_NEWDECIMAL DRIZZLE_TYPE_ENUM
425
DRIZZLE_TYPE_BLOB, DRIZZLE_TYPE_BLOB,
473
//DRIZZLE_TYPE_DOUBLE
477
//DRIZZLE_TYPE_TIMESTAMP
479
//DRIZZLE_TYPE_LONGLONG
483
//DRIZZLE_TYPE_DATETIME
487
//DRIZZLE_TYPE_VARCHAR
489
//DRIZZLE_TYPE_VIRTUAL
490
DRIZZLE_TYPE_VIRTUAL,
491
//DRIZZLE_TYPE_NEWDECIMAL
427
496
DRIZZLE_TYPE_BLOB,
503
Detect Item_result by given field type of UNION merge result.
505
@param field_type given field type
508
Item_result (type of internal MySQL expression result)
511
576
Item_result Field::result_merge_type(enum_field_types field_type)
513
assert(field_type < FIELDTYPE_TEAR_FROM || field_type
514
> FIELDTYPE_TEAR_TO);
515
return field_types_result_type[field_type2index(field_type)];
578
assert(field_type <= DRIZZLE_TYPE_MAX);
579
return field_types_result_type[field_type];
583
bool Field::eq(Field *field)
585
return (ptr == field->ptr && null_ptr == field->null_ptr &&
586
null_bit == field->null_bit);
590
uint32_t Field::pack_length() const
596
uint32_t Field::pack_length_in_rec() const
598
return pack_length();
602
uint32_t Field::pack_length_from_metadata(uint32_t field_metadata)
604
return field_metadata;
608
uint32_t Field::row_pack_length()
614
int Field::save_field_metadata(unsigned char *first_byte)
616
return do_save_field_metadata(first_byte);
620
uint32_t Field::data_length()
622
return pack_length();
626
uint32_t Field::used_length()
628
return pack_length();
632
uint32_t Field::sort_length() const
634
return pack_length();
638
uint32_t Field::max_data_length() const
640
return pack_length();
644
int Field::reset(void)
646
memset(ptr, 0, pack_length());
651
void Field::reset_fields()
655
void Field::set_default()
657
my_ptrdiff_t l_offset= (my_ptrdiff_t) (table->getDefaultValues() - table->record[0]);
658
memcpy(ptr, ptr + l_offset, pack_length());
660
*null_ptr= ((*null_ptr & (unsigned char) ~null_bit) | (null_ptr[l_offset] & null_bit));
664
bool Field::binary() const
670
bool Field::zero_pack() const
676
enum ha_base_keytype Field::key_type() const
678
return HA_KEYTYPE_BINARY;
682
uint32_t Field::key_length() const
684
return pack_length();
688
enum_field_types Field::real_type() const
694
int Field::cmp_max(const unsigned char *a, const unsigned char *b, uint32_t)
700
int Field::cmp_binary(const unsigned char *a,const unsigned char *b, uint32_t)
702
return memcmp(a,b,pack_length());
706
int Field::cmp_offset(uint32_t row_offset)
708
return cmp(ptr,ptr+row_offset);
712
int Field::cmp_binary_offset(uint32_t row_offset)
714
return cmp_binary(ptr, ptr+row_offset);
718
int Field::key_cmp(const unsigned char *a,const unsigned char *b)
724
int Field::key_cmp(const unsigned char *str, uint32_t)
730
uint32_t Field::decimals() const
736
bool Field::is_null(my_ptrdiff_t row_offset)
739
(null_ptr[row_offset] & null_bit ? true : false) :
744
bool Field::is_real_null(my_ptrdiff_t row_offset)
746
return null_ptr ? (null_ptr[row_offset] & null_bit ? true : false) : false;
750
bool Field::is_null_in_record(const unsigned char *record)
754
return test(record[(uint32_t) (null_ptr -table->record[0])] &
759
bool Field::is_null_in_record_with_offset(my_ptrdiff_t offset)
763
return test(null_ptr[offset] & null_bit);
767
void Field::set_null(my_ptrdiff_t row_offset)
770
null_ptr[row_offset]|= null_bit;
774
void Field::set_notnull(my_ptrdiff_t row_offset)
777
null_ptr[row_offset]&= (unsigned char) ~null_bit;
781
bool Field::maybe_null(void)
783
return null_ptr != 0 || table->maybe_null;
787
bool Field::real_maybe_null(void)
789
return null_ptr != 0;
793
size_t Field::last_null_byte() const
795
size_t bytes= do_last_null_byte();
796
assert(bytes <= table->getNullBytes());
518
801
/*****************************************************************************
519
802
Static help functions
520
803
*****************************************************************************/
524
Check whether a field type can be partially indexed by a key.
526
This is a static method, rather than a virtual function, because we need
527
to check the type of a non-Field in mysql_alter_table().
529
@param type field type
532
true Type can have a prefixed key
534
false Type can not have a prefixed key
537
805
bool Field::type_can_have_key_part(enum enum_field_types type)
550
Numeric fields base class constructor.
552
Field_num::Field_num(uchar *ptr_arg,uint32_t len_arg, uchar *null_ptr_arg,
553
uchar null_bit_arg, utype unireg_check_arg,
554
const char *field_name_arg,
555
uint8_t dec_arg, bool zero_arg, bool unsigned_arg)
556
:Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
557
unireg_check_arg, field_name_arg),
558
dec(dec_arg),decimal_precision(zero_arg),unsigned_flag(unsigned_arg)
561
flags|=UNSIGNED_FLAG;
566
Test if given number is a int.
569
Make this multi-byte-character safe
571
@param str String to test
572
@param length Length of 'str'
573
@param int_end Pointer to char after last used digit
574
@param cs Character set
577
This is called after one has called strntoull10rnd() function.
582
1 error: empty string or wrong integer.
584
2 error: garbage at the end of string.
587
int Field_num::check_int(const CHARSET_INFO * const cs, const char *str, int length,
588
const char *int_end, int error)
590
/* Test if we get an empty string or wrong integer */
591
if (str == int_end || error == MY_ERRNO_EDOM)
594
String tmp(buff, (uint32_t) sizeof(buff), system_charset_info);
595
tmp.copy(str, length, system_charset_info);
596
push_warning_printf(table->in_use, DRIZZLE_ERROR::WARN_LEVEL_WARN,
597
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
598
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
599
"integer", tmp.c_ptr(), field_name,
600
(uint32_t) table->in_use->row_count);
603
/* Test if we have garbage at the end of the given string. */
604
if (test_if_important_data(cs, int_end, str + length))
606
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
614
Conver a string to an integer then check bounds.
619
from String to convert
620
len Length of the string
621
rnd OUT int64_t value
622
unsigned_max max unsigned value
623
signed_min min signed value
624
signed_max max signed value
627
The function calls strntoull10rnd() to get an integer value then
628
check bounds and errors returned. In case of any error a warning
636
bool Field_num::get_int(const CHARSET_INFO * const cs, const char *from, uint len,
637
int64_t *rnd, uint64_t unsigned_max,
638
int64_t signed_min, int64_t signed_max)
643
*rnd= (int64_t) cs->cset->strntoull10rnd(cs, from, len,
649
if ((((uint64_t) *rnd > unsigned_max) && (*rnd= (int64_t) unsigned_max)) ||
650
error == MY_ERRNO_ERANGE)
657
if (*rnd < signed_min)
662
else if (*rnd > signed_max)
668
if (table->in_use->count_cuted_fields &&
669
check_int(cs, from, len, end, error))
674
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
679
818
Process decimal library return codes and issue warnings for overflow and
1290
/****************************************************************************
1292
****************************************************************************/
1294
int Field_tiny::store(const char *from,uint len, const CHARSET_INFO * const cs)
1299
error= get_int(cs, from, len, &rnd, 255, -128, 127);
1300
ptr[0]= unsigned_flag ? (char) (uint64_t) rnd : (char) rnd;
1305
int Field_tiny::store(double nr)
1314
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1317
else if (nr > 255.0)
1320
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1331
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1334
else if (nr > 127.0)
1337
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1341
*ptr=(char) (int) nr;
1347
int Field_tiny::store(int64_t nr, bool unsigned_val)
1353
if (nr < 0 && !unsigned_val)
1356
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1359
else if ((uint64_t) nr > (uint64_t) 255)
1362
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1370
if (nr < 0 && unsigned_val)
1371
nr= 256; // Generate overflow
1375
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1381
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1391
double Field_tiny::val_real(void)
1393
int tmp= unsigned_flag ? (int) ptr[0] :
1394
(int) ((signed char*) ptr)[0];
1395
return (double) tmp;
1399
int64_t Field_tiny::val_int(void)
1401
int tmp= unsigned_flag ? (int) ptr[0] :
1402
(int) ((signed char*) ptr)[0];
1403
return (int64_t) tmp;
1407
String *Field_tiny::val_str(String *val_buffer,
1408
String *val_ptr __attribute__((unused)))
1410
const CHARSET_INFO * const cs= &my_charset_bin;
1412
uint mlength=max(field_length+1,5*cs->mbmaxlen);
1413
val_buffer->alloc(mlength);
1414
char *to=(char*) val_buffer->ptr();
1417
length= (uint) cs->cset->long10_to_str(cs,to,mlength, 10,
1420
length= (uint) cs->cset->long10_to_str(cs,to,mlength,-10,
1421
(long) *((signed char*) ptr));
1423
val_buffer->length(length);
1428
bool Field_tiny::send_binary(Protocol *protocol)
1430
return protocol->store_tiny((int64_t) (int8_t) ptr[0]);
1433
int Field_tiny::cmp(const uchar *a_ptr, const uchar *b_ptr)
1436
a=(signed char) a_ptr[0]; b= (signed char) b_ptr[0];
1438
return ((uchar) a < (uchar) b) ? -1 : ((uchar) a > (uchar) b) ? 1 : 0;
1439
return (a < b) ? -1 : (a > b) ? 1 : 0;
1442
void Field_tiny::sort_string(uchar *to,uint length __attribute__((unused)))
1447
to[0] = (char) (ptr[0] ^ (uchar) 128); /* Revers signbit */
1450
void Field_tiny::sql_type(String &res) const
1452
const CHARSET_INFO * const cs=res.charset();
1453
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
1454
"tinyint(%d)",(int) field_length));
1460
Report "not well formed" or "cannot convert" error
1461
after storing a character string info a field.
1464
check_string_copy_error()
1466
well_formed_error_pos - where not well formed data was first met
1467
cannot_convert_error_pos - where a not-convertable character was first met
1468
end - end of the string
1469
cs - character set of the string
1472
As of version 5.0 both cases return the same error:
1474
"Invalid string value: 'xxx' for column 't' at row 1"
1476
Future versions will possibly introduce a new error message:
1478
"Cannot convert character string: 'xxx' for column 't' at row 1"
1481
false - If errors didn't happen
1482
true - If an error happened
1486
check_string_copy_error(Field_str *field,
1487
const char *well_formed_error_pos,
1488
const char *cannot_convert_error_pos,
1490
const CHARSET_INFO * const cs)
1492
const char *pos, *end_orig;
1495
if (!(pos= well_formed_error_pos) &&
1496
!(pos= cannot_convert_error_pos))
1500
set_if_smaller(end, pos + 6);
1502
for (t= tmp; pos < end; pos++)
1505
If the source string is ASCII compatible (mbminlen==1)
1506
and the source character is in ASCII printable range (0x20..0x7F),
1507
then display the character as is.
1509
Otherwise, if the source string is not ASCII compatible (e.g. UCS2),
1510
or the source character is not in the printable range,
1511
then print the character using HEX notation.
1513
if (((unsigned char) *pos) >= 0x20 &&
1514
((unsigned char) *pos) <= 0x7F &&
1523
*t++= _dig_vec_upper[((unsigned char) *pos) >> 4];
1524
*t++= _dig_vec_upper[((unsigned char) *pos) & 15];
1534
push_warning_printf(field->table->in_use,
1535
field->table->in_use->abort_on_warning ?
1536
DRIZZLE_ERROR::WARN_LEVEL_ERROR :
1537
DRIZZLE_ERROR::WARN_LEVEL_WARN,
1538
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
1539
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
1540
"string", tmp, field->field_name,
1541
(uint32_t) field->table->in_use->row_count);
1547
Check if we lost any important data and send a truncation error/warning
1550
Field_longstr::report_if_important_data()
1551
ptr - Truncated rest of string
1552
end - End of truncated string
1555
0 - None was truncated (or we don't count cut fields)
1556
2 - Some bytes was truncated
1559
Check if we lost any important data (anything in a binary string,
1560
or any non-space in others). If only trailing spaces was lost,
1561
send a truncation note, otherwise send a truncation error.
1565
Field_longstr::report_if_important_data(const char *ptr, const char *end)
1567
if ((ptr < end) && table->in_use->count_cuted_fields)
1569
if (test_if_important_data(field_charset, ptr, end))
1571
if (table->in_use->abort_on_warning)
1572
set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
1574
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1576
else /* If we lost only spaces then produce a NOTE, not a WARNING */
1577
set_warning(DRIZZLE_ERROR::WARN_LEVEL_NOTE, ER_WARN_DATA_TRUNCATED, 1);
1585
Store double value in Field_varstring.
1587
Pretty prints double number into field_length characters buffer.
1592
int Field_str::store(double nr)
1594
char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
1595
uint local_char_length= field_length / charset()->mbmaxlen;
1599
length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
1602
if (table->in_use->abort_on_warning)
1603
set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
1605
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1607
return store(buff, length, charset());
1611
uint Field::is_equal(Create_field *new_field)
1349
uint32_t Field::is_equal(Create_field *new_field)
1613
1351
return (new_field->sql_type == real_type());
1617
/* If one of the fields is binary and the other one isn't return 1 else 0 */
1619
bool Field_str::compare_str_field_flags(Create_field *new_field, uint32_t flag_arg)
1621
return (((new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
1622
!(flag_arg & (BINCMP_FLAG | BINARY_FLAG))) ||
1623
(!(new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
1624
(flag_arg & (BINCMP_FLAG | BINARY_FLAG))));
1628
uint Field_str::is_equal(Create_field *new_field)
1630
if (compare_str_field_flags(new_field, flags))
1633
return ((new_field->sql_type == real_type()) &&
1634
new_field->charset == field_charset &&
1635
new_field->length == max_display_length());
1639
int Field_longstr::store_decimal(const my_decimal *d)
1641
char buff[DECIMAL_MAX_STR_LENGTH+1];
1642
String str(buff, sizeof(buff), &my_charset_bin);
1643
my_decimal2string(E_DEC_FATAL_ERROR, d, 0, 0, 0, &str);
1644
return store(str.ptr(), str.length(), str.charset());
1647
uint32_t Field_longstr::max_data_length() const
1649
return field_length + (field_length > 255 ? 2 : 1);
1653
/****************************************************************************
1655
** This is a string which only can have a selection of different values.
1656
** If one uses this string in a number context one gets the type number.
1657
****************************************************************************/
1659
enum ha_base_keytype Field_enum::key_type() const
1661
switch (packlength) {
1662
default: return HA_KEYTYPE_BINARY;
1663
case 2: return HA_KEYTYPE_USHORT_INT;
1664
case 3: return HA_KEYTYPE_UINT24;
1665
case 4: return HA_KEYTYPE_ULONG_INT;
1666
case 8: return HA_KEYTYPE_ULONGLONG;
1670
void Field_enum::store_type(uint64_t value)
1672
switch (packlength) {
1673
case 1: ptr[0]= (uchar) value; break;
1675
#ifdef WORDS_BIGENDIAN
1676
if (table->s->db_low_byte_first)
1678
int2store(ptr,(unsigned short) value);
1682
shortstore(ptr,(unsigned short) value);
1684
case 3: int3store(ptr,(long) value); break;
1686
#ifdef WORDS_BIGENDIAN
1687
if (table->s->db_low_byte_first)
1689
int4store(ptr,value);
1693
longstore(ptr,(long) value);
1696
#ifdef WORDS_BIGENDIAN
1697
if (table->s->db_low_byte_first)
1699
int8store(ptr,value);
1703
int64_tstore(ptr,value); break;
1710
Storing a empty string in a enum field gives a warning
1711
(if there isn't a empty value in the enum)
1714
int Field_enum::store(const char *from, uint length, const CHARSET_INFO * const cs)
1718
char buff[STRING_BUFFER_USUAL_SIZE];
1719
String tmpstr(buff,sizeof(buff), &my_charset_bin);
1721
/* Convert character set if necessary */
1722
if (String::needs_conversion(length, cs, field_charset, ¬_used))
1725
tmpstr.copy(from, length, cs, field_charset, &dummy_errors);
1727
length= tmpstr.length();
1730
/* Remove end space */
1731
length= field_charset->cset->lengthsp(field_charset, from, length);
1732
uint tmp=find_type2(typelib, from, length, field_charset);
1735
if (length < 6) // Can't be more than 99999 enums
1737
/* This is for reading numbers with LOAD DATA INFILE */
1739
tmp=(uint) my_strntoul(cs,from,length,10,&end,&err);
1740
if (err || end != from+length || tmp > typelib->count)
1743
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1745
if (!table->in_use->count_cuted_fields)
1749
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1751
store_type((uint64_t) tmp);
1756
int Field_enum::store(double nr)
1758
return Field_enum::store((int64_t) nr, false);
1762
int Field_enum::store(int64_t nr,
1763
bool unsigned_val __attribute__((unused)))
1766
if ((uint64_t) nr > typelib->count || nr == 0)
1768
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
1769
if (nr != 0 || table->in_use->count_cuted_fields)
1775
store_type((uint64_t) (uint) nr);
1780
double Field_enum::val_real(void)
1782
return (double) Field_enum::val_int();
1786
int64_t Field_enum::val_int(void)
1788
switch (packlength) {
1790
return (int64_t) ptr[0];
1794
#ifdef WORDS_BIGENDIAN
1795
if (table->s->db_low_byte_first)
1800
return (int64_t) tmp;
1803
return (int64_t) uint3korr(ptr);
1807
#ifdef WORDS_BIGENDIAN
1808
if (table->s->db_low_byte_first)
1813
return (int64_t) tmp;
1818
#ifdef WORDS_BIGENDIAN
1819
if (table->s->db_low_byte_first)
1823
int64_tget(tmp,ptr);
1827
return 0; // impossible
1832
Save the field metadata for enum fields.
1834
Saves the real type in the first byte and the pack length in the
1835
second byte of the field metadata array at index of *metadata_ptr and
1836
*(metadata_ptr + 1).
1838
@param metadata_ptr First byte of field metadata
1840
@returns number of bytes written to metadata_ptr
1842
int Field_enum::do_save_field_metadata(uchar *metadata_ptr)
1844
*metadata_ptr= real_type();
1845
*(metadata_ptr + 1)= pack_length();
1850
String *Field_enum::val_str(String *val_buffer __attribute__((unused)),
1853
uint tmp=(uint) Field_enum::val_int();
1854
if (!tmp || tmp > typelib->count)
1855
val_ptr->set("", 0, field_charset);
1857
val_ptr->set((const char*) typelib->type_names[tmp-1],
1858
typelib->type_lengths[tmp-1],
1863
int Field_enum::cmp(const uchar *a_ptr, const uchar *b_ptr)
1866
ptr= (uchar*) a_ptr;
1867
uint64_t a=Field_enum::val_int();
1868
ptr= (uchar*) b_ptr;
1869
uint64_t b=Field_enum::val_int();
1871
return (a < b) ? -1 : (a > b) ? 1 : 0;
1874
void Field_enum::sort_string(uchar *to,uint length __attribute__((unused)))
1876
uint64_t value=Field_enum::val_int();
1878
for (uint i=0 ; i < packlength ; i++)
1880
*to-- = (uchar) (value & 255);
1886
void Field_enum::sql_type(String &res) const
1889
String enum_item(buffer, sizeof(buffer), res.charset());
1892
res.append(STRING_WITH_LEN("enum("));
1895
uint *len= typelib->type_lengths;
1896
for (const char **pos= typelib->type_names; *pos; pos++, len++)
1901
/* convert to res.charset() == utf8, then quote */
1902
enum_item.copy(*pos, *len, charset(), res.charset(), &dummy_errors);
1903
append_unescaped(&res, enum_item.ptr(), enum_item.length());
1910
Field *Field_enum::new_field(MEM_ROOT *root, struct st_table *new_table,
1913
Field_enum *res= (Field_enum*) Field::new_field(root, new_table, keep_type);
1915
res->typelib= copy_typelib(root, typelib);
1922
1356
1 if the fields are equally defined