~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/field.cc

  • Committer: Brian Aker
  • Date: 2010-12-07 09:12:12 UTC
  • mto: This revision was merged to the branch mainline in revision 1985.
  • Revision ID: brian@tangent.org-20101207091212-1m0w20tck6z7632m
This is a fix for bug lp:686197

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
#include "drizzled/field/decimal.h"
38
38
#include "drizzled/field/real.h"
39
39
#include "drizzled/field/double.h"
40
 
#include "drizzled/field/int32.h"
41
 
#include "drizzled/field/int64.h"
 
40
#include "drizzled/field/long.h"
 
41
#include "drizzled/field/int64_t.h"
42
42
#include "drizzled/field/num.h"
43
43
#include "drizzled/field/timestamp.h"
44
44
#include "drizzled/field/datetime.h"
45
45
#include "drizzled/field/varstring.h"
46
 
#include "drizzled/field/uuid.h"
47
46
#include "drizzled/time_functions.h"
48
47
#include "drizzled/internal/m_string.h"
49
48
 
50
 
#include "drizzled/display.h"
51
 
 
52
49
namespace drizzled
53
50
{
54
51
 
57
54
*****************************************************************************/
58
55
 
59
56
static enum_field_types
60
 
field_types_merge_rules [enum_field_types_size][enum_field_types_size]=
 
57
field_types_merge_rules [DRIZZLE_TYPE_MAX+1][DRIZZLE_TYPE_MAX+1]=
61
58
{
62
59
  /* DRIZZLE_TYPE_LONG -> */
63
60
  {
83
80
    DRIZZLE_TYPE_VARCHAR,
84
81
    //DRIZZLE_TYPE_BLOB
85
82
    DRIZZLE_TYPE_BLOB,
86
 
    //DRIZZLE_TYPE_UUID
87
 
    DRIZZLE_TYPE_VARCHAR,
88
83
  },
89
84
  /* DRIZZLE_TYPE_DOUBLE -> */
90
85
  {
110
105
    DRIZZLE_TYPE_VARCHAR,
111
106
    //DRIZZLE_TYPE_BLOB
112
107
    DRIZZLE_TYPE_BLOB,
113
 
    //DRIZZLE_TYPE_UUID
114
 
    DRIZZLE_TYPE_VARCHAR,
115
108
  },
116
109
  /* DRIZZLE_TYPE_NULL -> */
117
110
  {
137
130
    DRIZZLE_TYPE_ENUM,
138
131
    //DRIZZLE_TYPE_BLOB
139
132
    DRIZZLE_TYPE_BLOB,
140
 
    //DRIZZLE_TYPE_UUID
141
 
    DRIZZLE_TYPE_UUID,
142
133
  },
143
134
  /* DRIZZLE_TYPE_TIMESTAMP -> */
144
135
  {
164
155
    DRIZZLE_TYPE_VARCHAR,
165
156
    //DRIZZLE_TYPE_BLOB
166
157
    DRIZZLE_TYPE_BLOB,
167
 
    //DRIZZLE_TYPE_UUID
168
 
    DRIZZLE_TYPE_VARCHAR,
169
158
  },
170
159
  /* DRIZZLE_TYPE_LONGLONG -> */
171
160
  {
190
179
    DRIZZLE_TYPE_VARCHAR,
191
180
    //DRIZZLE_TYPE_BLOB
192
181
    DRIZZLE_TYPE_BLOB,
193
 
    //DRIZZLE_TYPE_UUID
194
 
    DRIZZLE_TYPE_VARCHAR,
195
182
  },
196
183
  /* DRIZZLE_TYPE_DATETIME -> */
197
184
  {
217
204
    DRIZZLE_TYPE_VARCHAR,
218
205
    //DRIZZLE_TYPE_BLOB
219
206
    DRIZZLE_TYPE_BLOB,
220
 
    //DRIZZLE_TYPE_UUID
221
 
    DRIZZLE_TYPE_VARCHAR,
222
207
  },
223
208
  /* DRIZZLE_TYPE_DATE -> */
224
209
  {
244
229
    DRIZZLE_TYPE_VARCHAR,
245
230
    //DRIZZLE_TYPE_BLOB
246
231
    DRIZZLE_TYPE_BLOB,
247
 
    //DRIZZLE_TYPE_UUID
248
 
    DRIZZLE_TYPE_VARCHAR,
249
232
  },
250
233
  /* DRIZZLE_TYPE_VARCHAR -> */
251
234
  {
271
254
    DRIZZLE_TYPE_VARCHAR,
272
255
    //DRIZZLE_TYPE_BLOB
273
256
    DRIZZLE_TYPE_BLOB,
274
 
    //DRIZZLE_TYPE_UUID
275
 
    DRIZZLE_TYPE_VARCHAR,
276
257
  },
277
258
  /* DRIZZLE_TYPE_DECIMAL -> */
278
259
  {
298
279
    DRIZZLE_TYPE_VARCHAR,
299
280
    //DRIZZLE_TYPE_BLOB
300
281
    DRIZZLE_TYPE_BLOB,
301
 
    //DRIZZLE_TYPE_UUID
302
 
    DRIZZLE_TYPE_VARCHAR,
303
282
  },
304
283
  /* DRIZZLE_TYPE_ENUM -> */
305
284
  {
325
304
    DRIZZLE_TYPE_VARCHAR,
326
305
    //DRIZZLE_TYPE_BLOB
327
306
    DRIZZLE_TYPE_BLOB,
328
 
    //DRIZZLE_TYPE_UUID
329
 
    DRIZZLE_TYPE_VARCHAR,
330
 
   },
 
307
  },
331
308
  /* DRIZZLE_TYPE_BLOB -> */
332
309
  {
333
310
    //DRIZZLE_TYPE_LONG
352
329
    DRIZZLE_TYPE_BLOB,
353
330
    //DRIZZLE_TYPE_BLOB
354
331
    DRIZZLE_TYPE_BLOB,
355
 
    //DRIZZLE_TYPE_UUID
356
 
    DRIZZLE_TYPE_VARCHAR,
357
 
  },
358
 
  /* DRIZZLE_TYPE_UUID -> */
359
 
  {
360
 
    //DRIZZLE_TYPE_LONG
361
 
    DRIZZLE_TYPE_VARCHAR,
362
 
    //DRIZZLE_TYPE_DOUBLE
363
 
    DRIZZLE_TYPE_VARCHAR,
364
 
    //DRIZZLE_TYPE_NULL
365
 
    DRIZZLE_TYPE_UUID,
366
 
    //DRIZZLE_TYPE_TIMESTAMP
367
 
    DRIZZLE_TYPE_VARCHAR,
368
 
    //DRIZZLE_TYPE_LONGLONG
369
 
    DRIZZLE_TYPE_VARCHAR,
370
 
    //DRIZZLE_TYPE_DATETIME
371
 
    DRIZZLE_TYPE_VARCHAR,
372
 
    //DRIZZLE_TYPE_DATE
373
 
    DRIZZLE_TYPE_VARCHAR,
374
 
    //DRIZZLE_TYPE_VARCHAR
375
 
    DRIZZLE_TYPE_VARCHAR,
376
 
    //DRIZZLE_TYPE_DECIMAL
377
 
    DRIZZLE_TYPE_VARCHAR,
378
 
    //DRIZZLE_TYPE_VARCHAR,
379
 
    DRIZZLE_TYPE_VARCHAR,
380
 
    //DRIZZLE_TYPE_BLOB
381
 
    DRIZZLE_TYPE_BLOB,
382
 
    //DRIZZLE_TYPE_UUID
383
 
    DRIZZLE_TYPE_UUID,
384
332
  },
385
333
};
386
334
 
