59
75
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,
84
/* DRIZZLE_TYPE_TINY -> */
86
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
87
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_TINY,
92
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
93
DRIZZLE_TYPE_TINY, DRIZZLE_TYPE_VARCHAR,
94
//DRIZZLE_TYPE_LONGLONG
95
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,
107
/* DRIZZLE_TYPE_LONG -> */
109
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
110
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_LONG,
113
//DRIZZLE_TYPE_DOUBLE
115
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
116
DRIZZLE_TYPE_LONG, DRIZZLE_TYPE_VARCHAR,
117
//DRIZZLE_TYPE_LONGLONG
118
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,
130
/* 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,
153
/* DRIZZLE_TYPE_NULL -> */
155
//DRIZZLE_TYPE_DECIMAL DRIZZLE_TYPE_TINY
156
DRIZZLE_TYPE_NEWDECIMAL, DRIZZLE_TYPE_TINY,
159
//DRIZZLE_TYPE_DOUBLE
161
//DRIZZLE_TYPE_NULL DRIZZLE_TYPE_TIMESTAMP
162
DRIZZLE_TYPE_NULL, DRIZZLE_TYPE_TIMESTAMP,
163
//DRIZZLE_TYPE_LONGLONG
164
DRIZZLE_TYPE_LONGLONG,
167
//DRIZZLE_TYPE_DATETIME
168
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,
176
/* 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,
199
/* 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
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,
245
/* 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,
268
/* DRIZZLE_TYPE_NEWDATE -> */
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,
291
/* 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,
314
/* 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
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,
337
/* 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,
360
/* 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,
77
/* MYSQL_TYPE_DECIMAL -> */
79
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
80
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_NEWDECIMAL,
81
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
82
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_NEWDECIMAL,
83
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
84
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_DOUBLE,
85
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
86
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR,
87
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
88
//MYSQL_TYPE_DECIMAL, MYSQL_TYPE_DECIMAL,
89
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
90
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
91
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
92
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
93
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
94
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
95
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
96
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR,
99
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
100
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
104
/* MYSQL_TYPE_TINY -> */
106
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
107
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_TINY,
108
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
109
MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
110
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
111
MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
112
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
113
MYSQL_TYPE_TINY, MYSQL_TYPE_VARCHAR,
114
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
115
MYSQL_TYPE_LONGLONG, MYSQL_TYPE_INT24,
116
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
117
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
118
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
119
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_TINY,
120
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
121
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
122
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
123
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR,
126
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
127
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
131
/* MYSQL_TYPE_SHORT -> */
133
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
134
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_SHORT,
135
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
136
MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
137
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
138
MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
139
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
140
MYSQL_TYPE_SHORT, MYSQL_TYPE_VARCHAR,
141
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
142
MYSQL_TYPE_LONGLONG, MYSQL_TYPE_INT24,
143
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
144
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
145
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
146
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_SHORT,
147
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
148
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
149
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
150
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR,
153
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
154
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
158
/* MYSQL_TYPE_LONG -> */
160
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
161
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_LONG,
162
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
163
MYSQL_TYPE_LONG, MYSQL_TYPE_LONG,
164
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
165
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_DOUBLE,
166
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
167
MYSQL_TYPE_LONG, MYSQL_TYPE_VARCHAR,
168
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
169
MYSQL_TYPE_LONGLONG, MYSQL_TYPE_INT24,
170
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
171
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
172
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
173
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_LONG,
174
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
175
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
176
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
177
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR,
180
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
181
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
185
/* MYSQL_TYPE_FLOAT -> */
187
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
188
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_FLOAT,
189
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
190
MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
191
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
192
MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
193
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
194
MYSQL_TYPE_FLOAT, MYSQL_TYPE_VARCHAR,
195
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
196
MYSQL_TYPE_FLOAT, MYSQL_TYPE_INT24,
197
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
198
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
199
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
200
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_FLOAT,
201
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
202
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
203
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
204
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_VARCHAR,
207
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
208
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
212
/* MYSQL_TYPE_DOUBLE -> */
214
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
215
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_DOUBLE,
216
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
217
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_DOUBLE,
218
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
219
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_DOUBLE,
220
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
221
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_VARCHAR,
222
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
223
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_INT24,
224
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
225
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
226
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
227
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_DOUBLE,
228
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
229
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
230
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
231
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_VARCHAR,
234
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
235
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
239
/* MYSQL_TYPE_NULL -> */
241
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
242
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_TINY,
243
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
244
MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
245
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
246
MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
247
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
248
MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP,
249
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
250
MYSQL_TYPE_LONGLONG, MYSQL_TYPE_INT24,
251
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
252
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_TIME,
253
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
254
MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
255
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
256
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
257
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
258
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_ENUM,
261
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
262
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
266
/* MYSQL_TYPE_TIMESTAMP -> */
268
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
269
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
270
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
271
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
272
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
273
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
274
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
275
MYSQL_TYPE_TIMESTAMP, MYSQL_TYPE_TIMESTAMP,
276
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
277
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
278
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
279
MYSQL_TYPE_DATETIME, MYSQL_TYPE_DATETIME,
280
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
281
MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR,
282
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
283
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
284
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
285
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
288
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
289
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
293
/* MYSQL_TYPE_LONGLONG -> */
295
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
296
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_LONGLONG,
297
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
298
MYSQL_TYPE_LONGLONG, MYSQL_TYPE_LONGLONG,
299
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
300
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_DOUBLE,
301
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
302
MYSQL_TYPE_LONGLONG, MYSQL_TYPE_VARCHAR,
303
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
304
MYSQL_TYPE_LONGLONG, MYSQL_TYPE_LONG,
305
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
306
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
307
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
308
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_LONGLONG,
309
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
310
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
311
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
312
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR,
315
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
316
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
320
/* MYSQL_TYPE_INT24 -> */
322
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
323
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_INT24,
324
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
325
MYSQL_TYPE_INT24, MYSQL_TYPE_LONG,
326
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
327
MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
328
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
329
MYSQL_TYPE_INT24, MYSQL_TYPE_VARCHAR,
330
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
331
MYSQL_TYPE_LONGLONG, MYSQL_TYPE_INT24,
332
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
333
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
334
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
335
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_INT24,
336
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
337
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
338
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
339
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR,
342
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
343
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
347
/* MYSQL_TYPE_DATE -> */
349
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
350
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
351
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
352
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
353
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
354
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
355
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
356
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_DATETIME,
357
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
358
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
359
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
360
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_DATETIME,
361
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
362
MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR,
363
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
364
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
365
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
366
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
369
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
370
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
374
/* MYSQL_TYPE_TIME -> */
376
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
377
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
378
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
379
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
380
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
381
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
382
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
383
MYSQL_TYPE_TIME, MYSQL_TYPE_DATETIME,
384
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
385
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
386
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
387
MYSQL_TYPE_DATETIME, MYSQL_TYPE_TIME,
388
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
389
MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR,
390
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
391
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
392
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
393
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
396
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
397
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
401
/* MYSQL_TYPE_DATETIME -> */
403
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
404
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
405
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
406
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
407
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
408
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
409
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
410
MYSQL_TYPE_DATETIME, MYSQL_TYPE_DATETIME,
411
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
412
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
413
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
414
MYSQL_TYPE_DATETIME, MYSQL_TYPE_DATETIME,
415
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
416
MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR,
417
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
418
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
419
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
420
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
423
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
424
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
428
/* MYSQL_TYPE_YEAR -> */
430
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
431
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_TINY,
432
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
433
MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
434
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
435
MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
436
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
437
MYSQL_TYPE_YEAR, MYSQL_TYPE_VARCHAR,
438
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
439
MYSQL_TYPE_LONGLONG, MYSQL_TYPE_INT24,
440
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
441
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
442
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
443
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_YEAR,
444
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
445
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
446
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
447
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR,
450
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
451
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
455
/* MYSQL_TYPE_NEWDATE -> */
457
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
458
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
459
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
460
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
461
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
462
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
463
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
464
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_DATETIME,
465
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
466
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
467
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
468
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_DATETIME,
469
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
470
MYSQL_TYPE_DATETIME, MYSQL_TYPE_VARCHAR,
471
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
472
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
473
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
474
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
477
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
478
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
482
/* MYSQL_TYPE_VARCHAR -> */
484
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
485
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
486
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
487
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
488
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
489
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
490
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
491
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
492
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
493
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
494
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
495
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
496
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
497
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
498
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
499
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
500
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
501
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
504
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
505
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
509
/* MYSQL_TYPE_NEWDECIMAL -> */
511
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
512
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_NEWDECIMAL,
513
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
514
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_NEWDECIMAL,
515
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
516
MYSQL_TYPE_DOUBLE, MYSQL_TYPE_DOUBLE,
517
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
518
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR,
519
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
520
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_NEWDECIMAL,
521
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
522
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
523
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
524
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_NEWDECIMAL,
525
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
526
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
527
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
528
MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR,
531
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
532
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
536
/* MYSQL_TYPE_ENUM -> */
538
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
539
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
540
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
541
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
542
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
543
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
544
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
545
MYSQL_TYPE_ENUM, MYSQL_TYPE_VARCHAR,
546
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
547
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
548
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
549
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
550
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
551
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
552
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
553
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
554
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
555
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
558
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
559
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
563
/* MYSQL_TYPE_SET -> */
565
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
566
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
567
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
568
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
569
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
570
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
571
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
572
MYSQL_TYPE_SET, MYSQL_TYPE_VARCHAR,
573
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
574
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
575
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
576
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
577
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
578
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
579
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
580
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
581
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
582
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
585
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
586
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
590
/* MYSQL_TYPE_BLOB -> */
592
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
593
MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
594
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
595
MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
596
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
597
MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
598
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
599
MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
600
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
601
MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
602
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
603
MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
604
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
605
MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
606
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
607
MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
608
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
609
MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
612
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
613
MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
617
/* MYSQL_TYPE_VAR_STRING -> */
619
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
620
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
621
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
622
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
623
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
624
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
625
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
626
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
627
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
628
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
629
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
630
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
631
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
632
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
633
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
634
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
635
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
636
MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR,
639
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
640
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
644
/* MYSQL_TYPE_STRING -> */
646
//MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY
647
MYSQL_TYPE_STRING, MYSQL_TYPE_STRING,
648
//MYSQL_TYPE_SHORT MYSQL_TYPE_LONG
649
MYSQL_TYPE_STRING, MYSQL_TYPE_STRING,
650
//MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE
651
MYSQL_TYPE_STRING, MYSQL_TYPE_STRING,
652
//MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP
653
MYSQL_TYPE_STRING, MYSQL_TYPE_STRING,
654
//MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24
655
MYSQL_TYPE_STRING, MYSQL_TYPE_STRING,
656
//MYSQL_TYPE_DATE MYSQL_TYPE_TIME
657
MYSQL_TYPE_STRING, MYSQL_TYPE_STRING,
658
//MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR
659
MYSQL_TYPE_STRING, MYSQL_TYPE_STRING,
660
//MYSQL_TYPE_NEWDATE MYSQL_TYPE_VARCHAR
661
MYSQL_TYPE_STRING, MYSQL_TYPE_VARCHAR,
662
//MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_ENUM
663
MYSQL_TYPE_STRING, MYSQL_TYPE_STRING,
666
//MYSQL_TYPE_BLOB MYSQL_TYPE_VAR_STRING
667
MYSQL_TYPE_BLOB, MYSQL_TYPE_VARCHAR,
1244
1569
/****************************************************************************
1570
Field_null, a field that always return NULL
1571
****************************************************************************/
1573
void Field_null::sql_type(String &res) const
1575
res.set_ascii(STRING_WITH_LEN("null"));
1579
/****************************************************************************
1580
** Field_new_decimal
1581
****************************************************************************/
1583
Field_new_decimal::Field_new_decimal(uchar *ptr_arg,
1584
uint32 len_arg, uchar *null_ptr_arg,
1586
enum utype unireg_check_arg,
1587
const char *field_name_arg,
1588
uint8 dec_arg,bool zero_arg,
1590
:Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
1591
unireg_check_arg, field_name_arg, dec_arg, zero_arg, unsigned_arg)
1593
precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
1594
set_if_smaller(precision, DECIMAL_MAX_PRECISION);
1595
DBUG_ASSERT((precision <= DECIMAL_MAX_PRECISION) &&
1596
(dec <= DECIMAL_MAX_SCALE));
1597
bin_size= my_decimal_get_binary_size(precision, dec);
1601
Field_new_decimal::Field_new_decimal(uint32 len_arg,
1602
bool maybe_null_arg,
1606
:Field_num((uchar*) 0, len_arg,
1607
maybe_null_arg ? (uchar*) "": 0, 0,
1608
NONE, name, dec_arg, 0, unsigned_arg)
1610
precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
1611
set_if_smaller(precision, DECIMAL_MAX_PRECISION);
1612
DBUG_ASSERT((precision <= DECIMAL_MAX_PRECISION) &&
1613
(dec <= DECIMAL_MAX_SCALE));
1614
bin_size= my_decimal_get_binary_size(precision, dec);
1618
int Field_new_decimal::reset(void)
1620
store_value(&decimal_zero);
1626
Generate max/min decimal value in case of overflow.
1628
@param decimal_value buffer for value
1629
@param sign sign of value which caused overflow
1632
void Field_new_decimal::set_value_on_overflow(my_decimal *decimal_value,
1635
DBUG_ENTER("Field_new_decimal::set_value_on_overflow");
1636
max_my_decimal(decimal_value, precision, decimals());
1640
my_decimal_set_zero(decimal_value);
1642
decimal_value->sign(TRUE);
1649
Store decimal value in the binary buffer.
1651
Checks if decimal_value fits into field size.
1652
If it does, stores the decimal in the buffer using binary format.
1653
Otherwise sets maximal number that can be stored in the field.
1655
@param decimal_value my_decimal
1663
bool Field_new_decimal::store_value(const my_decimal *decimal_value)
1665
ASSERT_COLUMN_MARKED_FOR_WRITE;
1667
DBUG_ENTER("Field_new_decimal::store_value");
1670
char dbug_buff[DECIMAL_MAX_STR_LENGTH+1];
1671
DBUG_PRINT("enter", ("value: %s", dbug_decimal_as_string(dbug_buff, decimal_value)));
1675
/* check that we do not try to write negative value in unsigned field */
1676
if (unsigned_flag && decimal_value->sign())
1678
DBUG_PRINT("info", ("unsigned overflow"));
1679
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1681
decimal_value= &decimal_zero;
1685
char dbug_buff[DECIMAL_MAX_STR_LENGTH+1];
1686
DBUG_PRINT("info", ("saving with precision %d scale: %d value %s",
1687
(int)precision, (int)dec,
1688
dbug_decimal_as_string(dbug_buff, decimal_value)));
1692
if (warn_if_overflow(my_decimal2binary(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW,
1693
decimal_value, ptr, precision, dec)))
1696
DBUG_PRINT("info", ("overflow"));
1697
set_value_on_overflow(&buff, decimal_value->sign());
1698
my_decimal2binary(E_DEC_FATAL_ERROR, &buff, ptr, precision, dec);
1701
DBUG_EXECUTE("info", print_decimal_buff(decimal_value, (uchar *) ptr,
1707
int Field_new_decimal::store(const char *from, uint length,
1708
CHARSET_INFO *charset_arg)
1710
ASSERT_COLUMN_MARKED_FOR_WRITE;
1712
my_decimal decimal_value;
1713
DBUG_ENTER("Field_new_decimal::store(char*)");
1715
if ((err= str2my_decimal(E_DEC_FATAL_ERROR &
1716
~(E_DEC_OVERFLOW | E_DEC_BAD_NUM),
1717
from, length, charset_arg,
1719
table->in_use->abort_on_warning)
1721
/* Because "from" is not NUL-terminated and we use %s in the ER() */
1723
from_as_str.copy(from, length, &my_charset_bin);
1725
push_warning_printf(table->in_use, MYSQL_ERROR::WARN_LEVEL_ERROR,
1726
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
1727
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
1728
"decimal", from_as_str.c_ptr(), field_name,
1729
(ulong) table->in_use->row_count);
1735
case E_DEC_TRUNCATED:
1736
set_warning(MYSQL_ERROR::WARN_LEVEL_NOTE, WARN_DATA_TRUNCATED, 1);
1738
case E_DEC_OVERFLOW:
1739
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
1740
set_value_on_overflow(&decimal_value, decimal_value.sign());
1744
/* Because "from" is not NUL-terminated and we use %s in the ER() */
1746
from_as_str.copy(from, length, &my_charset_bin);
1748
push_warning_printf(table->in_use, MYSQL_ERROR::WARN_LEVEL_WARN,
1749
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
1750
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
1751
"decimal", from_as_str.c_ptr(), field_name,
1752
(ulong) table->in_use->row_count);
1753
my_decimal_set_zero(&decimal_value);
1760
char dbug_buff[DECIMAL_MAX_STR_LENGTH+1];
1761
DBUG_PRINT("enter", ("value: %s",
1762
dbug_decimal_as_string(dbug_buff, &decimal_value)));
1764
store_value(&decimal_value);
1771
Fix following when double2my_decimal when double2decimal
1772
will return E_DEC_TRUNCATED always correctly
1775
int Field_new_decimal::store(double nr)
1777
ASSERT_COLUMN_MARKED_FOR_WRITE;
1778
my_decimal decimal_value;
1780
DBUG_ENTER("Field_new_decimal::store(double)");
1782
err= double2my_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW, nr,
1786
if (check_overflow(err))
1787
set_value_on_overflow(&decimal_value, decimal_value.sign());
1788
/* Only issue a warning if store_value doesn't issue an warning */
1789
table->in_use->got_warning= 0;
1791
if (store_value(&decimal_value))
1793
else if (err && !table->in_use->got_warning)
1794
err= warn_if_overflow(err);
1799
int Field_new_decimal::store(longlong nr, bool unsigned_val)
1801
ASSERT_COLUMN_MARKED_FOR_WRITE;
1802
my_decimal decimal_value;
1805
if ((err= int2my_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW,
1806
nr, unsigned_val, &decimal_value)))
1808
if (check_overflow(err))
1809
set_value_on_overflow(&decimal_value, decimal_value.sign());
1810
/* Only issue a warning if store_value doesn't issue an warning */
1811
table->in_use->got_warning= 0;
1813
if (store_value(&decimal_value))
1815
else if (err && !table->in_use->got_warning)
1816
err= warn_if_overflow(err);
1821
int Field_new_decimal::store_decimal(const my_decimal *decimal_value)
1823
ASSERT_COLUMN_MARKED_FOR_WRITE;
1824
return store_value(decimal_value);
1828
int Field_new_decimal::store_time(MYSQL_TIME *ltime,
1829
timestamp_type t_type __attribute__((__unused__)))
1831
my_decimal decimal_value;
1832
return store_value(date2my_decimal(ltime, &decimal_value));
1836
double Field_new_decimal::val_real(void)
1838
ASSERT_COLUMN_MARKED_FOR_READ;
1840
my_decimal decimal_value;
1841
my_decimal2double(E_DEC_FATAL_ERROR, val_decimal(&decimal_value), &dbl);
1846
longlong Field_new_decimal::val_int(void)
1848
ASSERT_COLUMN_MARKED_FOR_READ;
1850
my_decimal decimal_value;
1851
my_decimal2int(E_DEC_FATAL_ERROR, val_decimal(&decimal_value),
1857
my_decimal* Field_new_decimal::val_decimal(my_decimal *decimal_value)
1859
ASSERT_COLUMN_MARKED_FOR_READ;
1860
DBUG_ENTER("Field_new_decimal::val_decimal");
1861
binary2my_decimal(E_DEC_FATAL_ERROR, ptr, decimal_value,
1863
DBUG_EXECUTE("info", print_decimal_buff(decimal_value, (uchar *) ptr,
1865
DBUG_RETURN(decimal_value);
1869
String *Field_new_decimal::val_str(String *val_buffer,
1870
String *val_ptr __attribute__((unused)))
1872
ASSERT_COLUMN_MARKED_FOR_READ;
1873
my_decimal decimal_value;
1874
uint fixed_precision= zerofill ? precision : 0;
1875
my_decimal2string(E_DEC_FATAL_ERROR, val_decimal(&decimal_value),
1876
fixed_precision, dec, '0', val_buffer);
1881
int Field_new_decimal::cmp(const uchar *a,const uchar*b)
1883
return memcmp(a, b, bin_size);
1887
void Field_new_decimal::sort_string(uchar *buff,
1888
uint length __attribute__((unused)))
1890
memcpy(buff, ptr, bin_size);
1894
void Field_new_decimal::sql_type(String &str) const
1896
CHARSET_INFO *cs= str.charset();
1897
str.length(cs->cset->snprintf(cs, (char*) str.ptr(), str.alloced_length(),
1898
"decimal(%d,%d)", precision, (int)dec));
1899
add_zerofill_and_unsigned(str);
1904
Save the field metadata for new decimal fields.
1906
Saves the precision in the first byte and decimals() in the second
1907
byte of the field metadata array at index of *metadata_ptr and
1908
*(metadata_ptr + 1).
1910
@param metadata_ptr First byte of field metadata
1912
@returns number of bytes written to metadata_ptr
1914
int Field_new_decimal::do_save_field_metadata(uchar *metadata_ptr)
1916
*metadata_ptr= precision;
1917
*(metadata_ptr + 1)= decimals();
1923
Returns the number of bytes field uses in row-based replication
1926
This method is used in row-based replication to determine the number
1927
of bytes that the field consumes in the row record format. This is
1928
used to skip fields in the master that do not exist on the slave.
1930
@param field_metadata Encoded size in field metadata
1932
@returns The size of the field based on the field metadata.
1934
uint Field_new_decimal::pack_length_from_metadata(uint field_metadata)
1936
uint const source_precision= (field_metadata >> 8U) & 0x00ff;
1937
uint const source_decimal= field_metadata & 0x00ff;
1938
uint const source_size= my_decimal_get_binary_size(source_precision,
1940
return (source_size);
1945
Check to see if field size is compatible with destination.
1947
This method is used in row-based replication to verify that the slave's
1948
field size is less than or equal to the master's field size. The
1949
encoded field metadata (from the master or source) is decoded and compared
1950
to the size of this field (the slave or destination).
1952
@param field_metadata Encoded size in field metadata
1954
@retval 0 if this field's size is < the source field's size
1955
@retval 1 if this field's size is >= the source field's size
1957
int Field_new_decimal::compatible_field_size(uint field_metadata)
1960
uint const source_precision= (field_metadata >> 8U) & 0x00ff;
1961
uint const source_decimal= field_metadata & 0x00ff;
1962
uint const source_size= my_decimal_get_binary_size(source_precision,
1964
uint const destination_size= row_pack_length();
1965
compatible= (source_size <= destination_size);
1967
compatible= (source_precision <= precision) &&
1968
(source_decimal <= decimals());
1969
return (compatible);
1973
uint Field_new_decimal::is_equal(Create_field *new_field)
1975
return ((new_field->sql_type == real_type()) &&
1976
((new_field->flags & UNSIGNED_FLAG) ==
1977
(uint) (flags & UNSIGNED_FLAG)) &&
1978
((new_field->flags & AUTO_INCREMENT_FLAG) ==
1979
(uint) (flags & AUTO_INCREMENT_FLAG)) &&
1980
(new_field->length == max_display_length()) &&
1981
(new_field->decimals == dec));
1986
Unpack a decimal field from row data.
1988
This method is used to unpack a decimal or numeric field from a master
1989
whose size of the field is less than that of the slave.
1991
@param to Destination of the data
1992
@param from Source of the data
1993
@param param_data Precision (upper) and decimal (lower) values
1995
@return New pointer into memory based on from + length of the data
1998
Field_new_decimal::unpack(uchar* to,
2001
bool low_byte_first)
2003
if (param_data == 0)
2004
return Field::unpack(to, from, param_data, low_byte_first);
2006
uint from_precision= (param_data & 0xff00) >> 8U;
2007
uint from_decimal= param_data & 0x00ff;
2008
uint length=pack_length();
2009
uint from_pack_len= my_decimal_get_binary_size(from_precision, from_decimal);
2010
uint len= (param_data && (from_pack_len < length)) ?
2011
from_pack_len : length;
2012
if ((from_pack_len && (from_pack_len < length)) ||
2013
(from_precision < precision) ||
2014
(from_decimal < decimals()))
2017
If the master's data is smaller than the slave, we need to convert
2018
the binary to decimal then resize the decimal converting it back to
2019
a decimal and write that to the raw data buffer.
2021
decimal_digit_t dec_buf[DECIMAL_MAX_PRECISION];
2023
dec.len= from_precision;
2026
Note: bin2decimal does not change the length of the field. So it is
2027
just the first step the resizing operation. The second step does the
2028
resizing using the precision and decimals from the slave.
2030
bin2decimal((uchar *)from, &dec, from_precision, from_decimal);
2031
decimal2bin(&dec, to, precision, decimals());
2034
memcpy(to, from, len); // Sizes are the same, just copy the data.
2038
/****************************************************************************
1246
2040
****************************************************************************/
1248
int Field_tiny::store(const char *from,uint32_t len, const CHARSET_INFO * const cs)
2042
int Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs)
2044
ASSERT_COLUMN_MARKED_FOR_WRITE;
1253
2048
error= get_int(cs, from, len, &rnd, 255, -128, 127);
1254
2049
ptr[0]= unsigned_flag ? (char) (uint64_t) rnd : (char) rnd;
1345
2142
double Field_tiny::val_real(void)
2144
ASSERT_COLUMN_MARKED_FOR_READ;
1347
2145
int tmp= unsigned_flag ? (int) ptr[0] :
1348
2146
(int) ((signed char*) ptr)[0];
1349
2147
return (double) tmp;
1353
int64_t Field_tiny::val_int(void)
2151
longlong Field_tiny::val_int(void)
2153
ASSERT_COLUMN_MARKED_FOR_READ;
1355
2154
int tmp= unsigned_flag ? (int) ptr[0] :
1356
2155
(int) ((signed char*) ptr)[0];
1357
return (int64_t) tmp;
2156
return (longlong) tmp;
1361
2160
String *Field_tiny::val_str(String *val_buffer,
1362
2161
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);
2163
ASSERT_COLUMN_MARKED_FOR_READ;
2164
CHARSET_INFO *cs= &my_charset_bin;
2166
uint mlength=max(field_length+1,5*cs->mbmaxlen);
1367
2167
val_buffer->alloc(mlength);
1368
2168
char *to=(char*) val_buffer->ptr();
1370
2170
if (unsigned_flag)
1371
length= (uint32_t) cs->cset->long10_to_str(cs,to,mlength, 10,
2171
length= (uint) cs->cset->long10_to_str(cs,to,mlength, 10,
1374
length= (uint32_t) cs->cset->long10_to_str(cs,to,mlength,-10,
2174
length= (uint) cs->cset->long10_to_str(cs,to,mlength,-10,
1375
2175
(long) *((signed char*) ptr));
1377
2177
val_buffer->length(length);
2179
prepend_zeros(val_buffer);
1379
2180
return val_buffer;
1382
2183
bool Field_tiny::send_binary(Protocol *protocol)
1384
return protocol->store_tiny((int64_t) (int8_t) ptr[0]);
2185
return protocol->store_tiny((longlong) (int8) ptr[0]);
1387
int Field_tiny::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
2188
int Field_tiny::cmp(const uchar *a_ptr, const uchar *b_ptr)
1389
2190
signed char a,b;
1390
2191
a=(signed char) a_ptr[0]; b= (signed char) b_ptr[0];
1391
2192
if (unsigned_flag)
1392
return ((unsigned char) a < (unsigned char) b) ? -1 : ((unsigned char) a > (unsigned char) b) ? 1 : 0;
2193
return ((uchar) a < (uchar) b) ? -1 : ((uchar) a > (uchar) b) ? 1 : 0;
1393
2194
return (a < b) ? -1 : (a > b) ? 1 : 0;
1396
void Field_tiny::sort_string(unsigned char *to,uint32_t length __attribute__((unused)))
2197
void Field_tiny::sort_string(uchar *to,uint length __attribute__((unused)))
1398
2199
if (unsigned_flag)
1401
to[0] = (char) (ptr[0] ^ (unsigned char) 128); /* Revers signbit */
2202
to[0] = (char) (ptr[0] ^ (uchar) 128); /* Revers signbit */
1404
2205
void Field_tiny::sql_type(String &res) const
1406
const CHARSET_INFO * const cs=res.charset();
2207
CHARSET_INFO *cs=res.charset();
1407
2208
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
1408
2209
"tinyint(%d)",(int) field_length));
2210
add_zerofill_and_unsigned(res);
2213
/****************************************************************************
2214
Field type short int (2 byte)
2215
****************************************************************************/
2217
int Field_short::store(const char *from,uint len,CHARSET_INFO *cs)
2219
ASSERT_COLUMN_MARKED_FOR_WRITE;
2224
error= get_int(cs, from, len, &rnd, UINT_MAX16, INT_MIN16, INT_MAX16);
2225
store_tmp= unsigned_flag ? (int) (uint64_t) rnd : (int) rnd;
2226
#ifdef WORDS_BIGENDIAN
2227
if (table->s->db_low_byte_first)
2229
int2store(ptr, store_tmp);
2233
shortstore(ptr, (short) store_tmp);
2238
int Field_short::store(double nr)
2240
ASSERT_COLUMN_MARKED_FOR_WRITE;
2249
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2252
else if (nr > (double) UINT_MAX16)
2254
res=(int16) UINT_MAX16;
2255
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2259
res=(int16) (uint16) nr;
2263
if (nr < (double) INT_MIN16)
2266
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2269
else if (nr > (double) INT_MAX16)
2272
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2276
res=(int16) (int) nr;
2278
#ifdef WORDS_BIGENDIAN
2279
if (table->s->db_low_byte_first)
2285
shortstore(ptr,res);
2290
int Field_short::store(longlong nr, bool unsigned_val)
2292
ASSERT_COLUMN_MARKED_FOR_WRITE;
2298
if (nr < 0L && !unsigned_val)
2301
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2304
else if ((uint64_t) nr > (uint64_t) UINT_MAX16)
2306
res=(int16) UINT_MAX16;
2307
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2311
res=(int16) (uint16) nr;
2315
if (nr < 0 && unsigned_val)
2316
nr= UINT_MAX16+1; // Generate overflow
2321
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2324
else if (nr > (longlong) INT_MAX16)
2327
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2333
#ifdef WORDS_BIGENDIAN
2334
if (table->s->db_low_byte_first)
2340
shortstore(ptr,res);
2345
double Field_short::val_real(void)
2347
ASSERT_COLUMN_MARKED_FOR_READ;
2349
#ifdef WORDS_BIGENDIAN
2350
if (table->s->db_low_byte_first)
2355
return unsigned_flag ? (double) (unsigned short) j : (double) j;
2358
longlong Field_short::val_int(void)
2360
ASSERT_COLUMN_MARKED_FOR_READ;
2362
#ifdef WORDS_BIGENDIAN
2363
if (table->s->db_low_byte_first)
2368
return unsigned_flag ? (longlong) (unsigned short) j : (longlong) j;
2372
String *Field_short::val_str(String *val_buffer,
2373
String *val_ptr __attribute__((unused)))
2375
ASSERT_COLUMN_MARKED_FOR_READ;
2376
CHARSET_INFO *cs= &my_charset_bin;
2378
uint mlength=max(field_length+1,7*cs->mbmaxlen);
2379
val_buffer->alloc(mlength);
2380
char *to=(char*) val_buffer->ptr();
2382
#ifdef WORDS_BIGENDIAN
2383
if (table->s->db_low_byte_first)
2390
length=(uint) cs->cset->long10_to_str(cs, to, mlength, 10,
2393
length=(uint) cs->cset->long10_to_str(cs, to, mlength,-10, (long) j);
2394
val_buffer->length(length);
2396
prepend_zeros(val_buffer);
2401
bool Field_short::send_binary(Protocol *protocol)
2403
return protocol->store_short(Field_short::val_int());
2407
int Field_short::cmp(const uchar *a_ptr, const uchar *b_ptr)
2410
#ifdef WORDS_BIGENDIAN
2411
if (table->s->db_low_byte_first)
2424
return ((unsigned short) a < (unsigned short) b) ? -1 :
2425
((unsigned short) a > (unsigned short) b) ? 1 : 0;
2426
return (a < b) ? -1 : (a > b) ? 1 : 0;
2429
void Field_short::sort_string(uchar *to,uint length __attribute__((unused)))
2431
#ifdef WORDS_BIGENDIAN
2432
if (!table->s->db_low_byte_first)
2437
to[0] = (char) (ptr[0] ^ 128); /* Revers signbit */
2446
to[0] = (char) (ptr[1] ^ 128); /* Revers signbit */
2451
void Field_short::sql_type(String &res) const
2453
CHARSET_INFO *cs=res.charset();
2454
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
2455
"smallint(%d)",(int) field_length));
2456
add_zerofill_and_unsigned(res);
2460
/****************************************************************************
2462
****************************************************************************/
2464
int Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
2466
ASSERT_COLUMN_MARKED_FOR_WRITE;
2471
error= get_int(cs, from, len, &rnd, UINT_MAX32, INT_MIN32, INT_MAX32);
2472
store_tmp= unsigned_flag ? (long) (uint64_t) rnd : (long) rnd;
2473
#ifdef WORDS_BIGENDIAN
2474
if (table->s->db_low_byte_first)
2476
int4store(ptr, store_tmp);
2480
longstore(ptr, store_tmp);
2485
int Field_long::store(double nr)
2487
ASSERT_COLUMN_MARKED_FOR_WRITE;
2498
else if (nr > (double) UINT_MAX32)
2501
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2505
res=(int32) (ulong) nr;
2509
if (nr < (double) INT_MIN32)
2511
res=(int32) INT_MIN32;
2514
else if (nr > (double) INT_MAX32)
2516
res=(int32) INT_MAX32;
2520
res=(int32) (longlong) nr;
2523
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2525
#ifdef WORDS_BIGENDIAN
2526
if (table->s->db_low_byte_first)
2537
int Field_long::store(longlong nr, bool unsigned_val)
2539
ASSERT_COLUMN_MARKED_FOR_WRITE;
2545
if (nr < 0 && !unsigned_val)
2550
else if ((uint64_t) nr >= (1LL << 32))
2552
res=(int32) (uint32) ~0L;
2556
res=(int32) (uint32) nr;
2560
if (nr < 0 && unsigned_val)
2561
nr= ((longlong) INT_MAX32) + 1; // Generate overflow
2562
if (nr < (longlong) INT_MIN32)
2564
res=(int32) INT_MIN32;
2567
else if (nr > (longlong) INT_MAX32)
2569
res=(int32) INT_MAX32;
2576
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2578
#ifdef WORDS_BIGENDIAN
2579
if (table->s->db_low_byte_first)
2590
double Field_long::val_real(void)
2592
ASSERT_COLUMN_MARKED_FOR_READ;
2594
#ifdef WORDS_BIGENDIAN
2595
if (table->s->db_low_byte_first)
2600
return unsigned_flag ? (double) (uint32) j : (double) j;
2603
longlong Field_long::val_int(void)
2605
ASSERT_COLUMN_MARKED_FOR_READ;
2607
/* See the comment in Field_long::store(long long) */
2608
DBUG_ASSERT(table->in_use == current_thd);
2609
#ifdef WORDS_BIGENDIAN
2610
if (table->s->db_low_byte_first)
2615
return unsigned_flag ? (longlong) (uint32) j : (longlong) j;
2618
String *Field_long::val_str(String *val_buffer,
2619
String *val_ptr __attribute__((unused)))
2621
ASSERT_COLUMN_MARKED_FOR_READ;
2622
CHARSET_INFO *cs= &my_charset_bin;
2624
uint mlength=max(field_length+1,12*cs->mbmaxlen);
2625
val_buffer->alloc(mlength);
2626
char *to=(char*) val_buffer->ptr();
2628
#ifdef WORDS_BIGENDIAN
2629
if (table->s->db_low_byte_first)
2636
length=cs->cset->long10_to_str(cs,to,mlength, 10,(long) (uint32)j);
2638
length=cs->cset->long10_to_str(cs,to,mlength,-10,(long) j);
2639
val_buffer->length(length);
2641
prepend_zeros(val_buffer);
2646
bool Field_long::send_binary(Protocol *protocol)
2648
ASSERT_COLUMN_MARKED_FOR_READ;
2649
return protocol->store_long(Field_long::val_int());
2652
int Field_long::cmp(const uchar *a_ptr, const uchar *b_ptr)
2655
#ifdef WORDS_BIGENDIAN
2656
if (table->s->db_low_byte_first)
2668
return ((uint32) a < (uint32) b) ? -1 : ((uint32) a > (uint32) b) ? 1 : 0;
2669
return (a < b) ? -1 : (a > b) ? 1 : 0;
2672
void Field_long::sort_string(uchar *to,uint length __attribute__((unused)))
2674
#ifdef WORDS_BIGENDIAN
2675
if (!table->s->db_low_byte_first)
2680
to[0] = (char) (ptr[0] ^ 128); /* Revers signbit */
2691
to[0] = (char) (ptr[3] ^ 128); /* Revers signbit */
2699
void Field_long::sql_type(String &res) const
2701
CHARSET_INFO *cs=res.charset();
2702
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
2703
"int(%d)",(int) field_length));
2704
add_zerofill_and_unsigned(res);
2707
/****************************************************************************
2708
Field type longlong int (8 bytes)
2709
****************************************************************************/
2711
int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
2713
ASSERT_COLUMN_MARKED_FOR_WRITE;
2718
tmp= cs->cset->strntoull10rnd(cs,from,len,unsigned_flag,&end,&error);
2719
if (error == MY_ERRNO_ERANGE)
2721
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2724
else if (table->in_use->count_cuted_fields &&
2725
check_int(cs, from, len, end, error))
2729
#ifdef WORDS_BIGENDIAN
2730
if (table->s->db_low_byte_first)
2736
longlongstore(ptr,tmp);
2741
int Field_longlong::store(double nr)
2743
ASSERT_COLUMN_MARKED_FOR_WRITE;
2755
else if (nr >= (double) ULONGLONG_MAX)
2761
res=(longlong) (uint64_t) nr;
2765
if (nr <= (double) LONGLONG_MIN)
2768
error= (nr < (double) LONGLONG_MIN);
2770
else if (nr >= (double) (uint64_t) LONGLONG_MAX)
2773
error= (nr > (double) LONGLONG_MAX);
2779
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2781
#ifdef WORDS_BIGENDIAN
2782
if (table->s->db_low_byte_first)
2788
longlongstore(ptr,res);
2793
int Field_longlong::store(longlong nr, bool unsigned_val)
2795
ASSERT_COLUMN_MARKED_FOR_WRITE;
2798
if (nr < 0) // Only possible error
2801
if field is unsigned and value is signed (< 0) or
2802
if field is signed and value is unsigned we have an overflow
2804
if (unsigned_flag != unsigned_val)
2806
nr= unsigned_flag ? (uint64_t) 0 : (uint64_t) LONGLONG_MAX;
2807
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
2812
#ifdef WORDS_BIGENDIAN
2813
if (table->s->db_low_byte_first)
2819
longlongstore(ptr,nr);
2824
double Field_longlong::val_real(void)
2826
ASSERT_COLUMN_MARKED_FOR_READ;
2828
#ifdef WORDS_BIGENDIAN
2829
if (table->s->db_low_byte_first)
2836
/* The following is open coded to avoid a bug in gcc 3.3 */
2839
uint64_t tmp= (uint64_t) j;
2840
return ulonglong2double(tmp);
2846
longlong Field_longlong::val_int(void)
2848
ASSERT_COLUMN_MARKED_FOR_READ;
2850
#ifdef WORDS_BIGENDIAN
2851
if (table->s->db_low_byte_first)
2860
String *Field_longlong::val_str(String *val_buffer,
2861
String *val_ptr __attribute__((unused)))
2863
CHARSET_INFO *cs= &my_charset_bin;
2865
uint mlength=max(field_length+1,22*cs->mbmaxlen);
2866
val_buffer->alloc(mlength);
2867
char *to=(char*) val_buffer->ptr();
2869
#ifdef WORDS_BIGENDIAN
2870
if (table->s->db_low_byte_first)
2876
length=(uint) (cs->cset->longlong10_to_str)(cs,to,mlength,
2877
unsigned_flag ? 10 : -10, j);
2878
val_buffer->length(length);
2880
prepend_zeros(val_buffer);
2885
bool Field_longlong::send_binary(Protocol *protocol)
2887
ASSERT_COLUMN_MARKED_FOR_READ;
2888
return protocol->store_longlong(Field_longlong::val_int(), unsigned_flag);
2892
int Field_longlong::cmp(const uchar *a_ptr, const uchar *b_ptr)
2895
#ifdef WORDS_BIGENDIAN
2896
if (table->s->db_low_byte_first)
2904
longlongget(a,a_ptr);
2905
longlongget(b,b_ptr);
2908
return ((uint64_t) a < (uint64_t) b) ? -1 :
2909
((uint64_t) a > (uint64_t) b) ? 1 : 0;
2910
return (a < b) ? -1 : (a > b) ? 1 : 0;
2913
void Field_longlong::sort_string(uchar *to,uint length __attribute__((unused)))
2915
#ifdef WORDS_BIGENDIAN
2916
if (!table->s->db_low_byte_first)
2921
to[0] = (char) (ptr[0] ^ 128); /* Revers signbit */
2936
to[0] = (char) (ptr[7] ^ 128); /* Revers signbit */
2948
void Field_longlong::sql_type(String &res) const
2950
CHARSET_INFO *cs=res.charset();
2951
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
2952
"bigint(%d)",(int) field_length));
2953
add_zerofill_and_unsigned(res);
2958
Floating-point numbers
2962
Field_real::pack(uchar *to, const uchar *from,
2963
uint max_length, bool low_byte_first)
2965
DBUG_ENTER("Field_real::pack");
2966
DBUG_ASSERT(max_length >= pack_length());
2967
DBUG_PRINT("debug", ("pack_length(): %u", pack_length()));
2968
#ifdef WORDS_BIGENDIAN
2969
if (low_byte_first != table->s->db_low_byte_first)
2971
const uchar *dptr= from + pack_length();
2972
while (dptr-- > from)
2978
DBUG_RETURN(Field::pack(to, from, max_length, low_byte_first));
2982
Field_real::unpack(uchar *to, const uchar *from,
2983
uint param_data, bool low_byte_first)
2985
DBUG_ENTER("Field_real::unpack");
2986
DBUG_PRINT("debug", ("pack_length(): %u", pack_length()));
2987
#ifdef WORDS_BIGENDIAN
2988
if (low_byte_first != table->s->db_low_byte_first)
2990
const uchar *dptr= from + pack_length();
2991
while (dptr-- > from)
2993
DBUG_RETURN(from + pack_length());
2997
DBUG_RETURN(Field::unpack(to, from, param_data, low_byte_first));
3000
/****************************************************************************
3001
single precision float
3002
****************************************************************************/
3004
int Field_float::store(const char *from,uint len,CHARSET_INFO *cs)
3008
double nr= my_strntod(cs,(char*) from,len,&end,&error);
3009
if (error || (!len || (((uint)(end-from) != len) && table->in_use->count_cuted_fields)))
3011
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3012
(error ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED), 1);
3013
error= error ? 1 : 2;
3015
Field_float::store(nr);
3020
int Field_float::store(double nr)
3022
ASSERT_COLUMN_MARKED_FOR_WRITE;
3023
int error= truncate(&nr, FLT_MAX);
3026
#ifdef WORDS_BIGENDIAN
3027
if (table->s->db_low_byte_first)
3033
memcpy_fixed(ptr,(uchar*) &j,sizeof(j));
3038
int Field_float::store(longlong nr, bool unsigned_val)
3040
return Field_float::store(unsigned_val ? ulonglong2double((uint64_t) nr) :
3045
double Field_float::val_real(void)
3047
ASSERT_COLUMN_MARKED_FOR_READ;
3049
#ifdef WORDS_BIGENDIAN
3050
if (table->s->db_low_byte_first)
3056
memcpy_fixed((uchar*) &j,ptr,sizeof(j));
3057
return ((double) j);
3060
longlong Field_float::val_int(void)
3063
#ifdef WORDS_BIGENDIAN
3064
if (table->s->db_low_byte_first)
3070
memcpy_fixed((uchar*) &j,ptr,sizeof(j));
3071
return (longlong) rint(j);
3075
String *Field_float::val_str(String *val_buffer,
3076
String *val_ptr __attribute__((unused)))
3078
ASSERT_COLUMN_MARKED_FOR_READ;
3080
#ifdef WORDS_BIGENDIAN
3081
if (table->s->db_low_byte_first)
3087
memcpy_fixed((uchar*) &nr,ptr,sizeof(nr));
3089
uint to_length=max(field_length,70);
3090
val_buffer->alloc(to_length);
3091
char *to=(char*) val_buffer->ptr();
3094
if (dec >= NOT_FIXED_DEC)
3095
len= my_gcvt(nr, MY_GCVT_ARG_FLOAT, to_length - 1, to, NULL);
3099
We are safe here because the buffer length is >= 70, and
3100
fabs(float) < 10^39, dec < NOT_FIXED_DEC. So the resulting string
3101
will be not longer than 69 chars + terminating '\0'.
3103
len= my_fcvt(nr, dec, to, NULL);
3105
val_buffer->length((uint) len);
3107
prepend_zeros(val_buffer);
3112
int Field_float::cmp(const uchar *a_ptr, const uchar *b_ptr)
3115
#ifdef WORDS_BIGENDIAN
3116
if (table->s->db_low_byte_first)
3124
memcpy_fixed(&a,a_ptr,sizeof(float));
3125
memcpy_fixed(&b,b_ptr,sizeof(float));
3127
return (a < b) ? -1 : (a > b) ? 1 : 0;
3130
#define FLT_EXP_DIG (sizeof(float)*8-FLT_MANT_DIG)
3132
void Field_float::sort_string(uchar *to,uint length __attribute__((unused)))
3135
#ifdef WORDS_BIGENDIAN
3136
if (table->s->db_low_byte_first)
3142
memcpy_fixed(&nr,ptr,sizeof(float));
3145
if (nr == (float) 0.0)
3146
{ /* Change to zero string */
3148
bzero((char*) tmp+1,sizeof(nr)-1);
3152
#ifdef WORDS_BIGENDIAN
3153
memcpy_fixed(tmp,&nr,sizeof(nr));
3155
tmp[0]= ptr[3]; tmp[1]=ptr[2]; tmp[2]= ptr[1]; tmp[3]=ptr[0];
3157
if (tmp[0] & 128) /* Negative */
3158
{ /* make complement */
3160
for (i=0 ; i < sizeof(nr); i++)
3161
tmp[i]= (uchar) (tmp[i] ^ (uchar) 255);
3165
ushort exp_part=(((ushort) tmp[0] << 8) | (ushort) tmp[1] |
3167
exp_part+= (ushort) 1 << (16-1-FLT_EXP_DIG);
3168
tmp[0]= (uchar) (exp_part >> 8);
3169
tmp[1]= (uchar) exp_part;
3175
bool Field_float::send_binary(Protocol *protocol)
3177
ASSERT_COLUMN_MARKED_FOR_READ;
3178
return protocol->store((float) Field_float::val_real(), dec, (String*) 0);
3183
Save the field metadata for float fields.
3185
Saves the pack length in the first byte.
3187
@param metadata_ptr First byte of field metadata
3189
@returns number of bytes written to metadata_ptr
3191
int Field_float::do_save_field_metadata(uchar *metadata_ptr)
3193
*metadata_ptr= pack_length();
3198
void Field_float::sql_type(String &res) const
3200
if (dec == NOT_FIXED_DEC)
3202
res.set_ascii(STRING_WITH_LEN("float"));
3206
CHARSET_INFO *cs= res.charset();
3207
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
3208
"float(%d,%d)",(int) field_length,dec));
3210
add_zerofill_and_unsigned(res);
3214
/****************************************************************************
3215
double precision floating point numbers
3216
****************************************************************************/
3218
int Field_double::store(const char *from,uint len,CHARSET_INFO *cs)
3222
double nr= my_strntod(cs,(char*) from, len, &end, &error);
3223
if (error || (!len || (((uint) (end-from) != len) && table->in_use->count_cuted_fields)))
3225
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3226
(error ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED), 1);
3227
error= error ? 1 : 2;
3229
Field_double::store(nr);
3234
int Field_double::store(double nr)
3236
ASSERT_COLUMN_MARKED_FOR_WRITE;
3237
int error= truncate(&nr, DBL_MAX);
3239
#ifdef WORDS_BIGENDIAN
3240
if (table->s->db_low_byte_first)
3242
float8store(ptr,nr);
3246
doublestore(ptr,nr);
3251
int Field_double::store(longlong nr, bool unsigned_val)
3253
return Field_double::store(unsigned_val ? ulonglong2double((uint64_t) nr) :
3258
If a field has fixed length, truncate the double argument pointed to by 'nr'
3260
Also ensure that the argument is within [-max_value; max_value] range.
3263
int Field_real::truncate(double *nr, double max_value)
3272
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
3275
else if (unsigned_flag && res < 0)
3278
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
3284
uint order= field_length - dec;
3285
uint step= array_elements(log_10) - 1;
3287
for (; order > step; order-= step)
3288
max_value*= log_10[step];
3289
max_value*= log_10[order];
3290
max_value-= 1.0 / log_10[dec];
3292
/* Check for infinity so we don't get NaN in calculations */
3295
double tmp= rint((res - floor(res)) * log_10[dec]) / log_10[dec];
3296
res= floor(res) + tmp;
3300
if (res < -max_value)
3303
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
3305
else if (res > max_value)
3308
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
3319
int Field_real::store_decimal(const my_decimal *dm)
3322
my_decimal2double(E_DEC_FATAL_ERROR, dm, &dbl);
3326
double Field_double::val_real(void)
3328
ASSERT_COLUMN_MARKED_FOR_READ;
3330
#ifdef WORDS_BIGENDIAN
3331
if (table->s->db_low_byte_first)
3341
longlong Field_double::val_int(void)
3343
ASSERT_COLUMN_MARKED_FOR_READ;
3346
#ifdef WORDS_BIGENDIAN
3347
if (table->s->db_low_byte_first)
3354
/* Check whether we fit into longlong range */
3355
if (j <= (double) LONGLONG_MIN)
3357
res= (longlong) LONGLONG_MIN;
3360
if (j >= (double) (uint64_t) LONGLONG_MAX)
3362
res= (longlong) LONGLONG_MAX;
3365
return (longlong) rint(j);
3369
char buf[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
3370
String tmp(buf, sizeof(buf), &my_charset_latin1), *str;
3371
str= val_str(&tmp, 0);
3372
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
3373
ER_TRUNCATED_WRONG_VALUE,
3374
ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER",
3381
my_decimal *Field_real::val_decimal(my_decimal *decimal_value)
3383
ASSERT_COLUMN_MARKED_FOR_READ;
3384
double2my_decimal(E_DEC_FATAL_ERROR, val_real(), decimal_value);
3385
return decimal_value;
3389
String *Field_double::val_str(String *val_buffer,
3390
String *val_ptr __attribute__((unused)))
3392
ASSERT_COLUMN_MARKED_FOR_READ;
3394
#ifdef WORDS_BIGENDIAN
3395
if (table->s->db_low_byte_first)
3403
uint to_length=max(field_length, DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE);
3404
val_buffer->alloc(to_length);
3405
char *to=(char*) val_buffer->ptr();
3408
if (dec >= NOT_FIXED_DEC)
3409
len= my_gcvt(nr, MY_GCVT_ARG_DOUBLE, to_length - 1, to, NULL);
3411
len= my_fcvt(nr, dec, to, NULL);
3413
val_buffer->length((uint) len);
3415
prepend_zeros(val_buffer);
3419
bool Field_double::send_binary(Protocol *protocol)
3421
return protocol->store((double) Field_double::val_real(), dec, (String*) 0);
3425
int Field_double::cmp(const uchar *a_ptr, const uchar *b_ptr)
3427
ASSERT_COLUMN_MARKED_FOR_READ;
3429
#ifdef WORDS_BIGENDIAN
3430
if (table->s->db_low_byte_first)
3438
doubleget(a, a_ptr);
3439
doubleget(b, b_ptr);
3441
return (a < b) ? -1 : (a > b) ? 1 : 0;
3445
#define DBL_EXP_DIG (sizeof(double)*8-DBL_MANT_DIG)
3447
/* The following should work for IEEE */
3449
void Field_double::sort_string(uchar *to,uint length __attribute__((unused)))
3452
#ifdef WORDS_BIGENDIAN
3453
if (table->s->db_low_byte_first)
3460
change_double_for_sort(nr, to);
3465
Save the field metadata for double fields.
3467
Saves the pack length in the first byte of the field metadata array
3468
at index of *metadata_ptr.
3470
@param metadata_ptr First byte of field metadata
3472
@returns number of bytes written to metadata_ptr
3474
int Field_double::do_save_field_metadata(uchar *metadata_ptr)
3476
*metadata_ptr= pack_length();
3481
void Field_double::sql_type(String &res) const
3483
CHARSET_INFO *cs=res.charset();
3484
if (dec == NOT_FIXED_DEC)
3486
res.set_ascii(STRING_WITH_LEN("double"));
3490
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
3491
"double(%d,%d)",(int) field_length,dec));
3493
add_zerofill_and_unsigned(res);
3498
TIMESTAMP type holds datetime values in range from 1970-01-01 00:00:01 UTC to
3499
2038-01-01 00:00:00 UTC stored as number of seconds since Unix
3502
Up to one of timestamps columns in the table can be automatically
3503
set on row update and/or have NOW() as default value.
3504
TABLE::timestamp_field points to Field object for such timestamp with
3505
auto-set-on-update. TABLE::time_stamp holds offset in record + 1 for this
3506
field, and is used by handler code which performs updates required.
3508
Actually SQL-99 says that we should allow niladic functions (like NOW())
3509
as defaults for any field. Current limitations (only NOW() and only
3510
for one TIMESTAMP field) are because of restricted binary .frm format
3511
and should go away in the future.
3513
Also because of this limitation of binary .frm format we use 5 different
3514
unireg_check values with TIMESTAMP field to distinguish various cases of
3515
DEFAULT or ON UPDATE values. These values are:
3517
TIMESTAMP_OLD_FIELD - old timestamp, if there was not any fields with
3518
auto-set-on-update (or now() as default) in this table before, then this
3519
field has NOW() as default and is updated when row changes, else it is
3520
field which has 0 as default value and is not automatically updated.
3521
TIMESTAMP_DN_FIELD - field with NOW() as default but not set on update
3522
automatically (TIMESTAMP DEFAULT NOW())
3523
TIMESTAMP_UN_FIELD - field which is set on update automatically but has not
3524
NOW() as default (but it may has 0 or some other const timestamp as
3525
default) (TIMESTAMP ON UPDATE NOW()).
3526
TIMESTAMP_DNUN_FIELD - field which has now() as default and is auto-set on
3527
update. (TIMESTAMP DEFAULT NOW() ON UPDATE NOW())
3528
NONE - field which is not auto-set on update with some other than NOW()
3529
default value (TIMESTAMP DEFAULT 0).
3531
Note that TIMESTAMP_OLD_FIELDs are never created explicitly now, they are
3532
left only for preserving ability to read old tables. Such fields replaced
3533
with their newer analogs in CREATE TABLE and in SHOW CREATE TABLE. This is
3534
because we want to prefer NONE unireg_check before TIMESTAMP_OLD_FIELD for
3535
"TIMESTAMP DEFAULT 'Const'" field. (Old timestamps allowed such
3536
specification too but ignored default value for first timestamp, which of
3537
course is non-standard.) In most cases user won't notice any change, only
3538
exception is different behavior of old/new timestamps during ALTER TABLE.
3541
Field_timestamp::Field_timestamp(uchar *ptr_arg,
3542
uint32 len_arg __attribute__((__unused__)),
3543
uchar *null_ptr_arg, uchar null_bit_arg,
3544
enum utype unireg_check_arg,
3545
const char *field_name_arg,
3548
:Field_str(ptr_arg, MAX_DATETIME_WIDTH, null_ptr_arg, null_bit_arg,
3549
unireg_check_arg, field_name_arg, cs)
3551
/* For 4.0 MYD and 4.0 InnoDB compatibility */
3552
flags|= ZEROFILL_FLAG | UNSIGNED_FLAG;
3553
if (!share->timestamp_field && unireg_check != NONE)
3555
/* This timestamp has auto-update */
3556
share->timestamp_field= this;
3557
flags|= TIMESTAMP_FLAG;
3558
if (unireg_check != TIMESTAMP_DN_FIELD)
3559
flags|= ON_UPDATE_NOW_FLAG;
3564
Field_timestamp::Field_timestamp(bool maybe_null_arg,
3565
const char *field_name_arg,
3567
:Field_str((uchar*) 0, MAX_DATETIME_WIDTH,
3568
maybe_null_arg ? (uchar*) "": 0, 0,
3569
NONE, field_name_arg, cs)
3571
/* For 4.0 MYD and 4.0 InnoDB compatibility */
3572
flags|= ZEROFILL_FLAG | UNSIGNED_FLAG;
3573
if (unireg_check != TIMESTAMP_DN_FIELD)
3574
flags|= ON_UPDATE_NOW_FLAG;
3579
Get auto-set type for TIMESTAMP field.
3581
Returns value indicating during which operations this TIMESTAMP field
3582
should be auto-set to current timestamp.
3584
timestamp_auto_set_type Field_timestamp::get_auto_set_type() const
3586
switch (unireg_check)
3588
case TIMESTAMP_DN_FIELD:
3589
return TIMESTAMP_AUTO_SET_ON_INSERT;
3590
case TIMESTAMP_UN_FIELD:
3591
return TIMESTAMP_AUTO_SET_ON_UPDATE;
3592
case TIMESTAMP_OLD_FIELD:
3594
Although we can have several such columns in legacy tables this
3595
function should be called only for first of them (i.e. the one
3596
having auto-set property).
3598
DBUG_ASSERT(table->timestamp_field == this);
3600
case TIMESTAMP_DNUN_FIELD:
3601
return TIMESTAMP_AUTO_SET_ON_BOTH;
3604
Normally this function should not be called for TIMESTAMPs without
3608
return TIMESTAMP_NO_AUTO_SET;
3613
int Field_timestamp::store(const char *from,
3615
CHARSET_INFO *cs __attribute__((__unused__)))
3617
ASSERT_COLUMN_MARKED_FOR_WRITE;
3621
bool have_smth_to_conv;
3622
bool in_dst_time_gap;
3623
THD *thd= table ? table->in_use : current_thd;
3625
/* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */
3626
have_smth_to_conv= (str_to_datetime(from, len, &l_time, 1, &error) >
3627
MYSQL_TIMESTAMP_ERROR);
3629
if (error || !have_smth_to_conv)
3632
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED,
3633
from, len, MYSQL_TIMESTAMP_DATETIME, 1);
3636
/* Only convert a correct date (not a zero date) */
3637
if (have_smth_to_conv && l_time.month)
3639
if (!(tmp= TIME_to_timestamp(thd, &l_time, &in_dst_time_gap)))
3641
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3642
ER_WARN_DATA_OUT_OF_RANGE,
3643
from, len, MYSQL_TIMESTAMP_DATETIME, !error);
3646
else if (in_dst_time_gap)
3648
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3649
ER_WARN_INVALID_TIMESTAMP,
3650
from, len, MYSQL_TIMESTAMP_DATETIME, !error);
3654
store_timestamp(tmp);
3659
int Field_timestamp::store(double nr)
3662
if (nr < 0 || nr > 99991231235959.0)
3664
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3665
ER_WARN_DATA_OUT_OF_RANGE,
3666
nr, MYSQL_TIMESTAMP_DATETIME);
3667
nr= 0; // Avoid overflow on buff
3670
error|= Field_timestamp::store((longlong) rint(nr), FALSE);
3675
int Field_timestamp::store(longlong nr,
3676
bool unsigned_val __attribute__((__unused__)))
3678
ASSERT_COLUMN_MARKED_FOR_WRITE;
3680
my_time_t timestamp= 0;
3682
bool in_dst_time_gap;
3683
THD *thd= table ? table->in_use : current_thd;
3685
/* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */
3686
longlong tmp= number_to_datetime(nr, &l_time, (thd->variables.sql_mode &
3687
MODE_NO_ZERO_DATE) |
3688
MODE_NO_ZERO_IN_DATE, &error);
3696
if (!(timestamp= TIME_to_timestamp(thd, &l_time, &in_dst_time_gap)))
3698
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3699
ER_WARN_DATA_OUT_OF_RANGE,
3700
nr, MYSQL_TIMESTAMP_DATETIME, 1);
3703
if (in_dst_time_gap)
3705
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3706
ER_WARN_INVALID_TIMESTAMP,
3707
nr, MYSQL_TIMESTAMP_DATETIME, 1);
3711
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3712
WARN_DATA_TRUNCATED,
3713
nr, MYSQL_TIMESTAMP_DATETIME, 1);
3715
store_timestamp(timestamp);
3719
double Field_timestamp::val_real(void)
3721
ASSERT_COLUMN_MARKED_FOR_READ;
3722
return (double) Field_timestamp::val_int();
3725
longlong Field_timestamp::val_int(void)
3727
ASSERT_COLUMN_MARKED_FOR_READ;
3729
MYSQL_TIME time_tmp;
3730
THD *thd= table ? table->in_use : current_thd;
3732
thd->time_zone_used= 1;
3733
#ifdef WORDS_BIGENDIAN
3734
if (table && table->s->db_low_byte_first)
3735
temp=uint4korr(ptr);
3740
if (temp == 0L) // No time
3741
return(0); /* purecov: inspected */
3743
thd->variables.time_zone->gmt_sec_to_TIME(&time_tmp, (my_time_t)temp);
3745
return time_tmp.year * 10000000000LL + time_tmp.month * 100000000LL +
3746
time_tmp.day * 1000000L + time_tmp.hour * 10000L +
3747
time_tmp.minute * 100 + time_tmp.second;
3751
String *Field_timestamp::val_str(String *val_buffer, String *val_ptr)
3753
ASSERT_COLUMN_MARKED_FOR_READ;
3755
MYSQL_TIME time_tmp;
3756
THD *thd= table ? table->in_use : current_thd;
3759
val_buffer->alloc(field_length+1);
3760
to= (char*) val_buffer->ptr();
3761
val_buffer->length(field_length);
3763
thd->time_zone_used= 1;
3764
#ifdef WORDS_BIGENDIAN
3765
if (table && table->s->db_low_byte_first)
3766
temp=uint4korr(ptr);
3772
{ /* Zero time is "000000" */
3773
val_ptr->set(STRING_WITH_LEN("0000-00-00 00:00:00"), &my_charset_bin);
3776
val_buffer->set_charset(&my_charset_bin); // Safety
3778
thd->variables.time_zone->gmt_sec_to_TIME(&time_tmp,(my_time_t)temp);
3780
temp= time_tmp.year % 100;
3781
if (temp < YY_PART_YEAR - 1)
3791
temp2=temp/10; temp=temp-temp2*10;
3792
*to++= (char) ('0'+(char) (temp2));
3793
*to++= (char) ('0'+(char) (temp));
3795
temp=time_tmp.month;
3796
temp2=temp/10; temp=temp-temp2*10;
3797
*to++= (char) ('0'+(char) (temp2));
3798
*to++= (char) ('0'+(char) (temp));
3801
temp2=temp/10; temp=temp-temp2*10;
3802
*to++= (char) ('0'+(char) (temp2));
3803
*to++= (char) ('0'+(char) (temp));
3806
temp2=temp/10; temp=temp-temp2*10;
3807
*to++= (char) ('0'+(char) (temp2));
3808
*to++= (char) ('0'+(char) (temp));
3810
temp=time_tmp.minute;
3811
temp2=temp/10; temp=temp-temp2*10;
3812
*to++= (char) ('0'+(char) (temp2));
3813
*to++= (char) ('0'+(char) (temp));
3815
temp=time_tmp.second;
3816
temp2=temp/10; temp=temp-temp2*10;
3817
*to++= (char) ('0'+(char) (temp2));
3818
*to++= (char) ('0'+(char) (temp));
3824
bool Field_timestamp::get_date(MYSQL_TIME *ltime, uint fuzzydate)
3827
THD *thd= table ? table->in_use : current_thd;
3828
thd->time_zone_used= 1;
3829
#ifdef WORDS_BIGENDIAN
3830
if (table && table->s->db_low_byte_first)
3831
temp=uint4korr(ptr);
3836
{ /* Zero time is "000000" */
3837
if (fuzzydate & TIME_NO_ZERO_DATE)
3839
bzero((char*) ltime,sizeof(*ltime));
3843
thd->variables.time_zone->gmt_sec_to_TIME(ltime, (my_time_t)temp);
3848
bool Field_timestamp::get_time(MYSQL_TIME *ltime)
3850
return Field_timestamp::get_date(ltime,0);
3854
bool Field_timestamp::send_binary(Protocol *protocol)
3857
Field_timestamp::get_date(&tm, 0);
3858
return protocol->store(&tm);
3862
int Field_timestamp::cmp(const uchar *a_ptr, const uchar *b_ptr)
3865
#ifdef WORDS_BIGENDIAN
3866
if (table && table->s->db_low_byte_first)
3877
return ((uint32) a < (uint32) b) ? -1 : ((uint32) a > (uint32) b) ? 1 : 0;
3881
void Field_timestamp::sort_string(uchar *to,uint length __attribute__((unused)))
3883
#ifdef WORDS_BIGENDIAN
3884
if (!table || !table->s->db_low_byte_first)
3902
void Field_timestamp::sql_type(String &res) const
3904
res.set_ascii(STRING_WITH_LEN("timestamp"));
3908
void Field_timestamp::set_time()
3910
THD *thd= table ? table->in_use : current_thd;
3911
long tmp= (long) thd->query_start();
3913
store_timestamp(tmp);
3916
/****************************************************************************
3918
** In string context: HH:MM:SS
3919
** In number context: HHMMSS
3920
** Stored as a 3 byte unsigned int
3921
****************************************************************************/
3923
int Field_time::store(const char *from,
3925
CHARSET_INFO *cs __attribute__((__unused__)))
3932
if (str_to_time(from, len, <ime, &warning))
3936
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED,
3937
from, len, MYSQL_TIMESTAMP_TIME, 1);
3941
if (warning & MYSQL_TIME_WARN_TRUNCATED)
3943
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3944
WARN_DATA_TRUNCATED,
3945
from, len, MYSQL_TIMESTAMP_TIME, 1);
3948
if (warning & MYSQL_TIME_WARN_OUT_OF_RANGE)
3950
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3951
ER_WARN_DATA_OUT_OF_RANGE,
3952
from, len, MYSQL_TIMESTAMP_TIME, !error);
3957
tmp=(ltime.day*24L+ltime.hour)*10000L+(ltime.minute*100+ltime.second);
3967
int Field_time::store_time(MYSQL_TIME *ltime,
3968
timestamp_type time_type __attribute__((__unused__)))
3970
long tmp= ((ltime->month ? 0 : ltime->day * 24L) + ltime->hour) * 10000L +
3971
(ltime->minute * 100 + ltime->second);
3974
return Field_time::store((longlong) tmp, FALSE);
3978
int Field_time::store(double nr)
3980
ASSERT_COLUMN_MARKED_FOR_WRITE;
3983
if (nr > (double)TIME_MAX_VALUE)
3985
tmp= TIME_MAX_VALUE;
3986
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3987
ER_WARN_DATA_OUT_OF_RANGE, nr, MYSQL_TIMESTAMP_TIME);
3990
else if (nr < (double)-TIME_MAX_VALUE)
3992
tmp= -TIME_MAX_VALUE;
3993
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
3994
ER_WARN_DATA_OUT_OF_RANGE, nr, MYSQL_TIMESTAMP_TIME);
3999
tmp=(long) floor(fabs(nr)); // Remove fractions
4002
if (tmp % 100 > 59 || tmp/100 % 100 > 59)
4005
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
4006
ER_WARN_DATA_OUT_OF_RANGE, nr,
4007
MYSQL_TIMESTAMP_TIME);
4016
int Field_time::store(longlong nr, bool unsigned_val)
4018
ASSERT_COLUMN_MARKED_FOR_WRITE;
4021
if (nr < (longlong) -TIME_MAX_VALUE && !unsigned_val)
4023
tmp= -TIME_MAX_VALUE;
4024
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
4025
ER_WARN_DATA_OUT_OF_RANGE, nr,
4026
MYSQL_TIMESTAMP_TIME, 1);
4029
else if (nr > (longlong) TIME_MAX_VALUE || (nr < 0 && unsigned_val))
4031
tmp= TIME_MAX_VALUE;
4032
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
4033
ER_WARN_DATA_OUT_OF_RANGE, nr,
4034
MYSQL_TIMESTAMP_TIME, 1);
4040
if (tmp % 100 > 59 || tmp/100 % 100 > 59)
4043
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
4044
ER_WARN_DATA_OUT_OF_RANGE, nr,
4045
MYSQL_TIMESTAMP_TIME, 1);
4054
double Field_time::val_real(void)
4056
ASSERT_COLUMN_MARKED_FOR_READ;
4057
uint32 j= (uint32) uint3korr(ptr);
4061
longlong Field_time::val_int(void)
4063
ASSERT_COLUMN_MARKED_FOR_READ;
4064
return (longlong) sint3korr(ptr);
4070
This function is multi-byte safe as the result string is always of type
4074
String *Field_time::val_str(String *val_buffer,
4075
String *val_ptr __attribute__((unused)))
4077
ASSERT_COLUMN_MARKED_FOR_READ;
4079
val_buffer->alloc(MAX_DATE_STRING_REP_LENGTH);
4080
long tmp=(long) sint3korr(ptr);
4087
ltime.day= (uint) 0;
4088
ltime.hour= (uint) (tmp/10000);
4089
ltime.minute= (uint) (tmp/100 % 100);
4090
ltime.second= (uint) (tmp % 100);
4091
make_time((DATE_TIME_FORMAT*) 0, <ime, val_buffer);
4098
Normally we would not consider 'time' as a valid date, but we allow
4099
get_date() here to be able to do things like
4100
DATE_FORMAT(time, "%l.%i %p")
4103
bool Field_time::get_date(MYSQL_TIME *ltime, uint fuzzydate)
4106
THD *thd= table ? table->in_use : current_thd;
4107
if (!(fuzzydate & TIME_FUZZY_DATE))
4109
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
4110
ER_WARN_DATA_OUT_OF_RANGE,
4111
ER(ER_WARN_DATA_OUT_OF_RANGE), field_name,
4115
tmp=(long) sint3korr(ptr);
4122
ltime->hour=tmp/10000;
4123
tmp-=ltime->hour*10000;
4124
ltime->minute= tmp/100;
4125
ltime->second= tmp % 100;
4126
ltime->year= ltime->month= ltime->day= ltime->second_part= 0;
4131
bool Field_time::get_time(MYSQL_TIME *ltime)
4133
long tmp=(long) sint3korr(ptr);
4141
ltime->hour= (int) (tmp/10000);
4142
tmp-=ltime->hour*10000;
4143
ltime->minute= (int) tmp/100;
4144
ltime->second= (int) tmp % 100;
4145
ltime->second_part=0;
4146
ltime->time_type= MYSQL_TIMESTAMP_TIME;
4151
bool Field_time::send_binary(Protocol *protocol)
4154
Field_time::get_time(&tm);
4155
tm.day= tm.hour/24; // Move hours to days
4156
tm.hour-= tm.day*24;
4157
return protocol->store_time(&tm);
4161
int Field_time::cmp(const uchar *a_ptr, const uchar *b_ptr)
4164
a=(int32) sint3korr(a_ptr);
4165
b=(int32) sint3korr(b_ptr);
4166
return (a < b) ? -1 : (a > b) ? 1 : 0;
4169
void Field_time::sort_string(uchar *to,uint length __attribute__((unused)))
4171
to[0] = (uchar) (ptr[2] ^ 128);
4176
void Field_time::sql_type(String &res) const
4178
res.set_ascii(STRING_WITH_LEN("time"));
4181
/****************************************************************************
4183
** Save in a byte the year 0, 1901->2155
4184
** Can handle 2 byte or 4 byte years!
4185
****************************************************************************/
4187
int Field_year::store(const char *from, uint len,CHARSET_INFO *cs)
4189
ASSERT_COLUMN_MARKED_FOR_WRITE;
4192
longlong nr= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
4194
if (nr < 0 || (nr >= 100 && nr <= 1900) || nr > 2155 ||
4195
error == MY_ERRNO_ERANGE)
4198
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
4201
if (table->in_use->count_cuted_fields &&
4202
(error= check_int(cs, from, len, end, error)))
4204
if (error == 1) /* empty or incorrect string */
4212
if (nr != 0 || len != 4)
4214
if (nr < YY_PART_YEAR)
4215
nr+=100; // 2000 - 2069
4219
*ptr= (char) (uchar) nr;
4224
int Field_year::store(double nr)
4226
if (nr < 0.0 || nr >= 2155.0)
4228
(void) Field_year::store((longlong) -1, FALSE);
4231
return Field_year::store((longlong) nr, FALSE);
4235
int Field_year::store(longlong nr,
4236
bool unsigned_val __attribute__((__unused__)))
4238
ASSERT_COLUMN_MARKED_FOR_WRITE;
4239
if (nr < 0 || (nr >= 100 && nr <= 1900) || nr > 2155)
4242
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
4245
if (nr != 0 || field_length != 4) // 0000 -> 0; 00 -> 2000
4247
if (nr < YY_PART_YEAR)
4248
nr+=100; // 2000 - 2069
4252
*ptr= (char) (uchar) nr;
4257
bool Field_year::send_binary(Protocol *protocol)
4259
ASSERT_COLUMN_MARKED_FOR_READ;
4260
uint64_t tmp= Field_year::val_int();
4261
return protocol->store_short(tmp);
4265
double Field_year::val_real(void)
4267
return (double) Field_year::val_int();
4271
longlong Field_year::val_int(void)
4273
ASSERT_COLUMN_MARKED_FOR_READ;
4274
int tmp= (int) ptr[0];
4275
if (field_length != 4)
4276
tmp%=100; // Return last 2 char
4279
return (longlong) tmp;
4283
String *Field_year::val_str(String *val_buffer,
4284
String *val_ptr __attribute__((unused)))
4286
val_buffer->alloc(5);
4287
val_buffer->length(field_length);
4288
char *to=(char*) val_buffer->ptr();
4289
sprintf(to,field_length == 2 ? "%02d" : "%04d",(int) Field_year::val_int());
4294
void Field_year::sql_type(String &res) const
4296
CHARSET_INFO *cs=res.charset();
4297
res.length(cs->cset->snprintf(cs,(char*)res.ptr(),res.alloced_length(),
4298
"year(%d)",(int) field_length));
4302
/****************************************************************************
4303
** The new date type
4304
** This is identical to the old date type, but stored on 3 bytes instead of 4
4305
** In number context: YYYYMMDD
4306
****************************************************************************/
4309
Store string into a date field
4312
Field_newdate::store()
4314
len Length of date field
4315
cs Character set (not used)
4319
1 Value was cut during conversion
4321
3 Datetime value that was cut (warning level NOTE)
4322
This is used by opt_range.cc:get_mm_leaf(). Note that there is a
4323
nearly-identical class Field_date doesn't ever return 3 from its
4327
int Field_newdate::store(const char *from,
4329
CHARSET_INFO *cs __attribute__((__unused__)))
4331
ASSERT_COLUMN_MARKED_FOR_WRITE;
4335
THD *thd= table ? table->in_use : current_thd;
4336
enum enum_mysql_timestamp_type ret;
4337
if ((ret= str_to_datetime(from, len, &l_time,
4339
(thd->variables.sql_mode &
4340
(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE |
4341
MODE_INVALID_DATES))),
4342
&error)) <= MYSQL_TIMESTAMP_ERROR)
4349
tmp= l_time.day + l_time.month*32 + l_time.year*16*32;
4350
if (!error && (ret != MYSQL_TIMESTAMP_DATE) &&
4351
(l_time.hour || l_time.minute || l_time.second || l_time.second_part))
4352
error= 3; // Datetime was cut (note)
4356
set_datetime_warning(error == 3 ? MYSQL_ERROR::WARN_LEVEL_NOTE :
4357
MYSQL_ERROR::WARN_LEVEL_WARN,
4358
WARN_DATA_TRUNCATED,
4359
from, len, MYSQL_TIMESTAMP_DATE, 1);
4361
int3store(ptr, tmp);
4366
int Field_newdate::store(double nr)
4368
if (nr < 0.0 || nr > 99991231235959.0)
4370
int3store(ptr,(int32) 0);
4371
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
4372
WARN_DATA_TRUNCATED, nr, MYSQL_TIMESTAMP_DATE);
4375
return Field_newdate::store((longlong) rint(nr), FALSE);
4379
int Field_newdate::store(longlong nr,
4380
bool unsigned_val __attribute__((__unused__)))
4382
ASSERT_COLUMN_MARKED_FOR_WRITE;
4386
THD *thd= table ? table->in_use : current_thd;
4387
if (number_to_datetime(nr, &l_time,
4389
(thd->variables.sql_mode &
4390
(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE |
4391
MODE_INVALID_DATES))),
4398
tmp= l_time.day + l_time.month*32 + l_time.year*16*32;
4400
if (!error && l_time.time_type != MYSQL_TIMESTAMP_DATE &&
4401
(l_time.hour || l_time.minute || l_time.second || l_time.second_part))
4405
set_datetime_warning(error == 3 ? MYSQL_ERROR::WARN_LEVEL_NOTE :
4406
MYSQL_ERROR::WARN_LEVEL_WARN,
4408
ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED,
4409
nr,MYSQL_TIMESTAMP_DATE, 1);
4416
int Field_newdate::store_time(MYSQL_TIME *ltime,timestamp_type time_type)
4418
ASSERT_COLUMN_MARKED_FOR_WRITE;
4421
if (time_type == MYSQL_TIMESTAMP_DATE ||
4422
time_type == MYSQL_TIMESTAMP_DATETIME)
4424
tmp=ltime->year*16*32+ltime->month*32+ltime->day;
4425
if (check_date(ltime, tmp != 0,
4427
(current_thd->variables.sql_mode &
4428
(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE |
4429
MODE_INVALID_DATES))), &error))
4431
char buff[MAX_DATE_STRING_REP_LENGTH];
4432
String str(buff, sizeof(buff), &my_charset_latin1);
4433
make_date((DATE_TIME_FORMAT *) 0, ltime, &str);
4434
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED,
4435
str.ptr(), str.length(), MYSQL_TIMESTAMP_DATE, 1);
4437
if (!error && ltime->time_type != MYSQL_TIMESTAMP_DATE &&
4438
(ltime->hour || ltime->minute || ltime->second || ltime->second_part))
4440
char buff[MAX_DATE_STRING_REP_LENGTH];
4441
String str(buff, sizeof(buff), &my_charset_latin1);
4442
make_datetime((DATE_TIME_FORMAT *) 0, ltime, &str);
4443
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_NOTE,
4444
WARN_DATA_TRUNCATED,
4445
str.ptr(), str.length(), MYSQL_TIMESTAMP_DATE, 1);
4453
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
4460
bool Field_newdate::send_binary(Protocol *protocol)
4463
Field_newdate::get_date(&tm,0);
4464
return protocol->store_date(&tm);
4468
double Field_newdate::val_real(void)
4470
ASSERT_COLUMN_MARKED_FOR_READ;
4471
return (double) Field_newdate::val_int();
4475
longlong Field_newdate::val_int(void)
4477
ASSERT_COLUMN_MARKED_FOR_READ;
4478
ulong j= uint3korr(ptr);
4479
j= (j % 32L)+(j / 32L % 16L)*100L + (j/(16L*32L))*10000L;
4480
return (longlong) j;
4484
String *Field_newdate::val_str(String *val_buffer,
4485
String *val_ptr __attribute__((unused)))
4487
ASSERT_COLUMN_MARKED_FOR_READ;
4488
val_buffer->alloc(field_length);
4489
val_buffer->length(field_length);
4490
uint32 tmp=(uint32) uint3korr(ptr);
4492
char *pos=(char*) val_buffer->ptr()+10;
4494
/* Open coded to get more speed */
4495
*pos--=0; // End NULL
4496
part=(int) (tmp & 31);
4497
*pos--= (char) ('0'+part%10);
4498
*pos--= (char) ('0'+part/10);
4500
part=(int) (tmp >> 5 & 15);
4501
*pos--= (char) ('0'+part%10);
4502
*pos--= (char) ('0'+part/10);
4504
part=(int) (tmp >> 9);
4505
*pos--= (char) ('0'+part%10); part/=10;
4506
*pos--= (char) ('0'+part%10); part/=10;
4507
*pos--= (char) ('0'+part%10); part/=10;
4508
*pos= (char) ('0'+part);
4513
bool Field_newdate::get_date(MYSQL_TIME *ltime,uint fuzzydate)
4515
uint32 tmp=(uint32) uint3korr(ptr);
4516
ltime->day= tmp & 31;
4517
ltime->month= (tmp >> 5) & 15;
4518
ltime->year= (tmp >> 9);
4519
ltime->time_type= MYSQL_TIMESTAMP_DATE;
4520
ltime->hour= ltime->minute= ltime->second= ltime->second_part= ltime->neg= 0;
4521
return ((!(fuzzydate & TIME_FUZZY_DATE) && (!ltime->month || !ltime->day)) ?
4526
bool Field_newdate::get_time(MYSQL_TIME *ltime)
4528
return Field_newdate::get_date(ltime,0);
4532
int Field_newdate::cmp(const uchar *a_ptr, const uchar *b_ptr)
4535
a=(uint32) uint3korr(a_ptr);
4536
b=(uint32) uint3korr(b_ptr);
4537
return (a < b) ? -1 : (a > b) ? 1 : 0;
4541
void Field_newdate::sort_string(uchar *to,uint length __attribute__((unused)))
4549
void Field_newdate::sql_type(String &res) const
4551
res.set_ascii(STRING_WITH_LEN("date"));
4555
/****************************************************************************
4557
** In string context: YYYY-MM-DD HH:MM:DD
4558
** In number context: YYYYMMDDHHMMDD
4559
** Stored as a 8 byte unsigned int. Should sometimes be change to a 6 byte int.
4560
****************************************************************************/
4562
int Field_datetime::store(const char *from,
4564
CHARSET_INFO *cs __attribute__((__unused__)))
4566
ASSERT_COLUMN_MARKED_FOR_WRITE;
4567
MYSQL_TIME time_tmp;
4570
enum enum_mysql_timestamp_type func_res;
4571
THD *thd= table ? table->in_use : current_thd;
4573
func_res= str_to_datetime(from, len, &time_tmp,
4575
(thd->variables.sql_mode &
4576
(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE |
4577
MODE_INVALID_DATES))),
4579
if ((int) func_res > (int) MYSQL_TIMESTAMP_ERROR)
4580
tmp= TIME_to_ulonglong_datetime(&time_tmp);
4582
error= 1; // Fix if invalid zero date
4585
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
4586
ER_WARN_DATA_OUT_OF_RANGE,
4587
from, len, MYSQL_TIMESTAMP_DATETIME, 1);
4589
#ifdef WORDS_BIGENDIAN
4590
if (table && table->s->db_low_byte_first)
4596
longlongstore(ptr,tmp);
4601
int Field_datetime::store(double nr)
4604
if (nr < 0.0 || nr > 99991231235959.0)
4606
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
4607
ER_WARN_DATA_OUT_OF_RANGE,
4608
nr, MYSQL_TIMESTAMP_DATETIME);
4612
error|= Field_datetime::store((longlong) rint(nr), FALSE);
4617
int Field_datetime::store(longlong nr,
4618
bool unsigned_val __attribute__((__unused__)))
4620
ASSERT_COLUMN_MARKED_FOR_WRITE;
4621
MYSQL_TIME not_used;
4623
longlong initial_nr= nr;
4624
THD *thd= table ? table->in_use : current_thd;
4626
nr= number_to_datetime(nr, ¬_used, (TIME_FUZZY_DATE |
4627
(thd->variables.sql_mode &
4628
(MODE_NO_ZERO_IN_DATE |
4630
MODE_INVALID_DATES))), &error);
4639
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
4640
error == 2 ? ER_WARN_DATA_OUT_OF_RANGE :
4641
WARN_DATA_TRUNCATED, initial_nr,
4642
MYSQL_TIMESTAMP_DATETIME, 1);
4644
#ifdef WORDS_BIGENDIAN
4645
if (table && table->s->db_low_byte_first)
4651
longlongstore(ptr,nr);
4656
int Field_datetime::store_time(MYSQL_TIME *ltime,timestamp_type time_type)
4658
ASSERT_COLUMN_MARKED_FOR_WRITE;
4662
We don't perform range checking here since values stored in TIME
4663
structure always fit into DATETIME range.
4665
if (time_type == MYSQL_TIMESTAMP_DATE ||
4666
time_type == MYSQL_TIMESTAMP_DATETIME)
4668
tmp=((ltime->year*10000L+ltime->month*100+ltime->day)*1000000LL+
4669
(ltime->hour*10000L+ltime->minute*100+ltime->second));
4670
if (check_date(ltime, tmp != 0,
4672
(current_thd->variables.sql_mode &
4673
(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE |
4674
MODE_INVALID_DATES))), &error))
4676
char buff[MAX_DATE_STRING_REP_LENGTH];
4677
String str(buff, sizeof(buff), &my_charset_latin1);
4678
make_datetime((DATE_TIME_FORMAT *) 0, ltime, &str);
4679
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED,
4680
str.ptr(), str.length(), MYSQL_TIMESTAMP_DATETIME,1);
4687
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
4689
#ifdef WORDS_BIGENDIAN
4690
if (table && table->s->db_low_byte_first)
4696
longlongstore(ptr,tmp);
4700
bool Field_datetime::send_binary(Protocol *protocol)
4703
Field_datetime::get_date(&tm, TIME_FUZZY_DATE);
4704
return protocol->store(&tm);
4708
double Field_datetime::val_real(void)
4710
return (double) Field_datetime::val_int();
4713
longlong Field_datetime::val_int(void)
4715
ASSERT_COLUMN_MARKED_FOR_READ;
4717
#ifdef WORDS_BIGENDIAN
4718
if (table && table->s->db_low_byte_first)
4727
String *Field_datetime::val_str(String *val_buffer,
4728
String *val_ptr __attribute__((unused)))
4730
ASSERT_COLUMN_MARKED_FOR_READ;
4731
val_buffer->alloc(field_length);
4732
val_buffer->length(field_length);
4738
#ifdef WORDS_BIGENDIAN
4739
if (table && table->s->db_low_byte_first)
4743
longlongget(tmp,ptr);
4746
Avoid problem with slow longlong arithmetic and sprintf
4749
part1=(long) (tmp/1000000LL);
4750
part2=(long) (tmp - (uint64_t) part1*1000000LL);
4752
pos=(char*) val_buffer->ptr() + MAX_DATETIME_WIDTH;
4754
*pos--= (char) ('0'+(char) (part2%10)); part2/=10;
4755
*pos--= (char) ('0'+(char) (part2%10)); part3= (int) (part2 / 10);
4757
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
4758
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
4760
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
4761
*pos--= (char) ('0'+(char) part3);
4763
*pos--= (char) ('0'+(char) (part1%10)); part1/=10;
4764
*pos--= (char) ('0'+(char) (part1%10)); part1/=10;
4766
*pos--= (char) ('0'+(char) (part1%10)); part1/=10;
4767
*pos--= (char) ('0'+(char) (part1%10)); part3= (int) (part1/10);
4769
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
4770
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
4771
*pos--= (char) ('0'+(char) (part3%10)); part3/=10;
4772
*pos=(char) ('0'+(char) part3);
4776
bool Field_datetime::get_date(MYSQL_TIME *ltime, uint fuzzydate)
4778
longlong tmp=Field_datetime::val_int();
4780
part1=(uint32) (tmp/1000000LL);
4781
part2=(uint32) (tmp - (uint64_t) part1*1000000LL);
4783
ltime->time_type= MYSQL_TIMESTAMP_DATETIME;
4785
ltime->second_part= 0;
4786
ltime->second= (int) (part2%100);
4787
ltime->minute= (int) (part2/100%100);
4788
ltime->hour= (int) (part2/10000);
4789
ltime->day= (int) (part1%100);
4790
ltime->month= (int) (part1/100%100);
4791
ltime->year= (int) (part1/10000);
4792
return (!(fuzzydate & TIME_FUZZY_DATE) && (!ltime->month || !ltime->day)) ? 1 : 0;
4795
bool Field_datetime::get_time(MYSQL_TIME *ltime)
4797
return Field_datetime::get_date(ltime,0);
4800
int Field_datetime::cmp(const uchar *a_ptr, const uchar *b_ptr)
4803
#ifdef WORDS_BIGENDIAN
4804
if (table && table->s->db_low_byte_first)
4812
longlongget(a,a_ptr);
4813
longlongget(b,b_ptr);
4815
return ((uint64_t) a < (uint64_t) b) ? -1 :
4816
((uint64_t) a > (uint64_t) b) ? 1 : 0;
4819
void Field_datetime::sort_string(uchar *to,uint length __attribute__((unused)))
4821
#ifdef WORDS_BIGENDIAN
4822
if (!table || !table->s->db_low_byte_first)
4848
void Field_datetime::sql_type(String &res) const
4850
res.set_ascii(STRING_WITH_LEN("datetime"));
4853
/****************************************************************************
4855
** A string may be varchar or binary
4856
****************************************************************************/
1414
4859
Report "not well formed" or "cannot convert" error
1598
5090
return store(str.ptr(), str.length(), str.charset());
1601
uint32_t Field_longstr::max_data_length() const
5093
uint32 Field_longstr::max_data_length() const
1603
5095
return field_length + (field_length > 255 ? 2 : 1);
5099
double Field_string::val_real(void)
5101
ASSERT_COLUMN_MARKED_FOR_READ;
5104
CHARSET_INFO *cs= charset();
5107
result= my_strntod(cs,(char*) ptr,field_length,&end,&error);
5108
if (!table->in_use->no_errors &&
5109
(error || (field_length != (uint32)(end - (char*) ptr) &&
5110
!check_if_only_end_space(cs, end,
5111
(char*) ptr + field_length))))
5113
char buf[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
5114
String tmp(buf, sizeof(buf), cs);
5115
tmp.copy((char*) ptr, field_length, cs);
5116
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
5117
ER_TRUNCATED_WRONG_VALUE,
5118
ER(ER_TRUNCATED_WRONG_VALUE),
5119
"DOUBLE", tmp.c_ptr());
5125
longlong Field_string::val_int(void)
5127
ASSERT_COLUMN_MARKED_FOR_READ;
5130
CHARSET_INFO *cs= charset();
5133
result= my_strntoll(cs, (char*) ptr,field_length,10,&end,&error);
5134
if (!table->in_use->no_errors &&
5135
(error || (field_length != (uint32)(end - (char*) ptr) &&
5136
!check_if_only_end_space(cs, end,
5137
(char*) ptr + field_length))))
5139
char buf[LONGLONG_TO_STRING_CONVERSION_BUFFER_SIZE];
5140
String tmp(buf, sizeof(buf), cs);
5141
tmp.copy((char*) ptr, field_length, cs);
5142
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
5143
ER_TRUNCATED_WRONG_VALUE,
5144
ER(ER_TRUNCATED_WRONG_VALUE),
5145
"INTEGER", tmp.c_ptr());
5151
String *Field_string::val_str(String *val_buffer __attribute__((unused)),
5154
ASSERT_COLUMN_MARKED_FOR_READ;
5155
/* See the comment for Field_long::store(long long) */
5156
DBUG_ASSERT(table->in_use == current_thd);
5158
if (table->in_use->variables.sql_mode &
5159
MODE_PAD_CHAR_TO_FULL_LENGTH)
5160
length= my_charpos(field_charset, ptr, ptr + field_length, field_length);
5162
length= field_charset->cset->lengthsp(field_charset, (const char*) ptr,
5164
val_ptr->set((const char*) ptr, length, field_charset);
5169
my_decimal *Field_string::val_decimal(my_decimal *decimal_value)
5171
ASSERT_COLUMN_MARKED_FOR_READ;
5172
int err= str2my_decimal(E_DEC_FATAL_ERROR, (char*) ptr, field_length,
5173
charset(), decimal_value);
5174
if (!table->in_use->no_errors && err)
5176
char buf[DECIMAL_TO_STRING_CONVERSION_BUFFER_SIZE];
5177
CHARSET_INFO *cs= charset();
5178
String tmp(buf, sizeof(buf), cs);
5179
tmp.copy((char*) ptr, field_length, cs);
5180
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
5181
ER_TRUNCATED_WRONG_VALUE,
5182
ER(ER_TRUNCATED_WRONG_VALUE),
5183
"DECIMAL", tmp.c_ptr());
5186
return decimal_value;
5190
int Field_string::cmp(const uchar *a_ptr, const uchar *b_ptr)
5194
if (field_charset->mbmaxlen != 1)
5196
uint char_len= field_length/field_charset->mbmaxlen;
5197
a_len= my_charpos(field_charset, a_ptr, a_ptr + field_length, char_len);
5198
b_len= my_charpos(field_charset, b_ptr, b_ptr + field_length, char_len);
5201
a_len= b_len= field_length;
5203
We have to remove end space to be able to compare multi-byte-characters
5204
like in latin_de 'ae' and 0xe4
5206
return field_charset->coll->strnncollsp(field_charset,
5213
void Field_string::sort_string(uchar *to,uint length)
5215
IF_DBUG(uint tmp=) my_strnxfrm(field_charset,
5218
DBUG_ASSERT(tmp == length);
5222
void Field_string::sql_type(String &res) const
5224
THD *thd= table->in_use;
5225
CHARSET_INFO *cs=res.charset();
5228
length= cs->cset->snprintf(cs,(char*) res.ptr(),
5229
res.alloced_length(), "%s(%d)",
5230
((type() == MYSQL_TYPE_VAR_STRING &&
5231
!thd->variables.new_mode) ?
5232
(has_charset() ? "varchar" : "varbinary") :
5233
(has_charset() ? "char" : "binary")),
5234
(int) field_length / charset()->mbmaxlen);
5236
if ((thd->variables.sql_mode & (MODE_MYSQL323 | MODE_MYSQL40)) &&
5237
has_charset() && (charset()->state & MY_CS_BINSORT))
5238
res.append(STRING_WITH_LEN(" binary"));
5242
uchar *Field_string::pack(uchar *to, const uchar *from,
5244
bool low_byte_first __attribute__((unused)))
5246
uint length= min(field_length,max_length);
5247
uint local_char_length= max_length/field_charset->mbmaxlen;
5248
if (length > local_char_length)
5249
local_char_length= my_charpos(field_charset, from, from+length,
5251
set_if_smaller(length, local_char_length);
5252
while (length && from[length-1] == field_charset->pad_char)
5255
// Length always stored little-endian
5256
*to++= (uchar) length;
5257
if (field_length > 255)
5258
*to++= (uchar) (length >> 8);
5260
// Store the actual bytes of the string
5261
memcpy(to, from, length);
5267
Unpack a string field from row data.
5269
This method is used to unpack a string field from a master whose size
5270
of the field is less than that of the slave. Note that there can be a
5271
variety of field types represented with this class. Certain types like
5272
ENUM or SET are processed differently. Hence, the upper byte of the
5273
@c param_data argument contains the result of field->real_type() from
5276
@param to Destination of the data
5277
@param from Source of the data
5278
@param param_data Real type (upper) and length (lower) values
5280
@return New pointer into memory based on from + length of the data
5283
Field_string::unpack(uchar *to,
5286
bool low_byte_first __attribute__((unused)))
5289
param_data ? min(param_data & 0x00ff, field_length) : field_length;
5292
if (from_length > 255)
5294
length= uint2korr(from);
5298
length= (uint) *from++;
5300
memcpy(to, from, length);
5301
// Pad the string with the pad character of the fields charset
5302
bfill(to + length, field_length - length, field_charset->pad_char);
5308
Save the field metadata for string fields.
5310
Saves the real type in the first byte and the field length in the
5311
second byte of the field metadata array at index of *metadata_ptr and
5312
*(metadata_ptr + 1).
5314
@param metadata_ptr First byte of field metadata
5316
@returns number of bytes written to metadata_ptr
5318
int Field_string::do_save_field_metadata(uchar *metadata_ptr)
5320
*metadata_ptr= real_type();
5321
*(metadata_ptr + 1)= field_length;
5327
Compare two packed keys
5334
insert_or_update 1 if this is an insert or update
5342
int Field_string::pack_cmp(const uchar *a, const uchar *b, uint length,
5343
my_bool insert_or_update)
5345
uint a_length, b_length;
5348
a_length= uint2korr(a);
5349
b_length= uint2korr(b);
5355
a_length= (uint) *a++;
5356
b_length= (uint) *b++;
5358
return field_charset->coll->strnncollsp(field_charset,
5366
Compare a packed key against row.
5368
@param key Original key
5369
@param length Key length. (May be less than field length)
5370
@param insert_or_update 1 if this is an insert or update
5380
int Field_string::pack_cmp(const uchar *key, uint length,
5381
my_bool insert_or_update)
5383
uint row_length, local_key_length;
5387
local_key_length= uint2korr(key);
5391
local_key_length= (uint) *key++;
5393
/* Only use 'length' of key, not field_length */
5395
while (end > ptr && end[-1] == ' ')
5397
row_length= (uint) (end - ptr);
5399
return field_charset->coll->strnncollsp(field_charset,
5401
key, local_key_length,
5406
uint Field_string::packed_col_length(const uchar *data_ptr, uint length)
5409
return uint2korr(data_ptr)+2;
5410
return (uint) *data_ptr + 1;
5414
uint Field_string::max_packed_col_length(uint max_length)
5416
return (max_length > 255 ? 2 : 1)+max_length;
5420
uint Field_string::get_key_image(uchar *buff,
5422
imagetype type_arg __attribute__((__unused__)))
5424
uint bytes = my_charpos(field_charset, (char*) ptr,
5425
(char*) ptr + field_length,
5426
length / field_charset->mbmaxlen);
5427
memcpy(buff, ptr, bytes);
5429
field_charset->cset->fill(field_charset, (char*) buff + bytes,
5430
length - bytes, field_charset->pad_char);
5435
Field *Field_string::new_field(MEM_ROOT *root, struct st_table *new_table,
5439
if (type() != MYSQL_TYPE_VAR_STRING || keep_type)
5440
field= Field::new_field(root, new_table, keep_type);
5441
else if ((field= new Field_varstring(field_length, maybe_null(), field_name,
5442
new_table->s, charset())))
5445
Old VARCHAR field which should be modified to a VARCHAR on copy
5446
This is done to ensure that ALTER TABLE will convert old VARCHAR fields
5447
to now VARCHAR fields.
5449
field->init(new_table);
5451
Normally orig_table is different from table only if field was created
5452
via ::new_field. Here we alter the type of field, so ::new_field is
5453
not applicable. But we still need to preserve the original field
5454
metadata for the client-server protocol.
5456
field->orig_table= orig_table;
5462
/****************************************************************************
5464
Data in field->ptr is stored as:
5465
1 or 2 bytes length-prefix-header (from Field_varstring::length_bytes)
5469
When VARCHAR is stored in a key (for handler::index_read() etc) it's always
5470
stored with a 2 byte prefix. (Just like blob keys).
5472
Normally length_bytes is calculated as (field_length < 256 : 1 ? 2)
5473
The exception is if there is a prefix key field that is part of a long
5474
VARCHAR, in which case field_length for this may be 1 but the length_bytes
5476
****************************************************************************/
5478
const uint Field_varstring::MAX_SIZE= UINT_MAX16;
5481
Save the field metadata for varstring fields.
5483
Saves the field length in the first byte. Note: may consume
5484
2 bytes. Caller must ensure second byte is contiguous with
5485
first byte (e.g. array index 0,1).
5487
@param metadata_ptr First byte of field metadata
5489
@returns number of bytes written to metadata_ptr
5491
int Field_varstring::do_save_field_metadata(uchar *metadata_ptr)
5493
char *ptr= (char *)metadata_ptr;
5494
DBUG_ASSERT(field_length <= 65535);
5495
int2store(ptr, field_length);
5499
int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
5501
ASSERT_COLUMN_MARKED_FOR_WRITE;
5503
const char *well_formed_error_pos;
5504
const char *cannot_convert_error_pos;
5505
const char *from_end_pos;
5507
copy_length= well_formed_copy_nchars(field_charset,
5508
(char*) ptr + length_bytes,
5511
field_length / field_charset->mbmaxlen,
5512
&well_formed_error_pos,
5513
&cannot_convert_error_pos,
5516
if (length_bytes == 1)
5517
*ptr= (uchar) copy_length;
5519
int2store(ptr, copy_length);
5521
if (check_string_copy_error(this, well_formed_error_pos,
5522
cannot_convert_error_pos, from + length, cs))
5525
return report_if_important_data(from_end_pos, from + length);
5529
int Field_varstring::store(longlong nr, bool unsigned_val)
5533
length= (uint) (field_charset->cset->longlong10_to_str)(field_charset,
5539
return Field_varstring::store(buff, length, field_charset);
5543
double Field_varstring::val_real(void)
5545
ASSERT_COLUMN_MARKED_FOR_READ;
5548
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
5549
return my_strntod(field_charset, (char*) ptr+length_bytes, length,
5550
&end_not_used, ¬_used);
5554
longlong Field_varstring::val_int(void)
5556
ASSERT_COLUMN_MARKED_FOR_READ;
5559
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
5560
return my_strntoll(field_charset, (char*) ptr+length_bytes, length, 10,
5561
&end_not_used, ¬_used);
5564
String *Field_varstring::val_str(String *val_buffer __attribute__((unused)),
5567
ASSERT_COLUMN_MARKED_FOR_READ;
5568
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
5569
val_ptr->set((const char*) ptr+length_bytes, length, field_charset);
5574
my_decimal *Field_varstring::val_decimal(my_decimal *decimal_value)
5576
ASSERT_COLUMN_MARKED_FOR_READ;
5577
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
5578
str2my_decimal(E_DEC_FATAL_ERROR, (char*) ptr+length_bytes, length,
5579
charset(), decimal_value);
5580
return decimal_value;
5584
int Field_varstring::cmp_max(const uchar *a_ptr, const uchar *b_ptr,
5587
uint a_length, b_length;
5590
if (length_bytes == 1)
5592
a_length= (uint) *a_ptr;
5593
b_length= (uint) *b_ptr;
5597
a_length= uint2korr(a_ptr);
5598
b_length= uint2korr(b_ptr);
5600
set_if_smaller(a_length, max_len);
5601
set_if_smaller(b_length, max_len);
5602
diff= field_charset->coll->strnncollsp(field_charset,
5615
varstring and blob keys are ALWAYS stored with a 2 byte length prefix
5618
int Field_varstring::key_cmp(const uchar *key_ptr, uint max_key_length)
5620
uint length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
5621
uint local_char_length= max_key_length / field_charset->mbmaxlen;
5623
local_char_length= my_charpos(field_charset, ptr + length_bytes,
5624
ptr + length_bytes + length, local_char_length);
5625
set_if_smaller(length, local_char_length);
5626
return field_charset->coll->strnncollsp(field_charset,
5631
uint2korr(key_ptr), 0);
5636
Compare to key segments (always 2 byte length prefix).
5639
This is used only to compare key segments created for index_read().
5640
(keys are created and compared in key.cc)
5643
int Field_varstring::key_cmp(const uchar *a,const uchar *b)
5645
return field_charset->coll->strnncollsp(field_charset,
5646
a + HA_KEY_BLOB_LENGTH,
5648
b + HA_KEY_BLOB_LENGTH,
5654
void Field_varstring::sort_string(uchar *to,uint length)
5656
uint tot_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
5658
if (field_charset == &my_charset_bin)
5660
/* Store length last in high-byte order to sort longer strings first */
5661
if (length_bytes == 1)
5662
to[length-1]= tot_length;
5664
mi_int2store(to+length-2, tot_length);
5665
length-= length_bytes;
5668
tot_length= my_strnxfrm(field_charset,
5669
to, length, ptr + length_bytes,
5671
DBUG_ASSERT(tot_length == length);
5675
enum ha_base_keytype Field_varstring::key_type() const
5677
enum ha_base_keytype res;
5680
res= length_bytes == 1 ? HA_KEYTYPE_VARBINARY1 : HA_KEYTYPE_VARBINARY2;
5682
res= length_bytes == 1 ? HA_KEYTYPE_VARTEXT1 : HA_KEYTYPE_VARTEXT2;
5687
void Field_varstring::sql_type(String &res) const
5689
THD *thd= table->in_use;
5690
CHARSET_INFO *cs=res.charset();
5693
length= cs->cset->snprintf(cs,(char*) res.ptr(),
5694
res.alloced_length(), "%s(%d)",
5695
(has_charset() ? "varchar" : "varbinary"),
5696
(int) field_length / charset()->mbmaxlen);
5698
if ((thd->variables.sql_mode & (MODE_MYSQL323 | MODE_MYSQL40)) &&
5699
has_charset() && (charset()->state & MY_CS_BINSORT))
5700
res.append(STRING_WITH_LEN(" binary"));
5704
uint32 Field_varstring::data_length()
5706
return length_bytes == 1 ? (uint32) *ptr : uint2korr(ptr);
5709
uint32 Field_varstring::used_length()
5711
return length_bytes == 1 ? 1 + (uint32) (uchar) *ptr : 2 + uint2korr(ptr);
5715
Functions to create a packed row.
5716
Here the number of length bytes are depending on the given max_length
5719
uchar *Field_varstring::pack(uchar *to, const uchar *from,
5721
bool low_byte_first __attribute__((unused)))
5723
uint length= length_bytes == 1 ? (uint) *from : uint2korr(from);
5724
set_if_smaller(max_length, field_length);
5725
if (length > max_length)
5728
/* Length always stored little-endian */
5729
*to++= length & 0xFF;
5730
if (max_length > 255)
5731
*to++= (length >> 8) & 0xFF;
5733
/* Store bytes of string */
5735
memcpy(to, from+length_bytes, length);
5741
Field_varstring::pack_key(uchar *to, const uchar *key, uint max_length,
5742
bool low_byte_first __attribute__((unused)))
5744
uint length= length_bytes == 1 ? (uint) *key : uint2korr(key);
5745
uint local_char_length= ((field_charset->mbmaxlen > 1) ?
5746
max_length/field_charset->mbmaxlen : max_length);
5748
if (length > local_char_length)
5750
local_char_length= my_charpos(field_charset, key, key+length,
5752
set_if_smaller(length, local_char_length);
5754
*to++= (char) (length & 255);
5755
if (max_length > 255)
5756
*to++= (char) (length >> 8);
5758
memcpy(to, key, length);
5764
Unpack a key into a record buffer.
5766
A VARCHAR key has a maximum size of 64K-1.
5767
In its packed form, the length field is one or two bytes long,
5768
depending on 'max_length'.
5770
@param to Pointer into the record buffer.
5771
@param key Pointer to the packed key.
5772
@param max_length Key length limit from key description.
5775
Pointer to end of 'key' (To the next key part if multi-segment key)
5779
Field_varstring::unpack_key(uchar *to __attribute__((__unused__)),
5780
const uchar *key, uint max_length,
5781
bool low_byte_first __attribute__((unused)))
5783
/* get length of the blob key */
5784
uint32 length= *key++;
5785
if (max_length > 255)
5786
length+= (*key++) << 8;
5788
/* put the length into the record buffer */
5789
if (length_bytes == 1)
5790
*ptr= (uchar) length;
5792
int2store(ptr, length);
5793
memcpy(ptr + length_bytes, key, length);
5794
return key + length;
5798
Create a packed key that will be used for storage in the index tree.
5800
@param to Store packed key segment here
5801
@param from Key segment (as given to index_read())
5802
@param max_length Max length of key
5809
Field_varstring::pack_key_from_key_image(uchar *to, const uchar *from, uint max_length,
5810
bool low_byte_first __attribute__((unused)))
5812
/* Key length is always stored as 2 bytes */
5813
uint length= uint2korr(from);
5814
if (length > max_length)
5816
*to++= (char) (length & 255);
5817
if (max_length > 255)
5818
*to++= (char) (length >> 8);
5820
memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
5826
Unpack a varstring field from row data.
5828
This method is used to unpack a varstring field from a master
5829
whose size of the field is less than that of the slave.
5832
The string length is always packed little-endian.
5834
@param to Destination of the data
5835
@param from Source of the data
5836
@param param_data Length bytes from the master's field data
5838
@return New pointer into memory based on from + length of the data
5841
Field_varstring::unpack(uchar *to, const uchar *from,
5843
bool low_byte_first __attribute__((unused)))
5846
uint l_bytes= (param_data && (param_data < field_length)) ?
5847
(param_data <= 255) ? 1 : 2 : length_bytes;
5852
if (length_bytes == 2)
5855
else /* l_bytes == 2 */
5857
length= uint2korr(from);
5862
memcpy(to+ length_bytes, from, length);
5867
int Field_varstring::pack_cmp(const uchar *a, const uchar *b,
5868
uint key_length_arg,
5869
my_bool insert_or_update)
5871
uint a_length, b_length;
5872
if (key_length_arg > 255)
5874
a_length=uint2korr(a); a+= 2;
5875
b_length=uint2korr(b); b+= 2;
5879
a_length= (uint) *a++;
5880
b_length= (uint) *b++;
5882
return field_charset->coll->strnncollsp(field_charset,
5889
int Field_varstring::pack_cmp(const uchar *b, uint key_length_arg,
5890
my_bool insert_or_update)
5892
uchar *a= ptr+ length_bytes;
5893
uint a_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
5895
uint local_char_length= ((field_charset->mbmaxlen > 1) ?
5896
key_length_arg / field_charset->mbmaxlen :
5899
if (key_length_arg > 255)
5901
b_length=uint2korr(b); b+= HA_KEY_BLOB_LENGTH;
5904
b_length= (uint) *b++;
5906
if (a_length > local_char_length)
5908
local_char_length= my_charpos(field_charset, a, a+a_length,
5910
set_if_smaller(a_length, local_char_length);
5913
return field_charset->coll->strnncollsp(field_charset,
5920
uint Field_varstring::packed_col_length(const uchar *data_ptr, uint length)
5923
return uint2korr(data_ptr)+2;
5924
return (uint) *data_ptr + 1;
5928
uint Field_varstring::max_packed_col_length(uint max_length)
5930
return (max_length > 255 ? 2 : 1)+max_length;
5933
uint Field_varstring::get_key_image(uchar *buff,
5935
imagetype type __attribute__((__unused__)))
5937
uint f_length= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
5938
uint local_char_length= length / field_charset->mbmaxlen;
5939
uchar *pos= ptr+length_bytes;
5940
local_char_length= my_charpos(field_charset, pos, pos + f_length,
5942
set_if_smaller(f_length, local_char_length);
5943
/* Key is always stored with 2 bytes */
5944
int2store(buff,f_length);
5945
memcpy(buff+HA_KEY_BLOB_LENGTH, pos, f_length);
5946
if (f_length < length)
5949
Must clear this as we do a memcmp in opt_range.cc to detect
5952
bzero(buff+HA_KEY_BLOB_LENGTH+f_length, (length-f_length));
5954
return HA_KEY_BLOB_LENGTH+f_length;
5958
void Field_varstring::set_key_image(const uchar *buff,uint length)
5960
length= uint2korr(buff); // Real length is here
5961
(void) Field_varstring::store((const char*) buff+HA_KEY_BLOB_LENGTH, length,
5966
int Field_varstring::cmp_binary(const uchar *a_ptr, const uchar *b_ptr,
5969
uint32 a_length,b_length;
5971
if (length_bytes == 1)
5973
a_length= (uint) *a_ptr;
5974
b_length= (uint) *b_ptr;
5978
a_length= uint2korr(a_ptr);
5979
b_length= uint2korr(b_ptr);
5981
set_if_smaller(a_length, max_length);
5982
set_if_smaller(b_length, max_length);
5983
if (a_length != b_length)
5985
return memcmp(a_ptr+length_bytes, b_ptr+length_bytes, a_length);
5989
Field *Field_varstring::new_field(MEM_ROOT *root, struct st_table *new_table,
5992
Field_varstring *res= (Field_varstring*) Field::new_field(root, new_table,
5995
res->length_bytes= length_bytes;
6000
Field *Field_varstring::new_key_field(MEM_ROOT *root,
6001
struct st_table *new_table,
6002
uchar *new_ptr, uchar *new_null_ptr,
6005
Field_varstring *res;
6006
if ((res= (Field_varstring*) Field::new_key_field(root,
6012
/* Keys length prefixes are always packed with 2 bytes */
6013
res->length_bytes= 2;
6019
uint Field_varstring::is_equal(Create_field *new_field)
6021
if (new_field->sql_type == real_type() &&
6022
new_field->charset == field_charset)
6024
if (new_field->length == max_display_length())
6025
return IS_EQUAL_YES;
6026
if (new_field->length > max_display_length() &&
6027
((new_field->length <= 255 && max_display_length() <= 255) ||
6028
(new_field->length > 255 && max_display_length() > 255)))
6029
return IS_EQUAL_PACK_LENGTH; // VARCHAR, longer variable length
6035
void Field_varstring::hash(ulong *nr, ulong *nr2)
6039
*nr^= (*nr << 1) | 1;
6043
uint len= length_bytes == 1 ? (uint) *ptr : uint2korr(ptr);
6044
CHARSET_INFO *cs= charset();
6045
cs->coll->hash_sort(cs, ptr + length_bytes, len, nr, nr2);
6050
/****************************************************************************
6052
** A blob is saved as a length and a pointer. The length is stored in the
6053
** packlength slot and may be from 1-4.
6054
****************************************************************************/
6056
Field_blob::Field_blob(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
6057
enum utype unireg_check_arg, const char *field_name_arg,
6058
TABLE_SHARE *share, uint blob_pack_length,
6060
:Field_longstr(ptr_arg, BLOB_PACK_LENGTH_TO_MAX_LENGH(blob_pack_length),
6061
null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg,
6063
packlength(blob_pack_length)
6066
share->blob_fields++;
6067
/* TODO: why do not fill table->s->blob_field array here? */
6071
void Field_blob::store_length(uchar *i_ptr,
6074
bool low_byte_first __attribute__((__unused__)))
6076
switch (i_packlength) {
6078
i_ptr[0]= (uchar) i_number;
6081
#ifdef WORDS_BIGENDIAN
6084
int2store(i_ptr,(unsigned short) i_number);
6088
shortstore(i_ptr,(unsigned short) i_number);
6091
int3store(i_ptr,i_number);
6094
#ifdef WORDS_BIGENDIAN
6097
int4store(i_ptr,i_number);
6101
longstore(i_ptr,i_number);
6106
uint32 Field_blob::get_length(const uchar *pos,
6107
uint packlength_arg,
6108
bool low_byte_first __attribute__((__unused__)))
6110
switch (packlength_arg) {
6112
return (uint32) pos[0];
6116
#ifdef WORDS_BIGENDIAN
6122
return (uint32) tmp;
6125
return (uint32) uint3korr(pos);
6129
#ifdef WORDS_BIGENDIAN
6135
return (uint32) tmp;
6138
return 0; // Impossible
6143
Put a blob length field into a record buffer.
6145
Depending on the maximum length of a blob, its length field is
6146
put into 1 to 4 bytes. This is a property of the blob object,
6147
described by 'packlength'.
6149
@param pos Pointer into the record buffer.
6150
@param length The length value to put.
6153
void Field_blob::put_length(uchar *pos, uint32 length)
6155
switch (packlength) {
6157
*pos= (char) length;
6160
int2store(pos, length);
6163
int3store(pos, length);
6166
int4store(pos, length);
6172
int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
6174
ASSERT_COLUMN_MARKED_FOR_WRITE;
6175
uint copy_length, new_length;
6176
const char *well_formed_error_pos;
6177
const char *cannot_convert_error_pos;
6178
const char *from_end_pos, *tmp;
6179
char buff[STRING_BUFFER_USUAL_SIZE];
6180
String tmpstr(buff,sizeof(buff), &my_charset_bin);
6184
bzero(ptr,Field_blob::pack_length());
6188
if (from == value.ptr())
6190
uint32 dummy_offset;
6191
if (!String::needs_conversion(length, cs, field_charset, &dummy_offset))
6193
Field_blob::store_length(length);
6194
bmove(ptr+packlength,(char*) &from,sizeof(char*));
6197
if (tmpstr.copy(from, length, cs))
6202
new_length= min(max_data_length(), field_charset->mbmaxlen * length);
6203
if (value.alloc(new_length))
6207
if (f_is_hex_escape(flags))
6209
copy_length= my_copy_with_hex_escaping(field_charset,
6210
(char*) value.ptr(), new_length,
6212
Field_blob::store_length(copy_length);
6214
bmove(ptr + packlength, (uchar*) &tmp, sizeof(char*));
6218
"length" is OK as "nchars" argument to well_formed_copy_nchars as this
6219
is never used to limit the length of the data. The cut of long data
6220
is done with the new_length value.
6222
copy_length= well_formed_copy_nchars(field_charset,
6223
(char*) value.ptr(), new_length,
6226
&well_formed_error_pos,
6227
&cannot_convert_error_pos,
6230
Field_blob::store_length(copy_length);
6232
bmove(ptr+packlength,(uchar*) &tmp,sizeof(char*));
6234
if (check_string_copy_error(this, well_formed_error_pos,
6235
cannot_convert_error_pos, from + length, cs))
6238
return report_if_important_data(from_end_pos, from + length);
6241
/* Fatal OOM error */
6242
bzero(ptr,Field_blob::pack_length());
6247
int Field_blob::store(double nr)
6249
CHARSET_INFO *cs=charset();
6250
value.set_real(nr, NOT_FIXED_DEC, cs);
6251
return Field_blob::store(value.ptr(),(uint) value.length(), cs);
6255
int Field_blob::store(longlong nr, bool unsigned_val)
6257
CHARSET_INFO *cs=charset();
6258
value.set_int(nr, unsigned_val, cs);
6259
return Field_blob::store(value.ptr(), (uint) value.length(), cs);
6263
double Field_blob::val_real(void)
6265
ASSERT_COLUMN_MARKED_FOR_READ;
6267
char *end_not_used, *blob;
6271
memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
6274
length= get_length(ptr);
6276
return my_strntod(cs, blob, length, &end_not_used, ¬_used);
6280
longlong Field_blob::val_int(void)
6282
ASSERT_COLUMN_MARKED_FOR_READ;
6285
memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
6288
uint32 length=get_length(ptr);
6289
return my_strntoll(charset(),blob,length,10,NULL,¬_used);
6292
String *Field_blob::val_str(String *val_buffer __attribute__((unused)),
6295
ASSERT_COLUMN_MARKED_FOR_READ;
6297
memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
6299
val_ptr->set("",0,charset()); // A bit safer than ->length(0)
6301
val_ptr->set((const char*) blob,get_length(ptr),charset());
6306
my_decimal *Field_blob::val_decimal(my_decimal *decimal_value)
6308
ASSERT_COLUMN_MARKED_FOR_READ;
6311
memcpy_fixed(&blob, ptr+packlength, sizeof(const uchar*));
6318
length= get_length(ptr);
6320
str2my_decimal(E_DEC_FATAL_ERROR, blob, length, charset(),
6322
return decimal_value;
6326
int Field_blob::cmp(const uchar *a,uint32 a_length, const uchar *b,
6329
return field_charset->coll->strnncollsp(field_charset,
6330
a, a_length, b, b_length,
6335
int Field_blob::cmp_max(const uchar *a_ptr, const uchar *b_ptr,
6338
uchar *blob1,*blob2;
6339
memcpy_fixed(&blob1,a_ptr+packlength,sizeof(char*));
6340
memcpy_fixed(&blob2,b_ptr+packlength,sizeof(char*));
6341
uint a_len= get_length(a_ptr), b_len= get_length(b_ptr);
6342
set_if_smaller(a_len, max_length);
6343
set_if_smaller(b_len, max_length);
6344
return Field_blob::cmp(blob1,a_len,blob2,b_len);
6348
int Field_blob::cmp_binary(const uchar *a_ptr, const uchar *b_ptr,
6353
uint32 a_length,b_length;
6354
memcpy_fixed(&a,a_ptr+packlength,sizeof(char*));
6355
memcpy_fixed(&b,b_ptr+packlength,sizeof(char*));
6356
a_length=get_length(a_ptr);
6357
if (a_length > max_length)
6358
a_length=max_length;
6359
b_length=get_length(b_ptr);
6360
if (b_length > max_length)
6361
b_length=max_length;
6362
diff=memcmp(a,b,min(a_length,b_length));
6363
return diff ? diff : (int) (a_length - b_length);
6367
/* The following is used only when comparing a key */
6369
uint Field_blob::get_key_image(uchar *buff,
6371
imagetype type_arg __attribute__((__unused__)))
6373
uint32 blob_length= get_length(ptr);
6377
uint local_char_length= length / field_charset->mbmaxlen;
6378
local_char_length= my_charpos(field_charset, blob, blob + blob_length,
6380
set_if_smaller(blob_length, local_char_length);
6382
if ((uint32) length > blob_length)
6385
Must clear this as we do a memcmp in opt_range.cc to detect
6388
bzero(buff+HA_KEY_BLOB_LENGTH+blob_length, (length-blob_length));
6389
length=(uint) blob_length;
6391
int2store(buff,length);
6392
memcpy(buff+HA_KEY_BLOB_LENGTH, blob, length);
6393
return HA_KEY_BLOB_LENGTH+length;
6397
void Field_blob::set_key_image(const uchar *buff,uint length)
6399
length= uint2korr(buff);
6400
(void) Field_blob::store((const char*) buff+HA_KEY_BLOB_LENGTH, length,
6405
int Field_blob::key_cmp(const uchar *key_ptr, uint max_key_length)
6408
uint blob_length=get_length(ptr);
6409
memcpy_fixed(&blob1,ptr+packlength,sizeof(char*));
6410
CHARSET_INFO *cs= charset();
6411
uint local_char_length= max_key_length / cs->mbmaxlen;
6412
local_char_length= my_charpos(cs, blob1, blob1+blob_length,
6414
set_if_smaller(blob_length, local_char_length);
6415
return Field_blob::cmp(blob1, blob_length,
6416
key_ptr+HA_KEY_BLOB_LENGTH,
6417
uint2korr(key_ptr));
6420
int Field_blob::key_cmp(const uchar *a,const uchar *b)
6422
return Field_blob::cmp(a+HA_KEY_BLOB_LENGTH, uint2korr(a),
6423
b+HA_KEY_BLOB_LENGTH, uint2korr(b));
6428
Save the field metadata for blob fields.
6430
Saves the pack length in the first byte of the field metadata array
6431
at index of *metadata_ptr.
6433
@param metadata_ptr First byte of field metadata
6435
@returns number of bytes written to metadata_ptr
6437
int Field_blob::do_save_field_metadata(uchar *metadata_ptr)
6439
*metadata_ptr= pack_length_no_ptr();
6444
uint32 Field_blob::sort_length() const
6446
return (uint32) (current_thd->variables.max_sort_length +
6447
(field_charset == &my_charset_bin ? 0 : packlength));
6451
void Field_blob::sort_string(uchar *to,uint length)
6454
uint blob_length=get_length();
6460
if (field_charset == &my_charset_bin)
6465
Store length of blob last in blob to shorter blobs before longer blobs
6467
length-= packlength;
6470
switch (packlength) {
6472
*pos= (char) blob_length;
6475
mi_int2store(pos, blob_length);
6478
mi_int3store(pos, blob_length);
6481
mi_int4store(pos, blob_length);
6485
memcpy_fixed(&blob,ptr+packlength,sizeof(char*));
6487
blob_length=my_strnxfrm(field_charset,
6488
to, length, blob, blob_length);
6489
DBUG_ASSERT(blob_length == length);
6494
void Field_blob::sql_type(String &res) const
6498
switch (packlength) {
6499
default: str="tiny"; length=4; break;
6500
case 2: str=""; length=0; break;
6501
case 3: str="medium"; length= 6; break;
6502
case 4: str="long"; length=4; break;
6504
res.set_ascii(str,length);
6505
if (charset() == &my_charset_bin)
6506
res.append(STRING_WITH_LEN("blob"));
6509
res.append(STRING_WITH_LEN("text"));
6513
uchar *Field_blob::pack(uchar *to, const uchar *from,
6514
uint max_length, bool low_byte_first)
6516
DBUG_ENTER("Field_blob::pack");
6517
DBUG_PRINT("enter", ("to: 0x%lx; from: 0x%lx;"
6518
" max_length: %u; low_byte_first: %d",
6519
(ulong) to, (ulong) from,
6520
max_length, low_byte_first));
6521
DBUG_DUMP("record", from, table->s->reclength);
6524
uint32 length=get_length(); // Length of from string
6527
Store max length, which will occupy packlength bytes. If the max
6528
length given is smaller than the actual length of the blob, we
6529
just store the initial bytes of the blob.
6531
store_length(to, packlength, min(length, max_length), low_byte_first);
6534
Store the actual blob data, which will occupy 'length' bytes.
6538
get_ptr((uchar**) &from);
6539
memcpy(to+packlength, from,length);
6541
ptr=save; // Restore org row pointer
6542
DBUG_DUMP("packed", to, packlength + length);
6543
DBUG_RETURN(to+packlength+length);
6548
Unpack a blob field from row data.
6550
This method is used to unpack a blob field from a master whose size of
6551
the field is less than that of the slave. Note: This method is included
6552
to satisfy inheritance rules, but is not needed for blob fields. It
6553
simply is used as a pass-through to the original unpack() method for
6556
@param to Destination of the data
6557
@param from Source of the data
6558
@param param_data @c TRUE if base types should be stored in little-
6559
endian format, @c FALSE if native format should
6562
@return New pointer into memory based on from + length of the data
6564
const uchar *Field_blob::unpack(uchar *to __attribute__((__unused__)),
6567
bool low_byte_first)
6569
DBUG_ENTER("Field_blob::unpack");
6570
DBUG_PRINT("enter", ("to: 0x%lx; from: 0x%lx;"
6571
" param_data: %u; low_byte_first: %d",
6572
(ulong) to, (ulong) from, param_data, low_byte_first));
6573
uint const master_packlength=
6574
param_data > 0 ? param_data & 0xFF : packlength;
6575
uint32 const length= get_length(from, master_packlength, low_byte_first);
6576
DBUG_DUMP("packed", from, length + master_packlength);
6577
bitmap_set_bit(table->write_set, field_index);
6578
store(reinterpret_cast<const char*>(from) + master_packlength,
6579
length, field_charset);
6580
DBUG_DUMP("record", to, table->s->reclength);
6581
DBUG_RETURN(from + master_packlength + length);
6584
/* Keys for blobs are like keys on varchars */
6586
int Field_blob::pack_cmp(const uchar *a, const uchar *b, uint key_length_arg,
6587
my_bool insert_or_update)
6589
uint a_length, b_length;
6590
if (key_length_arg > 255)
6592
a_length=uint2korr(a); a+=2;
6593
b_length=uint2korr(b); b+=2;
6597
a_length= (uint) *a++;
6598
b_length= (uint) *b++;
6600
return field_charset->coll->strnncollsp(field_charset,
6607
int Field_blob::pack_cmp(const uchar *b, uint key_length_arg,
6608
my_bool insert_or_update)
6611
uint a_length, b_length;
6612
memcpy_fixed(&a,ptr+packlength,sizeof(char*));
6614
return key_length_arg > 0 ? -1 : 0;
6616
a_length= get_length(ptr);
6617
if (key_length_arg > 255)
6619
b_length= uint2korr(b); b+=2;
6622
b_length= (uint) *b++;
6623
return field_charset->coll->strnncollsp(field_charset,
6629
/** Create a packed key that will be used for storage from a MySQL row. */
6632
Field_blob::pack_key(uchar *to, const uchar *from, uint max_length,
6633
bool low_byte_first __attribute__((unused)))
6637
uint32 length=get_length(); // Length of from string
6638
uint local_char_length= ((field_charset->mbmaxlen > 1) ?
6639
max_length/field_charset->mbmaxlen : max_length);
6641
get_ptr((uchar**) &from);
6642
if (length > local_char_length)
6643
local_char_length= my_charpos(field_charset, from, from+length,
6645
set_if_smaller(length, local_char_length);
6646
*to++= (uchar) length;
6647
if (max_length > 255) // 2 byte length
6648
*to++= (uchar) (length >> 8);
6649
memcpy(to, from, length);
6650
ptr=save; // Restore org row pointer
6656
Unpack a blob key into a record buffer.
6658
A blob key has a maximum size of 64K-1.
6659
In its packed form, the length field is one or two bytes long,
6660
depending on 'max_length'.
6661
Depending on the maximum length of a blob, its length field is
6662
put into 1 to 4 bytes. This is a property of the blob object,
6663
described by 'packlength'.
6664
Blobs are internally stored apart from the record buffer, which
6665
contains a pointer to the blob buffer.
6668
@param to Pointer into the record buffer.
6669
@param from Pointer to the packed key.
6670
@param max_length Key length limit from key description.
6673
Pointer into 'from' past the last byte copied from packed key.
6677
Field_blob::unpack_key(uchar *to, const uchar *from, uint max_length,
6678
bool low_byte_first __attribute__((unused)))
6680
/* get length of the blob key */
6681
uint32 length= *from++;
6682
if (max_length > 255)
6683
length+= *from++ << 8;
6685
/* put the length into the record buffer */
6686
put_length(to, length);
6688
/* put the address of the blob buffer or NULL */
6690
memcpy_fixed(to + packlength, &from, sizeof(from));
6692
bzero(to + packlength, sizeof(from));
6694
/* point to first byte of next field in 'from' */
6695
return from + length;
6699
/** Create a packed key that will be used for storage from a MySQL key. */
6702
Field_blob::pack_key_from_key_image(uchar *to, const uchar *from, uint max_length,
6703
bool low_byte_first __attribute__((unused)))
6705
uint length=uint2korr(from);
6706
if (length > max_length)
6708
*to++= (char) (length & 255);
6709
if (max_length > 255)
6710
*to++= (char) (length >> 8);
6712
memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
6717
uint Field_blob::packed_col_length(const uchar *data_ptr, uint length)
6720
return uint2korr(data_ptr)+2;
6721
return (uint) *data_ptr + 1;
6725
uint Field_blob::max_packed_col_length(uint max_length)
6727
return (max_length > 255 ? 2 : 1)+max_length;
6731
uint Field_blob::is_equal(Create_field *new_field)
6733
if (compare_str_field_flags(new_field, flags))
6736
return ((new_field->sql_type == get_blob_type_from_length(max_data_length()))
6737
&& new_field->charset == field_charset &&
6738
((Field_blob *)new_field->field)->max_data_length() ==
6743
/****************************************************************************
6745
** This is a string which only can have a selection of different values.
6746
** If one uses this string in a number context one gets the type number.
6747
****************************************************************************/
6749
enum ha_base_keytype Field_enum::key_type() const
6751
switch (packlength) {
6752
default: return HA_KEYTYPE_BINARY;
6753
case 2: return HA_KEYTYPE_USHORT_INT;
6754
case 3: return HA_KEYTYPE_UINT24;
6755
case 4: return HA_KEYTYPE_ULONG_INT;
6756
case 8: return HA_KEYTYPE_ULONGLONG;
6760
void Field_enum::store_type(uint64_t value)
6762
switch (packlength) {
6763
case 1: ptr[0]= (uchar) value; break;
6765
#ifdef WORDS_BIGENDIAN
6766
if (table->s->db_low_byte_first)
6768
int2store(ptr,(unsigned short) value);
6772
shortstore(ptr,(unsigned short) value);
6774
case 3: int3store(ptr,(long) value); break;
6776
#ifdef WORDS_BIGENDIAN
6777
if (table->s->db_low_byte_first)
6779
int4store(ptr,value);
6783
longstore(ptr,(long) value);
6786
#ifdef WORDS_BIGENDIAN
6787
if (table->s->db_low_byte_first)
6789
int8store(ptr,value);
6793
longlongstore(ptr,value); break;
6800
Storing a empty string in a enum field gives a warning
6801
(if there isn't a empty value in the enum)
6804
int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
6806
ASSERT_COLUMN_MARKED_FOR_WRITE;
6809
char buff[STRING_BUFFER_USUAL_SIZE];
6810
String tmpstr(buff,sizeof(buff), &my_charset_bin);
6812
/* Convert character set if necessary */
6813
if (String::needs_conversion(length, cs, field_charset, ¬_used))
6816
tmpstr.copy(from, length, cs, field_charset, &dummy_errors);
6818
length= tmpstr.length();
6821
/* Remove end space */
6822
length= field_charset->cset->lengthsp(field_charset, from, length);
6823
uint tmp=find_type2(typelib, from, length, field_charset);
6826
if (length < 6) // Can't be more than 99999 enums
6828
/* This is for reading numbers with LOAD DATA INFILE */
6830
tmp=(uint) my_strntoul(cs,from,length,10,&end,&err);
6831
if (err || end != from+length || tmp > typelib->count)
6834
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
6836
if (!table->in_use->count_cuted_fields)
6840
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
6842
store_type((uint64_t) tmp);
6847
int Field_enum::store(double nr)
6849
return Field_enum::store((longlong) nr, FALSE);
6853
int Field_enum::store(longlong nr,
6854
bool unsigned_val __attribute__((__unused__)))
6856
ASSERT_COLUMN_MARKED_FOR_WRITE;
6858
if ((uint64_t) nr > typelib->count || nr == 0)
6860
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
6861
if (nr != 0 || table->in_use->count_cuted_fields)
6867
store_type((uint64_t) (uint) nr);
6872
double Field_enum::val_real(void)
6874
return (double) Field_enum::val_int();
6878
longlong Field_enum::val_int(void)
6880
ASSERT_COLUMN_MARKED_FOR_READ;
6881
switch (packlength) {
6883
return (longlong) ptr[0];
6887
#ifdef WORDS_BIGENDIAN
6888
if (table->s->db_low_byte_first)
6893
return (longlong) tmp;
6896
return (longlong) uint3korr(ptr);
6900
#ifdef WORDS_BIGENDIAN
6901
if (table->s->db_low_byte_first)
6906
return (longlong) tmp;
6911
#ifdef WORDS_BIGENDIAN
6912
if (table->s->db_low_byte_first)
6916
longlongget(tmp,ptr);
6920
return 0; // impossible
6925
Save the field metadata for enum fields.
6927
Saves the real type in the first byte and the pack length in the
6928
second byte of the field metadata array at index of *metadata_ptr and
6929
*(metadata_ptr + 1).
6931
@param metadata_ptr First byte of field metadata
6933
@returns number of bytes written to metadata_ptr
6935
int Field_enum::do_save_field_metadata(uchar *metadata_ptr)
6937
*metadata_ptr= real_type();
6938
*(metadata_ptr + 1)= pack_length();
6943
String *Field_enum::val_str(String *val_buffer __attribute__((unused)),
6946
uint tmp=(uint) Field_enum::val_int();
6947
if (!tmp || tmp > typelib->count)
6948
val_ptr->set("", 0, field_charset);
6950
val_ptr->set((const char*) typelib->type_names[tmp-1],
6951
typelib->type_lengths[tmp-1],
6956
int Field_enum::cmp(const uchar *a_ptr, const uchar *b_ptr)
6959
ptr= (uchar*) a_ptr;
6960
uint64_t a=Field_enum::val_int();
6961
ptr= (uchar*) b_ptr;
6962
uint64_t b=Field_enum::val_int();
6964
return (a < b) ? -1 : (a > b) ? 1 : 0;
6967
void Field_enum::sort_string(uchar *to,uint length __attribute__((unused)))
6969
uint64_t value=Field_enum::val_int();
6971
for (uint i=0 ; i < packlength ; i++)
6973
*to-- = (uchar) (value & 255);
6979
void Field_enum::sql_type(String &res) const
6982
String enum_item(buffer, sizeof(buffer), res.charset());
6985
res.append(STRING_WITH_LEN("enum("));
6988
uint *len= typelib->type_lengths;
6989
for (const char **pos= typelib->type_names; *pos; pos++, len++)
6994
/* convert to res.charset() == utf8, then quote */
6995
enum_item.copy(*pos, *len, charset(), res.charset(), &dummy_errors);
6996
append_unescaped(&res, enum_item.ptr(), enum_item.length());
7003
Field *Field_enum::new_field(MEM_ROOT *root, struct st_table *new_table,
7006
Field_enum *res= (Field_enum*) Field::new_field(root, new_table, keep_type);
7008
res->typelib= copy_typelib(root, typelib);
7015
This is a string which can have a collection of different values.
7016
Each string value is separated with a ','.
7017
For example "One,two,five"
7018
If one uses this string in a number context one gets the bits as a longlong
7023
int Field_set::store(const char *from,uint length,CHARSET_INFO *cs)
7025
ASSERT_COLUMN_MARKED_FOR_WRITE;
7026
bool got_warning= 0;
7030
uint32 not_used_offset;
7031
char buff[STRING_BUFFER_USUAL_SIZE];
7032
String tmpstr(buff,sizeof(buff), &my_charset_bin);
7034
/* Convert character set if necessary */
7035
if (String::needs_conversion(length, cs, field_charset, ¬_used_offset))
7038
tmpstr.copy(from, length, cs, field_charset, &dummy_errors);
7040
length= tmpstr.length();
7042
uint64_t tmp= find_set(typelib, from, length, field_charset,
7043
¬_used, ¬_used2, &got_warning);
7044
if (!tmp && length && length < 22)
7046
/* This is for reading numbers with LOAD DATA INFILE */
7048
tmp=my_strntoull(cs,from,length,10,&end,&err);
7049
if (err || end != from+length ||
7050
tmp > (uint64_t) (((longlong) 1 << typelib->count) - (longlong) 1))
7053
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
7056
else if (got_warning)
7057
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
7063
int Field_set::store(longlong nr,
7064
bool unsigned_val __attribute__((__unused__)))
7066
ASSERT_COLUMN_MARKED_FOR_WRITE;
7068
uint64_t max_nr= set_bits(uint64_t, typelib->count);
7069
if ((uint64_t) nr > max_nr)
7072
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1);
7075
store_type((uint64_t) nr);
7080
String *Field_set::val_str(String *val_buffer,
7081
String *val_ptr __attribute__((unused)))
7083
uint64_t tmp=(uint64_t) Field_enum::val_int();
7086
val_buffer->length(0);
7087
val_buffer->set_charset(field_charset);
7088
while (tmp && bitnr < (uint) typelib->count)
7092
if (val_buffer->length())
7093
val_buffer->append(&field_separator, 1, &my_charset_latin1);
7094
String str(typelib->type_names[bitnr],
7095
typelib->type_lengths[bitnr],
7097
val_buffer->append(str);
7106
void Field_set::sql_type(String &res) const
7109
String set_item(buffer, sizeof(buffer), res.charset());
7112
res.append(STRING_WITH_LEN("set("));
7115
uint *len= typelib->type_lengths;
7116
for (const char **pos= typelib->type_names; *pos; pos++, len++)
7121
/* convert to res.charset() == utf8, then quote */
7122
set_item.copy(*pos, *len, charset(), res.charset(), &dummy_errors);
7123
append_unescaped(&res, set_item.ptr(), set_item.length());
1609
7131
1 if the fields are equally defined