~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/field.cc

  • Committer: Brian Aker
  • Date: 2010-12-22 21:50:32 UTC
  • mto: (2026.1.1 build)
  • mto: This revision was merged to the branch mainline in revision 2027.
  • Revision ID: brian@tangent.org-20101222215032-uc4fg4ff7jfwdvl6
Cleanup error messages around bad table definitions.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
3
 *
4
 
 *  Copyright (C) 2010 Brian Aker
5
4
 *  Copyright (C) 2008 MySQL
6
5
 *
7
6
 *  This program is free software; you can redistribute it and/or modify
23
22
 * @file This file implements the Field class and API
24
23
 */
25
24
 
26
 
#include <config.h>
 
25
#include "config.h"
27
26
#include <cstdio>
28
27
#include <errno.h>
29
28
#include <float.h>
30
 
#include <drizzled/sql_select.h>
31
 
#include <drizzled/error.h>
32
 
#include <drizzled/field/str.h>
33
 
#include <drizzled/field/num.h>
34
 
#include <drizzled/field/blob.h>
35
 
#include <drizzled/field/boolean.h>
36
 
#include <drizzled/field/enum.h>
37
 
#include <drizzled/field/null.h>
38
 
#include <drizzled/field/date.h>
39
 
#include <drizzled/field/decimal.h>
40
 
#include <drizzled/field/real.h>
41
 
#include <drizzled/field/double.h>
42
 
#include <drizzled/field/int32.h>
43
 
#include <drizzled/field/int64.h>
44
 
#include <drizzled/field/num.h>
45
 
#include <drizzled/field/time.h>
46
 
#include <drizzled/field/epoch.h>
47
 
#include <drizzled/field/datetime.h>
48
 
#include <drizzled/field/microtime.h>
49
 
#include <drizzled/field/varstring.h>
50
 
#include <drizzled/field/uuid.h>
51
 
#include <drizzled/time_functions.h>
52
 
#include <drizzled/internal/m_string.h>
53
 
#include <drizzled/table.h>
54
 
#include <drizzled/util/test.h>
55
 
#include <drizzled/session.h>
56
 
#include <drizzled/current_session.h>
57
 
#include <drizzled/display.h>
58
 
#include <drizzled/typelib.h>
 
29
#include "drizzled/sql_select.h"
 
30
#include "drizzled/error.h"
 
31
#include "drizzled/field/str.h"
 
32
#include "drizzled/field/num.h"
 
33
#include "drizzled/field/blob.h"
 
34
#include "drizzled/field/enum.h"
 
35
#include "drizzled/field/null.h"
 
36
#include "drizzled/field/date.h"
 
37
#include "drizzled/field/decimal.h"
 
38
#include "drizzled/field/real.h"
 
39
#include "drizzled/field/double.h"
 
40
#include "drizzled/field/int32.h"
 
41
#include "drizzled/field/int64.h"
 
42
#include "drizzled/field/num.h"
 
43
#include "drizzled/field/timestamp.h"
 
44
#include "drizzled/field/datetime.h"
 
45
#include "drizzled/field/varstring.h"
 
46
#include "drizzled/field/uuid.h"
 
47
#include "drizzled/time_functions.h"
 
48
#include "drizzled/internal/m_string.h"
 
49
 
 
50
#include "drizzled/display.h"
59
51
 
60
52
namespace drizzled
61
53
{
91
83
    DRIZZLE_TYPE_VARCHAR,
92
84
    //DRIZZLE_TYPE_BLOB
93
85
    DRIZZLE_TYPE_BLOB,
94
 
    //DRIZZLE_TYPE_TIME
95
 
    DRIZZLE_TYPE_TIME,
96
 
    //DRIZZLE_TYPE_BOOLEAN
97
 
    DRIZZLE_TYPE_VARCHAR,
98
86
    //DRIZZLE_TYPE_UUID
99
87
    DRIZZLE_TYPE_VARCHAR,
100
 
    //DRIZZLE_TYPE_MICROTIME
101
 
    DRIZZLE_TYPE_VARCHAR,
102
88
  },
103
89
  /* DRIZZLE_TYPE_DOUBLE -> */
