opt_range.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

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