home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / sql / opt_range.h < prev    next >
C/C++ Source or Header  |  2000-11-16  |  3KB  |  107 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult 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; either version 2 of the License, or
  6.    (at your option) any later version.
  7.  
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.  
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16.  
  17.  
  18. /* classes to use when handling where clause */
  19.  
  20. #ifndef _opt_range_h
  21. #define _opt_range_h
  22.  
  23. #ifdef __GNUC__
  24. #pragma interface            /* gcc class implementation */
  25. #endif
  26.  
  27. #define NO_MIN_RANGE    1
  28. #define NO_MAX_RANGE    2
  29. #define NEAR_MIN    4
  30. #define NEAR_MAX    8
  31. #define UNIQUE_RANGE    16
  32. #define EQ_RANGE    32
  33.  
  34. typedef struct st_key_part {
  35.   uint16 key,part,part_length;
  36.   uint8  null_bit;
  37.   Field *field;
  38. } KEY_PART;
  39.  
  40. class QUICK_RANGE :public Sql_alloc {
  41.  public:
  42.   char *min_key,*max_key;
  43.   uint16 min_length,max_length,flag;
  44.   QUICK_RANGE();                /* Full range */
  45.   QUICK_RANGE(const char *min_key_arg,uint min_length_arg,
  46.           const char *max_key_arg,uint max_length_arg,
  47.           uint flag_arg)
  48.     : min_key((char*) sql_memdup(min_key_arg,min_length_arg+1)),
  49.       max_key((char*) sql_memdup(max_key_arg,max_length_arg+1)),
  50.       min_length(min_length_arg),
  51.       max_length(max_length_arg),
  52.       flag(flag_arg)
  53.     {}
  54. };
  55.  
  56. class QUICK_SELECT {
  57. public:
  58.   bool next;
  59.   int error;
  60.   uint index,max_used_key_length;
  61.   TABLE *head;
  62.   handler *file;
  63.   byte    *record;
  64.   List<QUICK_RANGE> ranges;
  65.   List_iterator<QUICK_RANGE> it;
  66.   QUICK_RANGE *range;
  67.   MEM_ROOT alloc;
  68.  
  69.   KEY_PART *key_parts;
  70.   ha_rows records;
  71.   double read_time;
  72.  
  73.   QUICK_SELECT(TABLE *table,uint index_arg,bool no_alloc=0);
  74.   virtual ~QUICK_SELECT();
  75.   void reset(void) { next=0; it.rewind(); }
  76.   virtual int init() { return 0; }
  77.   virtual int get_next();
  78.   int cmp_next(QUICK_RANGE *range);
  79.   bool unique_key_range();
  80. };
  81.  
  82. class SQL_SELECT :public Sql_alloc {
  83.  public:
  84.   QUICK_SELECT *quick;        // If quick-select used
  85.   COND        *cond;        // where condition
  86.   TABLE    *head;
  87.   IO_CACHE file;        // Positions to used records
  88.   ha_rows records;        // Records in use if read from file
  89.   double read_time;        // Time to read rows
  90.   key_map quick_keys;        // Possible quick keys
  91.   key_map needed_reg;        // Possible quick keys after prev tables.
  92.   table_map const_tables,read_tables;
  93.   bool    free_cond;
  94.  
  95.   SQL_SELECT();
  96.   ~SQL_SELECT();
  97.   bool check_quick(bool force_quick_range=0, ha_rows limit = HA_POS_ERROR)
  98.   { return test_quick_select(~0L,0,limit, force_quick_range) < 0; }
  99.   inline bool skipp_record() { return cond ? cond->val_int() == 0 : 0; }
  100.   int test_quick_select(key_map keys,table_map prev_tables,ha_rows limit,
  101.             bool force_quick_range=0);
  102. };
  103.  
  104. QUICK_SELECT *get_quick_select_for_ref(TABLE *table, struct st_table_ref *ref);
  105.  
  106. #endif
  107.