104
90
  {
124
110
    DRIZZLE_TYPE_VARCHAR,
125
111
    //DRIZZLE_TYPE_BLOB
126
112
    DRIZZLE_TYPE_BLOB,
127
 
    //DRIZZLE_TYPE_TIME
128
 
    DRIZZLE_TYPE_TIME,
129
 
    //DRIZZLE_TYPE_BOOLEAN
130
 
    DRIZZLE_TYPE_VARCHAR,
131
113
    //DRIZZLE_TYPE_UUID
132
114
    DRIZZLE_TYPE_VARCHAR,
133
 
    //DRIZZLE_TYPE_MICROTIME
134
 
    DRIZZLE_TYPE_VARCHAR,
135
115
  },
136
116
  /* DRIZZLE_TYPE_NULL -> */
137
117
  {
157
137
    DRIZZLE_TYPE_ENUM,
158
138
    //DRIZZLE_TYPE_BLOB
159
139
    DRIZZLE_TYPE_BLOB,
160
 
    //DRIZZLE_TYPE_TIME
161
 
    DRIZZLE_TYPE_TIME,
162
 
    //DRIZZLE_TYPE_BOOLEAN
163
 
    DRIZZLE_TYPE_BOOLEAN,
164
140
    //DRIZZLE_TYPE_UUID
165
141
    DRIZZLE_TYPE_UUID,
166
 
    //DRIZZLE_TYPE_MICROTIME
167
 
    DRIZZLE_TYPE_MICROTIME,
168
142
  },
169
143
  /* DRIZZLE_TYPE_TIMESTAMP -> */
170
144
  {
190
164
    DRIZZLE_TYPE_VARCHAR,
191
165
    //DRIZZLE_TYPE_BLOB
192
166
    DRIZZLE_TYPE_BLOB,
193
 
    //DRIZZLE_TYPE_TIME
194
 
    DRIZZLE_TYPE_TIME,
195
 
    //DRIZZLE_TYPE_BOOLEAN
196
 
    DRIZZLE_TYPE_VARCHAR,
197
167
    //DRIZZLE_TYPE_UUID
198
168
    DRIZZLE_TYPE_VARCHAR,
199
 
    //DRIZZLE_TYPE_MICROTIME
200
 
    DRIZZLE_TYPE_VARCHAR,
201
169
  },
202
170
  /* DRIZZLE_TYPE_LONGLONG -> */
203
171
  {
222
190
    DRIZZLE_TYPE_VARCHAR,
223
191
    //DRIZZLE_TYPE_BLOB
224
192
    DRIZZLE_TYPE_BLOB,
225
 
    //DRIZZLE_TYPE_TIME
226
 
    DRIZZLE_TYPE_TIME,
227
 
    //DRIZZLE_TYPE_BOOLEAN
228
 
    DRIZZLE_TYPE_VARCHAR,
229
193
    //DRIZZLE_TYPE_UUID
230
194
    DRIZZLE_TYPE_VARCHAR,
231
 
    //DRIZZLE_TYPE_MICROTIME
232
 
    DRIZZLE_TYPE_VARCHAR,
233
195
  },
234
196
  /* DRIZZLE_TYPE_DATETIME -> */
235
197
  {
255
217
    DRIZZLE_TYPE_VARCHAR,
256
218
    //DRIZZLE_TYPE_BLOB
257
219
    DRIZZLE_TYPE_BLOB,
258
 
    //DRIZZLE_TYPE_TIME
259
 
    DRIZZLE_TYPE_TIME,
260
 
    //DRIZZLE_TYPE_BOOLEAN
261
 
    DRIZZLE_TYPE_VARCHAR,
262
220
    //DRIZZLE_TYPE_UUID
263
221
    DRIZZLE_TYPE_VARCHAR,
264
 
    //DRIZZLE_TYPE_MICROTIME
265
 
    DRIZZLE_TYPE_VARCHAR,
266
222
  },
267
223
  /* DRIZZLE_TYPE_DATE -> */
268
224
  {
288
244
    DRIZZLE_TYPE_VARCHAR,
289
245
    //DRIZZLE_TYPE_BLOB
290
246
    DRIZZLE_TYPE_BLOB,
291
 
    //DRIZZLE_TYPE_TIME
292
 
    DRIZZLE_TYPE_TIME,
293
 
    //DRIZZLE_TYPE_BOOLEAN
294
 
    DRIZZLE_TYPE_VARCHAR,
295
247
    //DRIZZLE_TYPE_UUID
296
248
    DRIZZLE_TYPE_VARCHAR,
297
 
    //DRIZZLE_TYPE_MICROTIME
298
 
    DRIZZLE_TYPE_VARCHAR,
299
249
  },