387
 
static Item_result field_types_result_type [enum_field_types_size]=
 
335
static Item_result field_types_result_type [DRIZZLE_TYPE_MAX+1]=
388
336
{
389
337
  //DRIZZLE_TYPE_LONG
390
338
  INT_RESULT,
408
356
  STRING_RESULT,
409
357
  //DRIZZLE_TYPE_BLOB
410
358
  STRING_RESULT,
411
 
  //DRIZZLE_TYPE_UUID
412
 
  STRING_RESULT,
413
359
};
414
360
 
415
361
bool test_if_important_data(const CHARSET_INFO * const cs, 
434
380
enum_field_types Field::field_type_merge(enum_field_types a,
435
381
                                         enum_field_types b)
436
382
{
437
 
  assert(a < enum_field_types_size);
438
 
  assert(b < enum_field_types_size);
 
383
  assert(a <= DRIZZLE_TYPE_MAX);
 
384
  assert(b <= DRIZZLE_TYPE_MAX);
439
385
  return field_types_merge_rules[a][b];
440
386
}
441
387
 
442
388
Item_result Field::result_merge_type(enum_field_types field_type)
443
389
{
444
 
  assert(field_type < enum_field_types_size);
 
390
  assert(field_type <= DRIZZLE_TYPE_MAX);
445
391
  return field_types_result_type[field_type];
446
392
}
447
393
 
694
640
  }
