~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/field.cc

  • Committer: Monty Taylor
  • Date: 2008-10-13 10:14:09 UTC
  • mfrom: (383.7.6 drizzle-virtual-columns)
  • mto: This revision was merged to the branch mainline in revision 511.
  • Revision ID: monty@inaugust.com-20081013101409-aszm0nonww0f07zd
Merged in Virtual Column work.

Show diffs side-by-side

added added

removed removed

Lines of Context:
46
46
  and index of field in thia array.
47
47
*/
48
48
#define FIELDTYPE_TEAR_FROM (DRIZZLE_TYPE_VARCHAR + 1)
49
 
#define FIELDTYPE_TEAR_TO   (DRIZZLE_TYPE_NEWDECIMAL - 1)
 
49
#define FIELDTYPE_TEAR_TO   (DRIZZLE_TYPE_VIRTUAL - 1)
50
50
#define FIELDTYPE_NUM (FIELDTYPE_TEAR_FROM + (255 - FIELDTYPE_TEAR_TO))
51
51
inline int field_type2index (enum_field_types field_type)
52
52
{
76
76
    DRIZZLE_TYPE_VARCHAR,
77
77
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
78
78
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
 
79
  // DRIZZLE_TYPE_VIRTUAL
 
80
    DRIZZLE_TYPE_VIRTUAL,
79
81
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
80
82
    DRIZZLE_TYPE_NEWDECIMAL,  DRIZZLE_TYPE_VARCHAR,
81
83
  //DRIZZLE_TYPE_BLOB
99
101
    DRIZZLE_TYPE_VARCHAR,
100
102
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
101
103
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
 
104
  // DRIZZLE_TYPE_VIRTUAL
 
105
    DRIZZLE_TYPE_VIRTUAL,
102
106
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
103
107
    DRIZZLE_TYPE_NEWDECIMAL,  DRIZZLE_TYPE_VARCHAR,
104
108
  //DRIZZLE_TYPE_BLOB
122
126
    DRIZZLE_TYPE_VARCHAR,
123
127
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
124
128
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
 
129
  // DRIZZLE_TYPE_VIRTUAL
 
130
    DRIZZLE_TYPE_VIRTUAL,
125
131
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
126
132
    DRIZZLE_TYPE_NEWDECIMAL,  DRIZZLE_TYPE_VARCHAR,
127
133
  //DRIZZLE_TYPE_BLOB
145
151
    DRIZZLE_TYPE_VARCHAR,
146
152
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
147
153
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
 
154
  // DRIZZLE_TYPE_VIRTUAL
 
155
    DRIZZLE_TYPE_VIRTUAL,
148
156
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
149
157
    DRIZZLE_TYPE_DOUBLE,      DRIZZLE_TYPE_VARCHAR,
150
158
  //DRIZZLE_TYPE_BLOB
168
176
    DRIZZLE_TYPE_DATETIME,
169
177
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
170
178
    DRIZZLE_TYPE_NEWDATE,     DRIZZLE_TYPE_VARCHAR,
 
179
  // DRIZZLE_TYPE_VIRTUAL
 
180
    DRIZZLE_TYPE_VIRTUAL,
171
181
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
172
182
    DRIZZLE_TYPE_NEWDECIMAL,  DRIZZLE_TYPE_ENUM,
173
183
  //DRIZZLE_TYPE_BLOB
191
201
    DRIZZLE_TYPE_DATETIME,
192
202
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
193
203
    DRIZZLE_TYPE_NEWDATE,     DRIZZLE_TYPE_VARCHAR,
 
204
  // DRIZZLE_TYPE_VIRTUAL
 
205
    DRIZZLE_TYPE_VIRTUAL,
194
206
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
195
207
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
196
208
  //DRIZZLE_TYPE_BLOB
214
226
    DRIZZLE_TYPE_VARCHAR,
215
227
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
216
228
    DRIZZLE_TYPE_NEWDATE,     DRIZZLE_TYPE_VARCHAR,
 
229
  // DRIZZLE_TYPE_VIRTUAL
 
230
    DRIZZLE_TYPE_VIRTUAL,
217
231
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
218
232
    DRIZZLE_TYPE_NEWDECIMAL,  DRIZZLE_TYPE_VARCHAR,
219
233
  //DRIZZLE_TYPE_BLOB
237
251
    DRIZZLE_TYPE_DATETIME,
238
252
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
239
253
    DRIZZLE_TYPE_NEWDATE,     DRIZZLE_TYPE_VARCHAR,
 
254
  // DRIZZLE_TYPE_VIRTUAL
 
255
    DRIZZLE_TYPE_VIRTUAL,
240
256
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
241
257
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
242
258
  //DRIZZLE_TYPE_BLOB
260
276
    DRIZZLE_TYPE_DATETIME,
261
277
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
262
278
    DRIZZLE_TYPE_NEWDATE,     DRIZZLE_TYPE_VARCHAR,
 
279
  // DRIZZLE_TYPE_VIRTUAL
 
280
    DRIZZLE_TYPE_VIRTUAL,
263
281
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
264
282
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
265
283
  //DRIZZLE_TYPE_BLOB
283
301
    DRIZZLE_TYPE_DATETIME,
284
302
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
285
303
    DRIZZLE_TYPE_NEWDATE,     DRIZZLE_TYPE_VARCHAR,
 
304
  // DRIZZLE_TYPE_VIRTUAL
 
305
    DRIZZLE_TYPE_VIRTUAL,
286
306
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
287
307
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
288
308
  //DRIZZLE_TYPE_BLOB
306
326
    DRIZZLE_TYPE_VARCHAR,
307
327
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
308
328
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
 
329
  // DRIZZLE_TYPE_VIRTUAL
 
330
    DRIZZLE_TYPE_VIRTUAL,
309
331
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
310
332
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
311
333
  //DRIZZLE_TYPE_BLOB
312
334
    DRIZZLE_TYPE_BLOB,
313
335
  },
 