300
250
  /* DRIZZLE_TYPE_VARCHAR -> */
301
251
  {
321
271
    DRIZZLE_TYPE_VARCHAR,
322
272
    //DRIZZLE_TYPE_BLOB
323
273
    DRIZZLE_TYPE_BLOB,
324
 
    //DRIZZLE_TYPE_TIME
325
 
    DRIZZLE_TYPE_TIME,
326
 
    //DRIZZLE_TYPE_BOOLEAN
327
 
    DRIZZLE_TYPE_VARCHAR,
328
274
    //DRIZZLE_TYPE_UUID
329
275
    DRIZZLE_TYPE_VARCHAR,
330
 
    //DRIZZLE_TYPE_MICROTIME
331
 
    DRIZZLE_TYPE_VARCHAR,
332
276
  },
333
277
  /* DRIZZLE_TYPE_DECIMAL -> */
334
278
  {
354
298
    DRIZZLE_TYPE_VARCHAR,
355
299
    //DRIZZLE_TYPE_BLOB
356
300
    DRIZZLE_TYPE_BLOB,
357
 
    //DRIZZLE_TYPE_TIME
358
 
    DRIZZLE_TYPE_TIME,
359
 
    //DRIZZLE_TYPE_BOOLEAN
360
 
    DRIZZLE_TYPE_VARCHAR,
361
301
    //DRIZZLE_TYPE_UUID
362
302
    DRIZZLE_TYPE_VARCHAR,
363
 
    //DRIZZLE_TYPE_MICROTIME
364
 
    DRIZZLE_TYPE_VARCHAR,
365
303
  },
366
304
  /* DRIZZLE_TYPE_ENUM -> */
367
305
  {
387
325
    DRIZZLE_TYPE_VARCHAR,
388
326
    //DRIZZLE_TYPE_BLOB
389
327
    DRIZZLE_TYPE_BLOB,
390
 
    //DRIZZLE_TYPE_TIME
391
 
    DRIZZLE_TYPE_TIME,
392
 
    //DRIZZLE_TYPE_BOOLEAN
393
 
    DRIZZLE_TYPE_VARCHAR,
394
328
    //DRIZZLE_TYPE_UUID
395
329
    DRIZZLE_TYPE_VARCHAR,
396
 
    //DRIZZLE_TYPE_MICROTIME
397
 
    DRIZZLE_TYPE_VARCHAR,
398
330
   },
399
331
  /* DRIZZLE_TYPE_BLOB -> */
400
332
  {
420
352
    DRIZZLE_TYPE_BLOB,
421
353
    //DRIZZLE_TYPE_BLOB
422
354
    DRIZZLE_TYPE_BLOB,
423
 
    //DRIZZLE_TYPE_TIME
424
 
    DRIZZLE_TYPE_TIME,
425
 
    //DRIZZLE_TYPE_BOOLEAN
426
 
    DRIZZLE_TYPE_VARCHAR,
427
 
    //DRIZZLE_TYPE_UUID
428
 
    DRIZZLE_TYPE_VARCHAR,
429
 
    //DRIZZLE_TYPE_MICROTIME
430
 
    DRIZZLE_TYPE_VARCHAR,
431
 
  },
432
 
  /* DRIZZLE_TYPE_TIME -> */