695
641
}
696
642
 
697
 
int Field::store_and_check(enum_check_fields check_level,
698
 
                           const char *to, 
699
 
                           uint32_t length,
700
 
                           const CHARSET_INFO * const cs)
701
 
 
 
643
int Field::store(const char *to, 
 
644
                 uint32_t length,
 
645
                 const CHARSET_INFO * const cs,
 
646
                 enum_check_fields check_level)
702
647
{
703
648
  int res;
704
649
  enum_check_fields old_check_level= table->in_use->count_cuted_fields;
833
778
{
834
779
  char buff[40];
835
780
  String tmp(buff,sizeof(buff),&my_charset_bin),*res;
836
 
  if (!(res=val_str_internal(&tmp)) || str_to_datetime_with_warn(res->ptr(), res->length(),
837
 
                                                                 ltime, fuzzydate) <= DRIZZLE_TIMESTAMP_ERROR)
838
 
  {
 
781
  if (!(res=val_str(&tmp)) ||
 
782
      str_to_datetime_with_warn(res->ptr(), res->length(),
 
783
                                ltime, fuzzydate) <= DRIZZLE_TIMESTAMP_ERROR)
839
784
    return 1;
840
 
  }
841
 
 
842
785
  return 0;
843
786
}
844
787
 
846
789
{
847
790
  char buff[40];
848
791
  String tmp(buff,sizeof(buff),&my_charset_bin),*res;
849
 
 
850
 
  if (!(res=val_str_internal(&tmp)) || str_to_time_with_warn(res->ptr(), res->length(), ltime))
851
 
  {
 
792
  if (!(res=val_str(&tmp)) ||
 
793
      str_to_time_with_warn(res->ptr(), res->length(), ltime))
852
794
    return 1;
853
 
  }
854
 
 
855
795
  return 0;
856
796
}
857
797
 
948
888
{
949
889
  switch (type) {
950
890
  case DRIZZLE_TYPE_VARCHAR: return (length + (length < 256 ? 1: 2));
951
 
  case DRIZZLE_TYPE_UUID: return field::Uuid::max_string_length();
952
891
  case DRIZZLE_TYPE_DATE:
953
892
  case DRIZZLE_TYPE_ENUM:
954
893
  case DRIZZLE_TYPE_LONG: return 4;
959
898
  case DRIZZLE_TYPE_NULL: return 0;
960
899
  case DRIZZLE_TYPE_BLOB: return 4 + portable_sizeof_char_ptr;
961
900
  case DRIZZLE_TYPE_DECIMAL:
962
 
                          assert(0);
963
 
                          abort();
 
901
    abort();
 
902
  default:
 
903
    return 0;
964
904
  }
965
 
 
966
 
  assert(0);
967
 
  abort();
968
905
}
969
906
 
970
907
uint32_t pack_length_to_packflag(uint32_t type)
1078
1015
    table->clearWriteSet(field_index);
1079
1016
}
1080
1017
 
1081
 
std::ostream& operator<<(std::ostream& output, const Field &field)
1082
 
{
1083
 
  output << "Field:(";
1084
 
  output <<  field.field_name;
1085
 
  output << ", ";
1086
 
  output << drizzled::display::type(field.real_type());
1087
 
  output << ")";
1088
 
 
1089
 
  return output;  // for multiple << operators.
1090
 
}
1091
 
 
1092
1018
} /* namespace drizzled */