336
  /* DRIZZLE_TYPE_VIRTUAL -> */
 
337
  {
 
338
  //DRIZZLE_TYPE_DECIMAL      DRIZZLE_TYPE_TINY
 
339
    DRIZZLE_TYPE_VIRTUAL,  DRIZZLE_TYPE_VIRTUAL,
 
340
  //DRIZZLE_TYPE_LONG
 
341
    DRIZZLE_TYPE_VIRTUAL,
 
342
  //DRIZZLE_TYPE_DOUBLE
 
343
    DRIZZLE_TYPE_VIRTUAL,
 
344
  //DRIZZLE_TYPE_NULL         DRIZZLE_TYPE_TIMESTAMP
 
345
    DRIZZLE_TYPE_VIRTUAL,  DRIZZLE_TYPE_VIRTUAL,
 
346
  //DRIZZLE_TYPE_LONGLONG
 
347
    DRIZZLE_TYPE_VIRTUAL,
 
348
  //DRIZZLE_TYPE_TIME
 
349
    DRIZZLE_TYPE_VIRTUAL,
 
350
  //DRIZZLE_TYPE_DATETIME
 
351
    DRIZZLE_TYPE_VIRTUAL,
 
352
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
 
353
    DRIZZLE_TYPE_VIRTUAL,     DRIZZLE_TYPE_VIRTUAL,
 
354
  // DRIZZLE_TYPE_VIRTUAL
 
355
    DRIZZLE_TYPE_VIRTUAL,
 
356
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
 
357
    DRIZZLE_TYPE_VIRTUAL,  DRIZZLE_TYPE_VIRTUAL,
 
358
  //DRIZZLE_TYPE_BLOB
 
359
    DRIZZLE_TYPE_VIRTUAL,
 
360
  },
314
361
  /* DRIZZLE_TYPE_NEWDECIMAL -> */