433
 
  {
434
 
    //DRIZZLE_TYPE_LONG
435
 
    DRIZZLE_TYPE_VARCHAR,
436
 
    //DRIZZLE_TYPE_DOUBLE
437
 
    DRIZZLE_TYPE_VARCHAR,
438
 
    //DRIZZLE_TYPE_NULL
439
 
    DRIZZLE_TYPE_TIME,
440
 
    //DRIZZLE_TYPE_TIMESTAMP
441
 
    DRIZZLE_TYPE_VARCHAR,
442
 
    //DRIZZLE_TYPE_LONGLONG
443
 
    DRIZZLE_TYPE_VARCHAR,
444
 
    //DRIZZLE_TYPE_DATETIME
445
 
    DRIZZLE_TYPE_VARCHAR,
446
 
    //DRIZZLE_TYPE_DATE
447
 
    DRIZZLE_TYPE_VARCHAR,
448
 
    //DRIZZLE_TYPE_VARCHAR
449
 
    DRIZZLE_TYPE_VARCHAR,
450
 
    //DRIZZLE_TYPE_DECIMAL
451
 
    DRIZZLE_TYPE_VARCHAR,
452
 
    //DRIZZLE_TYPE_VARCHAR,
453
 
    DRIZZLE_TYPE_VARCHAR,
454
 
    //DRIZZLE_TYPE_BLOB
455
 
    DRIZZLE_TYPE_BLOB,
456
 
    //DRIZZLE_TYPE_TIME
457
 
    DRIZZLE_TYPE_TIME,
458
 
    //DRIZZLE_TYPE_BOOLEAN
459
 
    DRIZZLE_TYPE_VARCHAR,
460
 
    //DRIZZLE_TYPE_UUID
461
 
    DRIZZLE_TYPE_UUID,
462
 
    //DRIZZLE_TYPE_MICROTIME
463
 
    DRIZZLE_TYPE_VARCHAR,
464
 
  },
465
 
  /* DRIZZLE_TYPE_BOOLEAN -> */
466
 
  {
467
 
    //DRIZZLE_TYPE_LONG
468
 
    DRIZZLE_TYPE_VARCHAR,
469
 
    //DRIZZLE_TYPE_DOUBLE
470
 
    DRIZZLE_TYPE_VARCHAR,
471
 
    //DRIZZLE_TYPE_NULL
472
 
    DRIZZLE_TYPE_BOOLEAN,
473
 
    //DRIZZLE_TYPE_TIMESTAMP
474
 
    DRIZZLE_TYPE_VARCHAR,
475
 
    //DRIZZLE_TYPE_LONGLONG
476
 
    DRIZZLE_TYPE_VARCHAR,
477
 
    //DRIZZLE_TYPE_DATETIME
478
 
    DRIZZLE_TYPE_VARCHAR,
479
 
    //DRIZZLE_TYPE_DATE
480
 
    DRIZZLE_TYPE_VARCHAR,
481
 
    //DRIZZLE_TYPE_VARCHAR
482
 
    DRIZZLE_TYPE_VARCHAR,
483
 
    //DRIZZLE_TYPE_DECIMAL
484
 
    DRIZZLE_TYPE_VARCHAR,
485
 
    //DRIZZLE_TYPE_VARCHAR,
486
 
    DRIZZLE_TYPE_VARCHAR,
487
 
    //DRIZZLE_TYPE_BLOB
488
 
    DRIZZLE_TYPE_BLOB,
489
 
    //DRIZZLE_TYPE_TIME
490
 
    DRIZZLE_TYPE_TIME,
491
 
    //DRIZZLE_TYPE_BOOLEAN
492
 
    DRIZZLE_TYPE_BOOLEAN,
493
 
    //DRIZZLE_TYPE_UUID
494
 
    DRIZZLE_TYPE_VARCHAR,
495
 
    //DRIZZLE_TYPE_MICROTIME
 
355
    //DRIZZLE_TYPE_UUID
496
356
    DRIZZLE_TYPE_VARCHAR,
497
357
  },
498
358
  /* DRIZZLE_TYPE_UUID -> */
519
379
    DRIZZLE_TYPE_VARCHAR,
520
380
    //DRIZZLE_TYPE_BLOB
521
381
    DRIZZLE_TYPE_BLOB,
522
 
    //DRIZZLE_TYPE_TIME
523
 
    DRIZZLE_TYPE_TIME,
524
 
    //DRIZZLE_TYPE_BOOLEAN
525
 
    DRIZZLE_TYPE_VARCHAR,
526
 
    //DRIZZLE_TYPE_UUID
527
 
    DRIZZLE_TYPE_UUID,
528
 
    //DRIZZLE_TYPE_MICROTIME
529
 
    DRIZZLE_TYPE_VARCHAR,
530
 
  },
531
 
  /* DRIZZLE_TYPE_MICROTIME -> */
532
 
  {
533
 
    //DRIZZLE_TYPE_LONG
534
 
    DRIZZLE_TYPE_VARCHAR,
535
 
    //DRIZZLE_TYPE_DOUBLE
536
 
    DRIZZLE_TYPE_VARCHAR,
537
 
    //DRIZZLE_TYPE_NULL
538
 
    DRIZZLE_TYPE_MICROTIME,
539
 
    //DRIZZLE_TYPE_TIMESTAMP
540
 
    DRIZZLE_TYPE_VARCHAR,
541
 
    //DRIZZLE_TYPE_LONGLONG
542
 
    DRIZZLE_TYPE_VARCHAR,
543
 
    //DRIZZLE_TYPE_DATETIME
544
 
    DRIZZLE_TYPE_VARCHAR,
545
 
    //DRIZZLE_TYPE_DATE
546
 
    DRIZZLE_TYPE_VARCHAR,
547
 
    //DRIZZLE_TYPE_VARCHAR
548
 
    DRIZZLE_TYPE_VARCHAR,
549
 
    //DRIZZLE_TYPE_DECIMAL
550
 
    DRIZZLE_TYPE_VARCHAR,
551
 
    //DRIZZLE_TYPE_VARCHAR,
552
 
    DRIZZLE_TYPE_VARCHAR,
553
 
    //DRIZZLE_TYPE_BLOB
554
 
    DRIZZLE_TYPE_BLOB,
555
 
    //DRIZZLE_TYPE_TIME
556
 
    DRIZZLE_TYPE_TIME,
557
 
    //DRIZZLE_TYPE_BOOLEAN
558
 
    DRIZZLE_TYPE_VARCHAR,
559
 
    //DRIZZLE_TYPE_UUID
560
 
    DRIZZLE_TYPE_UUID,
561
 
    //DRIZZLE_TYPE_MICROTIME
562
 
    DRIZZLE_TYPE_MICROTIME,
 
382
    //DRIZZLE_TYPE_UUID
 
383
    DRIZZLE_TYPE_UUID,
563
384
  },
564
385
};
565
386
 
587
408
  STRING_RESULT,
588
409
  //DRIZZLE_TYPE_BLOB
589
410
  STRING_RESULT,
590
 
  //DRIZZLE_TYPE_TIME
591
 
  STRING_RESULT,
592
 
  //DRIZZLE_TYPE_BOOLEAN
593
 
  STRING_RESULT,
594
411
  //DRIZZLE_TYPE_UUID
595
412
  STRING_RESULT,
596
 
  //DRIZZLE_TYPE_MICROTIME
597
 
  STRING_RESULT,
598
413
};
599
414
 
600
415
bool test_if_important_data(const CHARSET_INFO * const cs, 
746
561
  return 0;
747
562
}
748
563
 
749
 
bool Field::is_null(ptrdiff_t row_offset) const
 
564
bool Field::is_null(ptrdiff_t row_offset)
750
565
{
751
566
  return null_ptr ?
752
567
    (null_ptr[row_offset] & null_bit ? true : false) :
753
568
    table->null_row;
754
569
}
755
570
 
756
 
bool Field::is_real_null(ptrdiff_t row_offset) const
 
571
bool Field::is_real_null(ptrdiff_t row_offset)
757
572
{
758
573
  return null_ptr ? (null_ptr[row_offset] & null_bit ? true : false) : false;
759
574
}
760
575
 
761
 
bool Field::is_null_in_record(const unsigned char *record) const
 
576
bool Field::is_null_in_record(const unsigned char *record)
762
577
{
763
578
  if (! null_ptr)
764
579
    return false;
765
580
  return test(record[(uint32_t) (null_ptr -table->getInsertRecord())] & null_bit);
766
581
}
767
582
 
768
 
bool Field::is_null_in_record_with_offset(ptrdiff_t with_offset) const
 
583
bool Field::is_null_in_record_with_offset(ptrdiff_t with_offset)
769
584
{
770
585
  if (! null_ptr)
771
586
    return false;
784
599
    null_ptr[row_offset]&= (unsigned char) ~null_bit;
785
600
}
786
601
 
787
 
bool Field::maybe_null(void) const
 
602
bool Field::maybe_null(void)
788
603
{
789
604
  return null_ptr != 0 || table->maybe_null;
790
605
}
791
606
 
792
 
bool Field::real_maybe_null(void) const
 
607
bool Field::real_maybe_null(void)
793
608
{
794
609
  return null_ptr != 0;
795
610
}
831
646
             unsigned char *null_ptr_arg,
832
647
             unsigned char null_bit_arg,
833
648
             utype unireg_check_arg, 
834
 
             const char *field_name_arg) :
 
