Commit 78e21140 authored by Zardosht Kasheff's avatar Zardosht Kasheff Committed by Yoni Fogel

addresses #1116 #1658

merge to main

git-svn-id: file:///svn/mysql/tokudb-engine/src@11407 c7de825b-a66e-492c-adef-691d508d4ae1
parent 48ea5ff9
This diff is collapsed.
...@@ -5,6 +5,15 @@ ...@@ -5,6 +5,15 @@
#include <db.h> #include <db.h>
#include "hatoku_cmp.h" #include "hatoku_cmp.h"
typedef struct st_col_pack_info {
u_int32_t col_pack_val; //offset if fixed, pack_index if var
} COL_PACK_INFO;
typedef struct st_multi_col_pack_info {
u_int32_t var_len_offset; //where the fixed length stuff ends and the offsets for var stuff begins
u_int32_t len_of_offsets; //length of the offset bytes in a packed row
} MULTI_COL_PACK_INFO;
typedef struct st_tokudb_share { typedef struct st_tokudb_share {
char *table_name; char *table_name;
uint table_name_length, use_count; uint table_name_length, use_count;
...@@ -36,7 +45,6 @@ typedef struct st_tokudb_share { ...@@ -36,7 +45,6 @@ typedef struct st_tokudb_share {
u_int32_t key_type[MAX_KEY +1]; u_int32_t key_type[MAX_KEY +1];
uint status, version, capabilities; uint status, version, capabilities;
uint ref_length; uint ref_length;
bool fixed_length_row;
// //
// whether table has an auto increment column // whether table has an auto increment column
// //
...@@ -45,6 +53,15 @@ typedef struct st_tokudb_share { ...@@ -45,6 +53,15 @@ typedef struct st_tokudb_share {
// index of auto increment column in table->field, if auto_inc exists // index of auto increment column in table->field, if auto_inc exists
// //
uint ai_field_index; uint ai_field_index;
MY_BITMAP key_filters[MAX_KEY+1];
uchar* field_lengths; //stores the field lengths of fixed size fields (255 max)
uchar* length_bytes; // stores the length of lengths of varchars and varbinaries
u_int32_t* blob_fields; // list of indexes of blob fields
u_int32_t num_blobs;
MULTI_COL_PACK_INFO mcp_info[MAX_KEY+1];
COL_PACK_INFO* cp_info[MAX_KEY+1];
u_int32_t num_offset_bytes; //number of bytes needed to encode the offset
} TOKUDB_SHARE; } TOKUDB_SHARE;
#define HA_TOKU_VERSION 2 #define HA_TOKU_VERSION 2
...@@ -60,16 +77,16 @@ typedef struct st_tokudb_share { ...@@ -60,16 +77,16 @@ typedef struct st_tokudb_share {
// in status.tokudb // in status.tokudb
// //
typedef ulonglong HA_METADATA_KEY; typedef ulonglong HA_METADATA_KEY;
#define hatoku_version 0 #define hatoku_version 0
#define hatoku_capabilities 1 #define hatoku_capabilities 1
#define hatoku_max_ai 2 //maximum auto increment value found so far #define hatoku_max_ai 2 //maximum auto increment value found so far
#define hatoku_ai_create_value 3 #define hatoku_ai_create_value 3
typedef struct st_prim_key_part_info { typedef struct st_filter_key_part_info {
uint offset; uint offset;
uint part_index; uint part_index;
} PRIM_KEY_PART_INFO; } FILTER_KEY_PART_INFO;
typedef enum { typedef enum {
lock_read = 0, lock_read = 0,
...@@ -125,6 +142,19 @@ private: ...@@ -125,6 +142,19 @@ private:
// //
uchar *primary_key_buff; uchar *primary_key_buff;
bool unpack_entire_row;
//
// buffers (and their sizes) that will hold the indexes
// of fields that need to be read for a query
//
u_int32_t* fixed_cols_for_query;
u_int32_t num_fixed_cols_for_query;
u_int32_t* var_cols_for_query;
u_int32_t num_var_cols_for_query;
bool read_blobs;
bool read_key;
// //
// transaction used by ha_tokudb's cursor // transaction used by ha_tokudb's cursor
// //
...@@ -159,11 +189,6 @@ private: ...@@ -159,11 +189,6 @@ private:
ulonglong num_deleted_rows_in_stmt; ulonglong num_deleted_rows_in_stmt;
ulonglong num_updated_rows_in_stmt; ulonglong num_updated_rows_in_stmt;
//
// index into key_file that holds DB* that is indexed on
// the primary_key. this->key_file[primary_index] == this->file
//
uint primary_key;
uint last_dup_key; uint last_dup_key;
// //
// if set to 0, then the primary key is not hidden // if set to 0, then the primary key is not hidden
...@@ -186,8 +211,6 @@ private: ...@@ -186,8 +211,6 @@ private:
// //
bool range_lock_grabbed; bool range_lock_grabbed;
PRIM_KEY_PART_INFO* primary_key_offsets;
// //
// buffer for updating the status of long insert, delete, and update // buffer for updating the status of long insert, delete, and update
// statements. Right now, the the messages are // statements. Right now, the the messages are
...@@ -200,7 +223,11 @@ private: ...@@ -200,7 +223,11 @@ private:
uchar current_ident[TOKUDB_HIDDEN_PRIMARY_KEY_LENGTH]; uchar current_ident[TOKUDB_HIDDEN_PRIMARY_KEY_LENGTH];
ulong max_row_length(const uchar * buf); ulong max_row_length(const uchar * buf);
int pack_row(DBT * row, const uchar * record, bool strip_pk); int pack_row(
DBT * row,
const uchar* record,
uint index
);
u_int32_t place_key_into_mysql_buff(KEY* key_info, uchar * record, uchar* data); u_int32_t place_key_into_mysql_buff(KEY* key_info, uchar * record, uchar* data);
void unpack_key(uchar * record, DBT const *key, uint index); void unpack_key(uchar * record, DBT const *key, uint index);
u_int32_t place_key_into_dbt_buff(KEY* key_info, uchar * buff, const uchar * record, bool* has_null, int key_length); u_int32_t place_key_into_dbt_buff(KEY* key_info, uchar * buff, const uchar * record, bool* has_null, int key_length);
...@@ -222,6 +249,12 @@ private: ...@@ -222,6 +249,12 @@ private:
int update_max_auto_inc(DB* db, ulonglong val); int update_max_auto_inc(DB* db, ulonglong val);
int write_auto_inc_create(DB* db, ulonglong val); int write_auto_inc_create(DB* db, ulonglong val);
void init_auto_increment(); void init_auto_increment();
int initialize_share(
const char* name,
int mode
);
void set_query_columns(uint keynr);
public: public:
...@@ -361,10 +394,21 @@ public: ...@@ -361,10 +394,21 @@ public:
void read_key_only(uchar * buf, uint keynr, DBT const *row, DBT const *found_key); void read_key_only(uchar * buf, uint keynr, DBT const *row, DBT const *found_key);
void read_primary_key(uchar * buf, uint keynr, DBT const *row, DBT const *found_key); void read_primary_key(uchar * buf, uint keynr, DBT const *row, DBT const *found_key);
int read_row(uchar * buf, uint keynr, DBT const *row, DBT const *found_key); int read_row(uchar * buf, uint keynr, DBT const *row, DBT const *found_key);
void unpack_row(uchar * record, DBT const *row, DBT const *key, bool pk_stripped); void unpack_row(
uchar* record,
DBT const *row,
DBT const *key,
uint index
);
int heavi_ret_val; int heavi_ret_val;
//
// index into key_file that holds DB* that is indexed on
// the primary_key. this->key_file[primary_index] == this->file
//
uint primary_key;
private: private:
int read_full_row(uchar * buf); int read_full_row(uchar * buf);
int __close(int mutex_is_locked); int __close(int mutex_is_locked);
......
...@@ -27,7 +27,7 @@ typedef enum { ...@@ -27,7 +27,7 @@ typedef enum {
} TOKU_TYPE; } TOKU_TYPE;
inline TOKU_TYPE mysql_to_toku_type (enum_field_types mysql_type); inline TOKU_TYPE mysql_to_toku_type (Field* field);
uchar* pack_toku_key_field( uchar* pack_toku_key_field(
...@@ -51,6 +51,7 @@ uchar* unpack_toku_key_field( ...@@ -51,6 +51,7 @@ uchar* unpack_toku_key_field(
u_int32_t key_part_length u_int32_t key_part_length
); );
// //
// for storing NULL byte in keys // for storing NULL byte in keys
// //
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment