604
604
* null_ptr refers to my buffer. If I cannot, then I
605
605
* cannot use the set_notnull() method.
607
static void mx_set_notnull_in_record(Field *field, char *record)
607
static void mx_set_notnull_in_record(STRUCT_TABLE *table, Field *field, char *record)
610
record[(uint) (field->null_ptr - (uchar *) field->table->record[0])] &= (uchar) ~field->null_bit;
611
record[(uint) (field->null_ptr - (uchar *) table->default_values)] &= (uchar) ~field->null_bit;
613
ASSERT(table == field->table);
615
record[(uint) (field->null_ptr - (uchar *) table->record[0])] &= (uchar) ~field->null_bit;
613
static xtBool mx_is_null_in_record(Field *field, char *record)
619
static xtBool mx_is_null_in_record(STRUCT_TABLE *table, Field *field, char *record)
615
621
if (field->null_ptr) {
616
if (record[(uint) (field->null_ptr - (uchar *) field->table->record[0])] & (uchar) field->null_bit)
623
if (record[(uint) (field->null_ptr - (uchar *) table->default_values)] & (uchar) field->null_bit)
626
ASSERT(table == field->table);
627
if (record[(uint) (field->null_ptr - (uchar *) table->record[0])] & (uchar) field->null_bit)
624
636
* method that just returns the byte length and
625
637
* pointer to the data in a row.
627
static char *mx_get_length_and_data(Field *field, char *dest, xtWord4 *len)
639
static char *mx_get_length_and_data(STRUCT_TABLE *table, Field *field, char *dest, xtWord4 *len)
631
#if MYSQL_VERSION_ID < 50114
632
from = dest + field->offset();
644
from = dest + field->offset(table->default_values);
634
from = dest + field->offset(field->table->record[0]);
646
ASSERT(table == field->table);
647
from = dest + field->offset(table->record[0]);
636
649
switch (field->real_type()) {
654
667
field->ptr = save; // Restore org row pointer
657
xtWord4 packlength = ((Field_blob *) field)->pack_length() - field->table->s->blob_ptr_size;
670
xtWord4 packlength = ((Field_blob *) field)->pack_length_no_ptr();
658
672
memcpy(&data, ((char *) from)+packlength, sizeof(char*));
660
*len = ((Field_blob *) field)->get_length((byte *) from);
674
//*len = ((Field_blob *) field)->get_length((byte *) from);
675
*len = ((Field_blob *) field)->get_length((byte *) from, packlength, GET_TABLE_SHARE(table)->db_low_byte_first);
744
759
* bug number 154 in the MySQL bug database: GROUP BY
745
760
* and DISTINCT could treat NULL values inequal".
747
static void mx_set_length_and_data(Field *field, char *dest, xtWord4 len, char *data)
762
static void mx_set_length_and_data(STRUCT_TABLE *table, Field *field, char *dest, xtWord4 len, char *data)
751
#if MYSQL_VERSION_ID < 50114
752
from = dest + field->offset();
767
from = dest + field->offset(table->default_values);
754
from = dest + field->offset(field->table->record[0]);
769
ASSERT(table == field->table);
770
from = dest + field->offset(table->record[0]);
756
772
switch (field->real_type()) {
768
784
((Field_blob *) field)->set_ptr(len, data);
769
785
field->ptr = save; // Restore org row pointer
771
xtWord4 packlength = ((Field_blob *) field)->pack_length() - field->table->s->blob_ptr_size;
787
xtWord4 packlength = ((Field_blob *) field)->pack_length_no_ptr();
773
((Field_blob *) field)->store_length((byte *) from, packlength, len);
789
((Field_blob *) field)->store_length((byte *) from, packlength, len, GET_TABLE_SHARE(table)->db_low_byte_first);
774
790
memcpy_fixed(((char *) from)+packlength, &data, sizeof(char*));
777
mx_set_notnull_in_record(field, dest);
793
mx_set_notnull_in_record(table, field, dest);
781
797
case MYSQL_TYPE_STRING:
783
mx_set_notnull_in_record(field, dest);
799
mx_set_notnull_in_record(table, field, dest);
784
800
memcpy(from, data, len);
792
808
case MYSQL_TYPE_VAR_STRING:
793
809
int2store(from, len);
795
mx_set_notnull_in_record(field, dest);
811
mx_set_notnull_in_record(table, field, dest);
796
812
memcpy(from+HA_KEY_BLOB_LENGTH, data, len);
804
820
int2store(from, len);
806
mx_set_notnull_in_record(field, dest);
822
mx_set_notnull_in_record(table, field, dest);
807
823
memcpy(from+((Field_varstring *) field)->length_bytes, data, len);
863
879
xtPublic void myxt_set_default_row_from_key(XTOpenTablePtr ot, XTIndexPtr ind, xtWord1 *record)
865
881
XTTableHPtr tab = ot->ot_table;
866
TABLE *table = tab->tab_dic.dic_my_table;
882
STRUCT_TABLE *table = tab->tab_dic.dic_my_table;
867
883
XTIndexSegRec *keyseg = ind->mi_seg;
869
885
xt_lock_mutex_ns(&tab->tab_dic_field_lock);
871
887
for (u_int i=0; i<ind->mi_seg_count; i++, keyseg++) {
873
889
u_int col_idx = keyseg->col_idx;
874
Field *field = table->field[col_idx];
890
Field *field = GET_TABLE_FIELDS(table)[col_idx];
875
891
byte *field_save = field->ptr;
877
field->ptr = table->s->default_values + keyseg->start;
893
field->ptr = GET_TABLE_SHARE(table)->default_values + keyseg->start;
878
894
memcpy(record + keyseg->start, field->ptr, field->pack_length());
879
895
record[keyseg->null_pos] &= ~keyseg->null_bit;
880
record[keyseg->null_pos] |= table->s->default_values[keyseg->null_pos] & keyseg->null_bit;
896
record[keyseg->null_pos] |= GET_TABLE_SHARE(table)->default_values[keyseg->null_pos] & keyseg->null_bit;
882
898
field->ptr = field_save;
1563
1579
xtPublic xtWord4 myxt_store_row_length(XTOpenTablePtr ot, char *rec_buff)
1565
TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1569
xtWord4 row_size = 0;
1581
STRUCT_TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1585
xtWord4 row_size = 0;
1571
for (Field **field=table->field ; *field ; field++) {
1587
for (Field **field=GET_TABLE_FIELDS(table); *field ; field++) {
1572
1588
if ((*field)->is_null_in_record((const uchar *) rec_buff)) {
1578
sdata = mx_get_length_and_data(*field, rec_buff, &dlen);
1594
sdata = mx_get_length_and_data(table, *field, rec_buff, &dlen);
1580
1596
/* Empty, but not null (blobs may return NULL, when
1601
1617
xtPublic xtWord4 myxt_store_row_data(XTOpenTablePtr ot, xtWord4 row_size, char *rec_buff)
1603
TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1619
STRUCT_TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1608
for (Field **field=table->field ; *field ; field++) {
1609
if ((*field)->is_null_in_record((const uchar *) rec_buff)) {
1624
for (Field **field=GET_TABLE_FIELDS(table); *field; field++) {
1625
if (mx_is_null_in_record(table, *field, rec_buff)) {
1615
sdata = mx_get_length_and_data(*field, rec_buff, &dlen);
1631
sdata = mx_get_length_and_data(table, *field, rec_buff, &dlen);
1617
1633
/* Empty, but not null (blobs may return NULL, when
1728
1744
/* Unload from PBXT variable length format to the MySQL row format. */
1729
1745
xtPublic xtWord4 myxt_load_row_data(XTOpenTablePtr ot, xtWord1 *source_buf, xtWord1 *dest_buff, u_int col_cnt)
1731
xtWord1 *input_buf = source_buf;
1747
xtWord1 *input_buf = source_buf;
1748
STRUCT_TABLE *table;
1738
1754
if (!(table = ot->ot_table->tab_dic.dic_my_table)) {
1739
1755
xt_register_taberr(XT_REG_CONTEXT, XT_ERR_NO_DICTIONARY, ot->ot_table->tab_name);
1745
1761
* have the SQL NULL bit set unless it
1746
1762
* is a nullable column with a non-NULL value".
1748
memset(dest_buff, 0xFF, table->s->null_bytes);
1749
for (Field **field=table->field ; *field && (!col_cnt || i<col_cnt); field++, i++) {
1764
memset(dest_buff, 0xFF, GET_TABLE_SHARE(table)->null_bytes);
1765
for (Field **field=GET_TABLE_FIELDS(table); *field && (!col_cnt || i<col_cnt); field++, i++) {
1750
1766
curr_field = *field;
1751
1767
is_null = FALSE;
1752
1768
switch (*source_buf) {
1781
mx_set_length_and_data(curr_field, (char *) dest_buff, 0, NULL);
1797
mx_set_length_and_data(table, curr_field, (char *) dest_buff, 0, NULL);
1783
mx_set_length_and_data(curr_field, (char *) dest_buff, len, (char *) source_buf);
1799
mx_set_length_and_data(table, curr_field, (char *) dest_buff, len, (char *) source_buf);
1785
1801
source_buf += len;
1795
1811
xtPublic xtBool myxt_find_column(XTOpenTablePtr ot, u_int *col_idx, const char *col_name)
1797
TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1813
STRUCT_TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1800
for (Field **field=table->field; *field; field++, i++) {
1816
for (Field **field=GET_TABLE_FIELDS(table); *field; field++, i++) {
1801
1817
if (!my_strcasecmp(system_charset_info, (*field)->field_name, col_name)) {
1809
1825
xtPublic void myxt_get_column_name(XTOpenTablePtr ot, u_int col_idx, u_int len, char *col_name)
1811
TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1827
STRUCT_TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1814
field = table->field[col_idx];
1830
field = GET_TABLE_FIELDS(table)[col_idx];
1815
1831
xt_strcpy(len, col_name, field->field_name);
1818
1834
xtPublic void myxt_get_column_as_string(XTOpenTablePtr ot, char *buffer, u_int col_idx, u_int len, char *value)
1820
XTTableHPtr tab = ot->ot_table;
1821
XTThreadPtr self = ot->ot_thread;
1822
TABLE *table = tab->tab_dic.dic_my_table;
1823
Field *field = table->field[col_idx];
1824
char buf_val[MAX_FIELD_WIDTH];
1825
String val(buf_val, sizeof(buf_val), &my_charset_bin);
1836
XTTableHPtr tab = ot->ot_table;
1837
XTThreadPtr self = ot->ot_thread;
1838
STRUCT_TABLE *table = tab->tab_dic.dic_my_table;
1839
Field *field = GET_TABLE_FIELDS(table)[col_idx];
1840
char buf_val[MAX_FIELD_WIDTH];
1841
String val(buf_val, sizeof(buf_val), &my_charset_bin);
1827
if (mx_is_null_in_record(field, buffer))
1843
if (mx_is_null_in_record(table, field, buffer))
1828
1844
xt_strcpy(len, value, "NULL");
1832
1849
/* Required by store() - or an assertion will fail: */
1833
1850
if (table->read_set)
1834
1851
MX_BIT_SET(table->read_set, col_idx);
1836
1854
save = field->ptr;
1837
1855
xt_lock_mutex(self, &tab->tab_dic_field_lock);
1838
1856
pushr_(xt_unlock_mutex, &tab->tab_dic_field_lock);
1839
#if MYSQL_VERSION_ID < 50114
1840
field->ptr = (byte *) buffer + field->offset();
1858
field->ptr = (byte *) buffer + field->offset(table->default_values);
1842
1860
field->ptr = (byte *) buffer + field->offset(field->table->record[0]);
1851
1869
xtPublic xtBool myxt_set_column(XTOpenTablePtr ot, char *buffer, u_int col_idx, const char *value, u_int len)
1853
XTTableHPtr tab = ot->ot_table;
1854
XTThreadPtr self = ot->ot_thread;
1855
TABLE *table = tab->tab_dic.dic_my_table;
1856
Field *field = table->field[col_idx];
1871
XTTableHPtr tab = ot->ot_table;
1872
XTThreadPtr self = ot->ot_thread;
1873
STRUCT_TABLE *table = tab->tab_dic.dic_my_table;
1874
Field *field = GET_TABLE_FIELDS(table)[col_idx];
1860
1879
/* Required by store() - or an assertion will fail: */
1861
1880
if (table->write_set)
1862
1881
MX_BIT_SET(table->write_set, col_idx);
1864
mx_set_notnull_in_record(field, buffer);
1884
mx_set_notnull_in_record(table, field, buffer);
1866
1886
save = field->ptr;
1867
1887
xt_lock_mutex(self, &tab->tab_dic_field_lock);
1868
1888
pushr_(xt_unlock_mutex, &tab->tab_dic_field_lock);
1869
#if MYSQL_VERSION_ID < 50114
1870
field->ptr = (byte *) buffer + field->offset();
1890
field->ptr = (byte *) buffer + field->offset(table->default_values);
1872
1892
field->ptr = (byte *) buffer + field->offset(field->table->record[0]);
1880
1900
xtPublic void myxt_get_column_data(XTOpenTablePtr ot, char *buffer, u_int col_idx, char **value, size_t *len)
1882
TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1883
Field *field = table->field[col_idx];
1902
STRUCT_TABLE *table = ot->ot_table->tab_dic.dic_my_table;
1903
Field *field = GET_TABLE_FIELDS(table)[col_idx];
1887
sdata = mx_get_length_and_data(field, buffer, &dlen);
1907
sdata = mx_get_length_and_data(table, field, buffer, &dlen);
1888
1908
*value = sdata;
1987
2007
* MySQL Data Dictionary
1990
#define TS(x) (x)->s
1992
static void my_close_table(TABLE *table)
2011
static void my_close_table(STRUCT_TABLE *share)
2017
* This function returns NULL if the table cannot be opened
2018
* because this is not a MySQL thread.
2020
static STRUCT_TABLE *my_open_table(XTThreadPtr self, XTDatabaseHPtr XT_UNUSED(db), XTPathStrPtr tab_path, xtWord1 table_type)
2022
THD *thd = current_thd;
2023
char *tab_file_name;
2024
char database_name[XT_IDENTIFIER_NAME_SIZE];
2025
char tab_name[XT_IDENTIFIER_NAME_SIZE];
2026
uint32_t tab_name_len;
2030
/* If we have no MySQL thread, then we cannot open this table!
2031
* What this means is the thread is probably the sweeper or the
2037
tab_file_name = xt_last_name_of_path(tab_path->ps_path);
2038
tab_name_len = filename_to_tablename(tab_file_name, tab_name, XT_IDENTIFIER_NAME_SIZE);
2040
xt_2nd_last_name_of_path(XT_IDENTIFIER_NAME_SIZE, database_name, tab_path->ps_path);
2042
TableIdentifier *ident = NULL;
2044
if (table_type == XT_TABLE_TYPE_TEMPORARY) {
2045
std::string tmp_path(drizzle_tmpdir);
2046
tmp_path.append("/");
2047
tmp_path.append(tab_file_name);
2048
ident = new TableIdentifier(database_name, tab_name, tmp_path);
2050
else if (table_type == XT_TABLE_TYPE_STANDARD) {
2051
ident = new TableIdentifier(
2052
std::string(database_name),
2053
std::string(tab_name, tab_name_len),
2054
message::Table::STANDARD);
2058
n.append(data_home);
2060
n.append(database_name);
2062
n.append(tab_file_name);
2063
ident = new TableIdentifier(database_name, tab_name, n);
2066
share = new TableShare();
2068
if ((error = share->open_table_def(*thd, *ident))) {
2069
xt_throw_sulxterr(XT_CONTEXT, XT_ERR_LOADING_MYSQL_DIC, tab_path->ps_path, (u_long) error);
2078
static void my_close_table(STRUCT_TABLE *table)
1994
2080
#ifdef DRIZZLED
1995
2081
#if 0 // Removed by Brian
2008
2094
* This function returns NULL if the table cannot be opened
2009
2095
* because this is not a MySQL thread.
2011
static TABLE *my_open_table(XTThreadPtr self, XTDatabaseHPtr XT_UNUSED(db), XTPathStrPtr tab_path, xtWord1 table_type)
2097
static STRUCT_TABLE *my_open_table(XTThreadPtr self, XTDatabaseHPtr XT_UNUSED(db), XTPathStrPtr tab_path, xtWord1 table_type)
2013
2099
THD *thd = current_thd;
2014
2100
char path_buffer[PATH_MAX];
2258
2345
#define MX_OFFSETOF(x, y) ((size_t)(&((x *) 8)->y) - 8)
2260
2347
/* Derived from ha_myisam::create and mi_create */
2261
static XTIndexPtr my_create_index(XTThreadPtr self, TABLE *table_arg, u_int idx, KeyInfo *index)
2348
static XTIndexPtr my_create_index(XTThreadPtr self, STRUCT_TABLE *table_arg, u_int idx, KeyInfo *index)
2263
2350
XTIndexPtr ind;
2264
2351
KeyPartInfo *key_part;
2278
2365
xt_spinlock_init_with_autoname(self, &ind->mi_dirty_lock);
2279
2366
ind->mi_index_no = idx;
2280
2367
ind->mi_flags = (index->flags & (HA_NOSAME | HA_NULL_ARE_EQUAL | HA_UNIQUE_CHECK));
2281
ind->mi_low_byte_first = TS(table_arg)->db_low_byte_first;
2368
ind->mi_low_byte_first = GET_TABLE_SHARE(table_arg)->db_low_byte_first;
2282
2369
ind->mi_fix_key = TRUE;
2283
2370
ind->mi_select_total = 0;
2284
2371
ind->mi_subset_of = 0;
2285
myxt_bitmap_init(self, &ind->mi_col_map, TS(table_arg)->fields);
2372
myxt_bitmap_init(self, &ind->mi_col_map, GET_TABLE_SHARE(table_arg)->fields);
2287
2374
ind->mi_seg_count = (uint) index->key_parts;
2288
2375
key_part_end = index->key_part + index->key_parts;
2356
2447
seg->flag |= HA_BLOB_PART;
2357
2448
/* save number of bytes used to pack length */
2358
seg->bit_start = (uint) (field->pack_length() - TS(table_arg)->blob_ptr_size);
2449
seg->bit_start = (uint) ((Field_blob *) field)->pack_length_no_ptr();
2360
2451
#ifndef DRIZZLED
2361
2452
else if (field->type() == MYSQL_TYPE_BIT) {
2517
2608
xtPublic void myxt_setup_dictionary(XTThreadPtr self, XTDictionaryPtr dic)
2519
TABLE *my_tab = dic->dic_my_table;
2610
STRUCT_TABLE *my_tab = dic->dic_my_table;
2520
2611
u_int field_count;
2521
2612
u_int var_field_count = 0;
2522
2613
u_int varchar_field_count = 0;
2547
2638
dic->dic_ind_cols_req = 0;
2548
for (uint i=0; i<TS(my_tab)->keys; i++) {
2639
for (uint i=0; i<GET_TABLE_SHARE(my_tab)->keys; i++) {
2549
2640
index = &my_tab->key_info[i];
2551
2642
key_part_end = index->key_part + index->key_parts;
2560
2651
/* We will work out how many columns are required for all blobs: */
2561
2652
dic->dic_blob_cols_req = 0;
2562
2653
field_count = 0;
2563
for (field=my_tab->field; (curr_field = *field); field++) {
2654
for (field=GET_TABLE_FIELDS(my_tab); (curr_field = *field); field++) {
2565
2656
min_data_size = curr_field->key_length();
2566
2657
max_data_size = curr_field->key_length();
2672
2763
if (dic->dic_def_ave_row_size) {
2673
2764
/* The average row size has been set: */
2674
dic_rec_size = offsetof(XTTabRecFix, rf_data) + TS(my_tab)->reclength;
2765
dic_rec_size = offsetof(XTTabRecFix, rf_data) + GET_TABLE_SHARE(my_tab)->reclength;
2676
2767
/* The conditions for a fixed record are: */
2677
if (dic->dic_def_ave_row_size >= (xtWord8) TS(my_tab)->reclength &&
2768
if (dic->dic_def_ave_row_size >= (xtWord8) GET_TABLE_SHARE(my_tab)->reclength &&
2678
2769
dic_rec_size <= XT_TAB_MAX_FIX_REC_LENGTH &&
2679
2770
!blob_field_count) {
2680
2771
dic_rec_fixed = TRUE;
2700
2791
* we handle these rows as fixed size rows.
2701
2792
* Fixed size rows use the internal MySQL format.
2703
dic_rec_size = offsetof(XTTabRecFix, rf_data) + TS(my_tab)->reclength;
2794
dic_rec_size = offsetof(XTTabRecFix, rf_data) + GET_TABLE_SHARE(my_tab)->reclength;
2704
2795
/* Fixed length records must be less than 16K in size,
2705
2796
* have an average size which is very close (20%) to the maximum size or
2706
2797
* be less than a minimum size,
2771
2862
* index columns!
2773
2864
if (field_count == dic->dic_ind_cols_req)
2774
dic->dic_ind_rec_len = TS(my_tab)->reclength;
2865
dic->dic_ind_rec_len = GET_TABLE_SHARE(my_tab)->reclength;
2776
field=my_tab->field;
2867
field=GET_TABLE_FIELDS(my_tab);
2778
2869
curr_field = field[dic->dic_ind_cols_req];
2779
#if MYSQL_VERSION_ID < 50114
2780
dic->dic_ind_rec_len = curr_field->offset();
2871
dic->dic_ind_rec_len = curr_field->offset(my_tab->default_values);
2782
dic->dic_ind_rec_len = curr_field->offset(curr_field->table->record[0]);
2873
dic->dic_ind_rec_len = curr_field->offset(my_tab->record[0]);
2795
2886
if (!dic_rec_fixed) {
2796
2887
xtWord8 max_rec_size = offsetof(XTTabRecExt, re_data);
2798
for (Field **f=my_tab->field; (curr_field = *f); f++) {
2889
for (Field **f=GET_TABLE_FIELDS(my_tab); (curr_field = *f); f++) {
2799
2890
max_data_size = curr_field->key_length();
2800
2891
enum_field_types tno = curr_field->type();
2801
2892
if (tno == MYSQL_TYPE_BLOB)
2815
2906
ASSERT(dic->dic_fix_col_count < dic->dic_no_of_cols);
2818
dic->dic_key_count = TS(my_tab)->keys;
2819
dic->dic_mysql_buf_size = TS(my_tab)->rec_buff_length;
2820
dic->dic_mysql_rec_size = TS(my_tab)->reclength;
2909
dic->dic_key_count = GET_TABLE_SHARE(my_tab)->keys;
2910
dic->dic_mysql_buf_size = GET_TABLE_SHARE(my_tab)->rec_buff_length;
2911
dic->dic_mysql_rec_size = GET_TABLE_SHARE(my_tab)->reclength;
2823
2914
static u_int my_get_best_superset(XTThreadPtr XT_UNUSED(self), XTDictionaryPtr dic, XTIndexPtr ind)
2848
2939
xtPublic xtBool myxt_load_dictionary(XTThreadPtr self, XTDictionaryPtr dic, XTDatabaseHPtr db, XTPathStrPtr tab_path)
2941
STRUCT_TABLE *my_tab;
2852
2943
if (!(my_tab = my_open_table(self, db, tab_path, dic->dic_table_type)))
2854
2945
dic->dic_my_table = my_tab;
2855
2946
#ifdef DRIZZLED
2856
dic->dic_def_ave_row_size = (xtWord8) my_tab->s->getTableProto()->options().avg_row_length();
2947
dic->dic_def_ave_row_size = (xtWord8) GET_TABLE_SHARE(my_tab)->getTableProto()->options().avg_row_length();
2858
dic->dic_def_ave_row_size = (xtWord8) my_tab->s->avg_row_length;
2949
dic->dic_def_ave_row_size = (xtWord8) GET_TABLE_SHARE(my_tab)->avg_row_length;
2860
2951
myxt_setup_dictionary(self, dic);
2861
dic->dic_keys = (XTIndexPtr *) xt_calloc(self, sizeof(XTIndexPtr) * TS(my_tab)->keys);
2862
for (uint i=0; i<TS(my_tab)->keys; i++)
2952
dic->dic_keys = (XTIndexPtr *) xt_calloc(self, sizeof(XTIndexPtr) * GET_TABLE_SHARE(my_tab)->keys);
2953
for (uint i=0; i<GET_TABLE_SHARE(my_tab)->keys; i++)
2863
2954
dic->dic_keys[i] = my_create_index(self, my_tab, i, &my_tab->key_info[i]);
2865
2956
/* Check if any key is a subset of another: */
2988
static char *my_type_to_string(XTThreadPtr self, Field *field, TABLE *XT_UNUSED(my_tab))
3079
static char *my_type_to_string(XTThreadPtr self, Field *field, STRUCT_TABLE *XT_UNUSED(my_tab))
2990
3081
char buffer[MAX_FIELD_WIDTH + 400];
2991
3082
const char *ptr;
3031
3122
return xt_dup_string(self, buffer); // type.length()
3034
xtPublic XTDDTable *myxt_create_table_from_table(XTThreadPtr self, TABLE *my_tab)
3125
xtPublic XTDDTable *myxt_create_table_from_table(XTThreadPtr self, STRUCT_TABLE *my_tab)
3036
3127
XTDDTable *dd_tab;
3037
3128
Field *curr_field;
3043
3134
dd_tab->init(self);
3044
3135
pushr_(my_free_dd_table, dd_tab);
3046
for (Field **field=my_tab->field; (curr_field = *field); field++) {
3137
for (Field **field=GET_TABLE_FIELDS(my_tab); (curr_field = *field); field++) {
3047
3138
col = XTDDColumnFactory::createFromMySQLField(self, my_tab, curr_field);
3048
3139
dd_tab->dt_cols.append(self, col);
3051
for (uint i=0; i<TS(my_tab)->keys; i++) {
3142
for (uint i=0; i<GET_TABLE_SHARE(my_tab)->keys; i++) {
3052
3143
if (!(ind = (XTDDIndex *) new XTDDIndex(XT_DD_UNKNOWN)))
3053
3144
xt_throw_errno(XT_CONTEXT, XT_ENOMEM);
3054
3145
dd_tab->dt_indexes.append(self, ind);
3340
3431
#ifdef UNUSED_CODE
3341
3432
static void mx_put_int(TABLE *table, int column, int value)
3343
table->field[column]->store(value, false);
3434
GET_TABLE_FIELDS(table)[column]->store(value, false);
3346
3437
static void mx_put_real8(TABLE *table, int column, xtReal8 value)
3348
table->field[column]->store(value);
3439
GET_TABLE_FIELDS(table)[column]->store(value);
3351
3442
static void mx_put_string(TABLE *table, int column, const char *string, u_int len, charset_info_st *charset)
3353
table->field[column]->store(string, len, charset);
3444
GET_TABLE_FIELDS(table)[column]->store(string, len, charset);
3357
3448
static void mx_put_u_llong(TABLE *table, int column, u_llong value)
3359
table->field[column]->store(value, false);
3450
GET_TABLE_FIELDS(table)[column]->store(value, false);
3362
3453
static void mx_put_string(TABLE *table, int column, const char *string, charset_info_st *charset)
3364
table->field[column]->store(string, strlen(string), charset);
3455
GET_TABLE_FIELDS(table)[column]->store(string, strlen(string), charset);
3367
3458
xtPublic int myxt_statistics_fill_table(XTThreadPtr self, void *th, void *ta, void *, MX_CONST void *ch)
3494
3585
* XTDDColumnFactory methods
3497
XTDDColumn *XTDDColumnFactory::createFromMySQLField(XTThread *self, TABLE *my_tab, Field *field)
3588
XTDDColumn *XTDDColumnFactory::createFromMySQLField(XTThread *self, STRUCT_TABLE *my_tab, Field *field)
3499
3590
XTDDEnumerableColumn *en_col;
3500
3591
XTDDColumn *col;