649
             const char *field_name_arg)
 
650
  :
835
651
    ptr(ptr_arg),
836
652
    null_ptr(null_ptr_arg),
837
653
    table(NULL),
838
654
    orig_table(NULL),
839
655
    field_name(field_name_arg),
840
 
    comment(NULL_LEX_STRING),
841
656
    key_start(0),
842
657
    part_of_key(0),
843
658
    part_of_key_not_clustered(0),
844
659
    part_of_sortkey(0),
845
660
    unireg_check(unireg_check_arg),
846
661
    field_length(length_arg),
847
 
    flags(null_ptr ? 0: NOT_NULL_FLAG),
848
 
    field_index(0),
849
662
    null_bit(null_bit_arg),
850
663
    is_created_from_null_item(false)
851
664
{
 
665
  flags= null_ptr ? 0: NOT_NULL_FLAG;
 
666
  comment.str= (char*) "";
 
667
  comment.length= 0;
 
668
  field_index= 0;
852
669
}
853
670
 
854
 
void Field::hash(uint32_t *nr, uint32_t *nr2) const
 
671
void Field::hash(uint32_t *nr, uint32_t *nr2)
855
672
{
856
673
  if (is_null())
857
674
  {
943
760
  return(result);
944
761
}
945
762
 
946
 
type::Decimal *Field::val_decimal(type::Decimal *) const
 
763
my_decimal *Field::val_decimal(my_decimal *)
947
764
{
948
765
  /* This never have to be called */
949
766
  assert(0);
978
795
  field->decimals= 0;
979
796
}
980
797
 
981
 
int64_t Field::convert_decimal2int64_t(const type::Decimal *val, bool, int *err)
 
798
int64_t Field::convert_decimal2int64_t(const my_decimal *val, bool, int *err)
982
799
{
983
800
  int64_t i;
984
 
  if (warn_if_overflow(val->val_int32(E_DEC_ERROR &
 
801
  if (warn_if_overflow(my_decimal2int(E_DEC_ERROR &
985
802
                                      ~E_DEC_OVERFLOW & ~E_DEC_TRUNCATED,
986
 
                                      false, &i)))
 
803
                                      val, false, &i)))
987
804
  {
988
805
    i= (val->sign() ? INT64_MIN : INT64_MAX);
989
806
    *err= 1;
1001
818
  {
1002
819
    copy->blob_field=(Field_blob*) this;
1003
820
    copy->strip=0;
1004
 
    copy->length-= table->getShare()->sizeBlobPtr();
 
821
    copy->length-= table->getShare()->blob_ptr_size;
1005
822
    return copy->length;
1006
823
  }
1007
824
  else
1012
829
  return copy->length+ store_length;
1013
830
}
1014
831
 
1015
 
bool Field::get_date(type::Time &ltime, uint32_t fuzzydate) const
1016
 
{
1017
 
  char buff[type::Time::MAX_STRING_LENGTH];
1018
 
  String tmp(buff,sizeof(buff),&my_charset_bin),*res;
1019
 
 
1020
 
  assert(getTable() and getTable()->getSession());
1021
 
 
1022
 
  if (not (res= val_str_internal(&tmp)) or
1023
 
      str_to_datetime_with_warn(getTable()->getSession(),
1024
 
                                res->ptr(), res->length(),
1025
 
                                &ltime, fuzzydate) <= type::DRIZZLE_TIMESTAMP_ERROR)
1026
 
  {
1027
 
    return true;
1028
 
  }
1029
 
 
1030
 
  return false;
1031
 
}
1032
 
 
1033
 
bool Field::get_time(type::Time &ltime) const
1034
 
{
1035
 
  char buff[type::Time::MAX_STRING_LENGTH];
1036
 
  String tmp(buff,sizeof(buff),&my_charset_bin),*res;
1037
 
 
1038
 
  if (not (res= val_str_internal(&tmp)) or
1039
 
      str_to_time_with_warn(getTable()->getSession(), res->ptr(), res->length(), &ltime))
1040
 
  {
1041
 
    return true;
1042
 
  }
1043
 
 
1044
 
  return false;
1045
 
}
1046
 
 
1047
 
int Field::store_time(type::Time &ltime, type::timestamp_t)
1048
 
{
1049
 
  String tmp;
1050
 
 
1051
 
  ltime.convert(tmp);
1052
 
 
1053
 
  return store(tmp.ptr(), tmp.length(), &my_charset_bin);
 
832
bool Field::get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
 
833
{
 
834
  char buff[40];
 
835
  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
  {
 
839
    return 1;
 
840
  }
 
841
 
 
842
  return 0;
 
843
}
 
844
 
 
845
bool Field::get_time(DRIZZLE_TIME *ltime)
 
846
{
 
847
  char buff[40];
 
848
  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
  {
 
852
    return 1;
 
853
  }
 
854
 
 
855
  return 0;
 
856
}
 
857
 
 
858
int Field::store_time(DRIZZLE_TIME *ltime, enum enum_drizzle_timestamp_type)
 
859
{
 
860
  char buff[MAX_DATE_STRING_REP_LENGTH];
 
861
  uint32_t length= (uint32_t) my_TIME_to_str(ltime, buff);
 
862
  return store(buff, length, &my_charset_bin);
1054
863
}
1055
864
 
1056
865
bool Field::optimize_range(uint32_t idx, uint32_t)
1121
930
{
1122
931
  if (!Field::eq_def(field))
1123
932
    return 0;
1124
 
 
1125
933
  TYPELIB *from_lib=((Field_enum*) field)->typelib;
1126
934
 
1127
935
  if (typelib->count < from_lib->count)
1128
936
    return 0;
1129
 
 
1130
937
  for (uint32_t i=0 ; i < from_lib->count ; i++)
1131
 
  {
1132
938
    if (my_strnncoll(field_charset,
1133
939
                     (const unsigned char*)typelib->type_names[i],
1134
940
                     strlen(typelib->type_names[i]),
1135
941
                     (const unsigned char*)from_lib->type_names[i],
1136
942
                     strlen(from_lib->type_names[i])))
1137
943
      return 0;
1138
 
  }
1139
 
 
1140
944
  return 1;
1141
945
}
1142
946
 
1145
949
  switch (type) {
1146
950
  case DRIZZLE_TYPE_VARCHAR: return (length + (length < 256 ? 1: 2));
1147
951
  case DRIZZLE_TYPE_UUID: return field::Uuid::max_string_length();
1148
 
  case DRIZZLE_TYPE_MICROTIME: return field::Microtime::max_string_length();
1149
 
  case DRIZZLE_TYPE_TIMESTAMP: return field::Epoch::max_string_length();
1150
 
  case DRIZZLE_TYPE_BOOLEAN: return field::Boolean::max_string_length();
1151
952
  case DRIZZLE_TYPE_DATE:
1152
953
  case DRIZZLE_TYPE_ENUM:
1153
954
  case DRIZZLE_TYPE_LONG: return 4;
1154
955
  case DRIZZLE_TYPE_DOUBLE: return sizeof(double);
1155
 
  case DRIZZLE_TYPE_TIME:
1156
956
  case DRIZZLE_TYPE_DATETIME:
 
957
  case DRIZZLE_TYPE_TIMESTAMP:
1157
958
  case DRIZZLE_TYPE_LONGLONG: return 8; /* Don't crash if no int64_t */
1158
959
  case DRIZZLE_TYPE_NULL: return 0;
1159
960
  case DRIZZLE_TYPE_BLOB: return 4 + portable_sizeof_char_ptr;
1160
961
  case DRIZZLE_TYPE_DECIMAL:
1161
 
                          break;
 
962
                          assert(0);
 
963
                          abort();
1162
964
  }
1163
965
 
1164
966
  assert(0);
1182
984
*****************************************************************************/
1183
985
 
1184
986
bool Field::set_warning(DRIZZLE_ERROR::enum_warning_level level,
1185
 
                        drizzled::error_t code,
 
987
                        uint32_t code,
1186
988
                        int cuted_increment)
1187
989
{
1188
990
  /*
1202
1004
 
1203
1005
 
1204
1006
void Field::set_datetime_warning(DRIZZLE_ERROR::enum_warning_level level,
1205
 
                                 drizzled::error_t code,
 
1007
                                 unsigned int code,
1206
1008
                                 const char *str, 
1207
1009
                                 uint32_t str_length,
1208
 
                                 type::timestamp_t ts_type, 
 
1010
                                 enum enum_drizzle_timestamp_type ts_type, 
1209
1011
                                 int cuted_increment)
1210
1012
{
1211
 
  Session *session= (getTable() and getTable()->getSession()) ? getTable()->getSession() : current_session;
1212
 
 
1213
 
  if ((session->abortOnWarning() and
 
1013
  Session *session= table ? table->in_use : current_session;
 
1014
  if ((session->really_abort_on_warning() &&
1214
1015
       level >= DRIZZLE_ERROR::WARN_LEVEL_WARN) ||
1215
1016
      set_warning(level, code, cuted_increment))
1216
1017
    make_truncated_value_warning(session, level, str, str_length, ts_type,
1218
1019
}
1219
1020
 
1220
1021
void Field::set_datetime_warning(DRIZZLE_ERROR::enum_warning_level level, 
1221
 
                                 drizzled::error_t code,
 
1022
                                 uint32_t code,
1222
1023
                                 int64_t nr, 
1223
 
                                 type::timestamp_t ts_type,
 
1024
                                 enum enum_drizzle_timestamp_type ts_type,
1224
1025
                                 int cuted_increment)
1225
1026
{
1226
 
  Session *session= (getTable() and getTable()->getSession()) ? getTable()->getSession() : current_session;
1227
 
 
1228
 
  if (session->abortOnWarning() or
 
1027
  Session *session= table ? table->in_use : current_session;
 
1028
  if (session->really_abort_on_warning() ||
1229
1029
      set_warning(level, code, cuted_increment))
1230
1030
  {
1231
 
    char str_nr[DECIMAL_LONGLONG_DIGITS];
 
1031
    char str_nr[22];
1232
1032
    char *str_end= internal::int64_t10_to_str(nr, str_nr, -10);
1233
1033
    make_truncated_value_warning(session, level, str_nr, (uint32_t) (str_end - str_nr),
1234
1034
                                 ts_type, field_name);
1236
1036
}
1237
1037
 
1238
1038
void Field::set_datetime_warning(DRIZZLE_ERROR::enum_warning_level level,
1239
 
                                 const drizzled::error_t code,
 
1039
                                 const uint32_t code,
1240
1040
                                 double nr, 
1241
 
                                 type::timestamp_t ts_type)
 
1041
                                 enum enum_drizzle_timestamp_type ts_type)
1242
1042
{
1243
 
  Session *session= (getTable() and getTable()->getSession()) ? getTable()->getSession() : current_session;
1244
 
 
1245
 
  if (session->abortOnWarning() or
 
1043
  Session *session= table ? table->in_use : current_session;
 
1044
  if (session->really_abort_on_warning() ||
1246
1045
      set_warning(level, code, 1))
1247
1046
  {
1248
1047
    /* DBL_DIG is enough to print '-[digits].E+###' */
1253
1052
  }
1254
1053
}
1255
1054
 
1256
 
bool Field::isReadSet() const 
 
1055
bool Field::isReadSet() 
1257
1056
1258
1057
  return table->isReadSet(field_index); 
1259
1058
}
1279
1078
    table->clearWriteSet(field_index);
1280
1079
}
1281
1080
 