315
362
  {
316
363
  //DRIZZLE_TYPE_DECIMAL      DRIZZLE_TYPE_TINY
329
376
    DRIZZLE_TYPE_VARCHAR,
330
377
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
331
378
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
 
379
  // DRIZZLE_TYPE_VIRTUAL
 
380
    DRIZZLE_TYPE_VIRTUAL,
332
381
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
333
382
    DRIZZLE_TYPE_NEWDECIMAL,  DRIZZLE_TYPE_VARCHAR,
334
383
  //DRIZZLE_TYPE_BLOB
352
401
    DRIZZLE_TYPE_VARCHAR,
353
402
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
354
403
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
 
404
  // DRIZZLE_TYPE_VIRTUAL
 
405
    DRIZZLE_TYPE_VIRTUAL,
355
406
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
356
407
    DRIZZLE_TYPE_VARCHAR,     DRIZZLE_TYPE_VARCHAR,
357
408
  //DRIZZLE_TYPE_BLOB
375
426
    DRIZZLE_TYPE_BLOB,
376
427
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
377
428
    DRIZZLE_TYPE_BLOB,        DRIZZLE_TYPE_BLOB,
 
429
  // DRIZZLE_TYPE_VIRTUAL
 
430
    DRIZZLE_TYPE_VIRTUAL,
378
431
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
379
432
    DRIZZLE_TYPE_BLOB,        DRIZZLE_TYPE_BLOB,
380
433
  //DRIZZLE_TYPE_BLOB
420
473
  STRING_RESULT,
421
474
  //DRIZZLE_TYPE_NEWDATE      DRIZZLE_TYPE_VARCHAR
422
475
  STRING_RESULT,            STRING_RESULT,
 
476
  //DRIZZLE_TYPE_VIRTUAL
 
477
  STRING_RESULT,
423
478
  //DRIZZLE_TYPE_NEWDECIMAL   DRIZZLE_TYPE_ENUM
424
479
  DECIMAL_RESULT,           STRING_RESULT,
425
480
  //DRIZZLE_TYPE_BLOB
616
671
   key_start(0), part_of_key(0), part_of_key_not_clustered(0),
617
672
   part_of_sortkey(0), unireg_check(unireg_check_arg),
618
673
   field_length(length_arg), null_bit(null_bit_arg), 
619
 
   is_created_from_null_item(false)
 
674
   is_created_from_null_item(false),
 
675
   vcol_info(NULL), is_stored(true)
620
676
{
621
677
  flags=null_ptr ? 0: NOT_NULL_FLAG;
622
678
  comment.str= (char*) "";
1290
1346
              ((decimals_arg & FIELDFLAG_MAX_DEC) << FIELDFLAG_DEC_SHIFT) |
1291
1347
              (maybe_null ? FIELDFLAG_MAYBE_NULL : 0) |
1292
1348
              (is_unsigned ? 0 : FIELDFLAG_DECIMAL));
 
1349
  vcol_info= NULL;
 
1350
  is_stored= true;
1293
1351
}
1294
1352
 
1295
1353
 
1308
1366
  @param fld_change            Field change
1309
1367
  @param fld_interval_list     Interval list (if any)
1310
1368
  @param fld_charset           Field charset
 
1369
  @param fld_vcol_info         Virtual column data
1311
1370
 
1312
1371
  @retval
1313
1372
    false on success
1322
1381
                        char *fld_change, List<String> *fld_interval_list,
1323
1382
                        const CHARSET_INFO * const fld_charset,
1324
1383
                        uint32_t fld_geom_type __attribute__((unused)),
1325
 
                        enum column_format_type column_format)
 
1384
                        enum column_format_type column_format,
 
1385
                        virtual_column_info *fld_vcol_info)
