~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to mysys/my_tree.h

  • Committer: Jay Pipes
  • Date: 2009-01-30 04:01:12 UTC
  • mto: This revision was merged to the branch mainline in revision 830.
  • Revision ID: jpipes@serialcoder-20090130040112-svbn774guj98pwi4
To remain in compatibility with MySQL, added ability to interpret
decimal arguments as datetime strings for temporal functions.

Fixed YEAR(), MONTH(), DAYOFMONTH(), DAYOFYEAR(), HOUR(), MINUTE(), SECOND(), and MICROSECOND()
to accept decimal parameters and interpret them the same way as MySQL.

Fixed an issue with the TemporalFormat::matches() method which was 
incorrectly assuming all microsecond arguments were specified as 6 digits.
Added power of 10 multiplier to usecond calculation. This fixes issues with
failures in type_date and func_sapdb test cases.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (C) 2000 MySQL AB
 
2
 
 
3
   This program is free software; you can redistribute it and/or modify
 
4
   it under the terms of the GNU General Public License as published by
 
5
   the Free Software Foundation; version 2 of the License.
 
6
 
 
7
   This program is distributed in the hope that it will be useful,
 
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
   GNU General Public License for more details.
 
11
 
 
12
   You should have received a copy of the GNU General Public License
 
13
   along with this program; if not, write to the Free Software
 
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
15
 
 
16
#ifndef _tree_h
 
17
#define _tree_h
 
18
#ifdef  __cplusplus
 
19
extern "C" {
 
20
#endif
 
21
 
 
22
#include <drizzled/base.h>              /* get 'enum ha_rkey_function' */
 
23
#include <mysys/my_sys.h>
 
24
 
 
25
/* Worst case tree is half full. This gives use 2^(MAX_TREE_HEIGHT/2) leafs */
 
26
#define MAX_TREE_HEIGHT 64
 
27
 
 
28
#define ELEMENT_KEY(tree,element)\
 
29
(tree->offset_to_key ? (void*)((unsigned char*) element+tree->offset_to_key) :\
 
30
                        *((void**) (element+1)))
 
31
 
 
32
#define tree_set_pointer(element,ptr) *((unsigned char **) (element+1))=((unsigned char*) (ptr))
 
33
 
 
34
#define TREE_NO_DUPS 1
 
35
 
 
36
typedef enum { left_root_right, right_root_left } TREE_WALK;
 
37
typedef uint32_t element_count;
 
38
typedef int (*tree_walk_action)(void *,element_count,void *);
 
39
 
 
40
typedef enum { free_init, free_free, free_end } TREE_FREE;
 
41
typedef void (*tree_element_free)(void*, TREE_FREE, void *);
 
42
 
 
43
typedef struct st_tree_element {
 
44
  struct st_tree_element *left,*right;
 
45
  uint32_t count:31,
 
46
         colour:1;                      /* black is marked as 1 */
 
47
} TREE_ELEMENT;
 
48
 
 
49
#define ELEMENT_CHILD(element, offs) (*(TREE_ELEMENT**)((char*)element + offs))
 
50
 
 
51
typedef struct st_tree {
 
52
  TREE_ELEMENT *root,null_element;
 
53
  TREE_ELEMENT **parents[MAX_TREE_HEIGHT];
 
54
  uint32_t offset_to_key,elements_in_tree,size_of_element;
 
55
  uint32_t memory_limit, allocated;
 
56
  qsort_cmp2 compare;
 
57
  void *custom_arg;
 
58
  MEM_ROOT mem_root;
 
59
  bool with_delete;
 
60
  tree_element_free free;
 
61
  uint32_t flag;
 
62
} TREE;
 
63
 
 
64
        /* Functions on whole tree */
 
65
void init_tree(TREE *tree, uint32_t default_alloc_size, uint32_t memory_limit,
 
66
               int size, qsort_cmp2 compare, bool with_delete,
 
67
               tree_element_free free_element, void *custom_arg);
 
68
void delete_tree(TREE*);
 
69
void reset_tree(TREE*);
 
70
  /* similar to delete tree, except we do not free() blocks in mem_root
 
71
   */
 
72
#define is_tree_inited(tree) ((tree)->root != 0)
 
73
 
 
74
        /* Functions on leafs */
 
75
TREE_ELEMENT *tree_insert(TREE *tree,void *key, uint32_t key_size,
 
76
                          void *custom_arg);
 
77
void *tree_search(TREE *tree, void *key, void *custom_arg);
 
78
int tree_walk(TREE *tree,tree_walk_action action,
 
79
              void *argument, TREE_WALK visit);
 
80
int tree_delete(TREE *tree, void *key, uint32_t key_size, void *custom_arg);
 
81
void *tree_search_key(TREE *tree, const void *key,
 
82
                      TREE_ELEMENT **parents, TREE_ELEMENT ***last_pos,
 
83
                      enum ha_rkey_function flag, void *custom_arg);
 
84
void *tree_search_edge(TREE *tree, TREE_ELEMENT **parents,
 
85
                        TREE_ELEMENT ***last_pos, int child_offs);
 
86
void *tree_search_next(TREE *tree, TREE_ELEMENT ***last_pos, int l_offs,
 
87
                       int r_offs);
 
88
ha_rows tree_record_pos(TREE *tree, const void *key,
 
89
                     enum ha_rkey_function search_flag, void *custom_arg);
 
90
 
 
91
#define TREE_ELEMENT_EXTRA_SIZE (sizeof(TREE_ELEMENT) + sizeof(void*))
 
92
 
 
93
#ifdef  __cplusplus
 
94
}
 
95
#endif
 
96
#endif