1282
 
void Field::pack_num(uint64_t arg, unsigned char *destination)
1283
 
{
1284
 
  if (not destination)
1285
 
    destination= ptr;
1286
 
 
1287
 
  int64_tstore(destination, arg);
1288
 
}
1289
 
 
1290
 
void Field::pack_num(uint32_t arg, unsigned char *destination)
1291
 
{
1292
 
  if (not destination)
1293
 
    destination= ptr;
1294
 
 
1295
 
  longstore(destination, arg);
1296
 
}
1297
 
 
1298
 
uint64_t Field::unpack_num(uint64_t &destination, const unsigned char *arg) const
1299
 
{
1300
 
  if (not arg)
1301
 
    arg= ptr;
1302
 
 
1303
 
  int64_tget(destination, arg);
1304
 
 
1305
 
  return destination;
1306
 
}
1307
 
 
1308
 
uint32_t Field::unpack_num(uint32_t &destination, const unsigned char *arg) const
1309
 
{
1310
 
  if (not arg)
1311
 
    arg= ptr;
1312
 
 
1313
 
  longget(destination, arg);
1314
 
 
1315
 
  return destination;
1316
 
}
1317
 
 
1318
1081
std::ostream& operator<<(std::ostream& output, const Field &field)
1319
1082
{
1320
1083
  output << "Field:(";