1326
1386
{
1327
1387
  uint32_t sign_len, allowed_type_modifier= 0;
1328
1388
  uint32_t max_field_charlength= MAX_FIELD_CHARLENGTH;
1351
1411
  interval_list.empty();
1352
1412
 
1353
1413
  comment= *fld_comment;
 
1414
  vcol_info= fld_vcol_info;
 
1415
  is_stored= true;
 
1416
 
 
1417
  /* Initialize data for a virtual field */
 
1418
  if (fld_type == DRIZZLE_TYPE_VIRTUAL)
 
1419
  {
 
1420
    assert(vcol_info && vcol_info->expr_item);
 
1421
    is_stored= vcol_info->get_field_stored();
 
1422
    /*
 
1423
      Perform per item-type checks to determine if the expression is 
 
1424
      allowed for a virtual column.
 
1425
      Note that validation of the specific function is done later in
 
1426
      procedures open_table_from_share and fix_fields_vcol_func
 
1427
    */
 
1428
    switch (vcol_info->expr_item->type()) {
 
1429
    case Item::FUNC_ITEM:
 
1430
         if (((Item_func *)vcol_info->expr_item)->functype() == Item_func::FUNC_SP)
 
1431
         {
 
1432
           my_error(ER_VIRTUAL_COLUMN_FUNCTION_IS_NOT_ALLOWED, MYF(0), field_name);
 
1433
           return(true);
 
1434
         }
 
1435
         break;
 
1436
    case Item::COPY_STR_ITEM:
 
1437
    case Item::FIELD_AVG_ITEM:
 
1438
    case Item::PROC_ITEM:
 
1439
    case Item::REF_ITEM:
 
1440
    case Item::FIELD_STD_ITEM:
 
1441
    case Item::FIELD_VARIANCE_ITEM:
 
1442
    case Item::INSERT_VALUE_ITEM:
 
1443
    case Item::SUBSELECT_ITEM:
 
1444
    case Item::CACHE_ITEM:
 
1445
    case Item::TYPE_HOLDER:
 
1446
    case Item::PARAM_ITEM:
 
1447
    case Item::VIEW_FIXER_ITEM: 
 
1448
         my_error(ER_VIRTUAL_COLUMN_FUNCTION_IS_NOT_ALLOWED, MYF(0), field_name);
 
1449
         return true;
 
1450
         break;
 
1451
    default: 
 
1452
      // Continue with the field creation
 
1453
      break;
 
1454
    }
 
1455
    /*
 
1456
      Make a field created for the real type.
 
1457
      Note that "real" and virtual fields differ from each other
 
1458
      only by Field::vcol_info, which is always 0 for normal columns.
 
1459
      vcol_info is updated for fields later in procedure open_binary_frm.
 
1460
    */
 
1461
    sql_type= fld_type= vcol_info->get_real_type();
 
1462
  }
 
1463
 
1354
1464
  /*
1355
1465
    Set NO_DEFAULT_VALUE_FLAG if this field doesn't have a default value and
1356
1466
    it is NOT NULL, not an AUTO_INCREMENT field and not a TIMESTAMP.
1505
1615
      length= 1; /* See comment for DRIZZLE_TYPE_SET above. */
1506
1616
      break;
1507
1617
   }
 
1618
  case DRIZZLE_TYPE_VIRTUAL: // Must not happen
 
1619
    assert(0);
1508
1620
  }
1509
1621
  /* Remember the value of length */
1510
1622
  char_length= length;
1684
1796
  case DRIZZLE_TYPE_NULL:
1685
1797
    return new Field_null(ptr, field_length, unireg_check, field_name,
1686
1798
                          field_charset);
 
1799
  case DRIZZLE_TYPE_VIRTUAL:                    // Must not happen
 
1800
    assert(0);
1687
1801
  default:                                      // Impossible (Wrong version)
1688
1802
    break;
1689
1803
  }
1706
1820
  charset=    old_field->charset();             // May be NULL ptr
1707
1821
  comment=    old_field->comment;
1708
1822
  decimals=   old_field->decimals();
 
1823
  vcol_info=  old_field->vcol_info;
 
1824
  is_stored= old_field->is_stored;
1709
1825
 
1710
1826
  /* Fix if the original table had 4 byte pointer blobs */
1711
1827
  if (flags & BLOB_FLAG)