Update of /cvsroot/firebird/vulcan/src/jrd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25642 Modified Files: Attachment.h btr.cpp btr.h btr_proto.h constants.h dfw.epp dyn.h evl.cpp exe.h idx.cpp idx_proto.h ini.epp met.epp met_proto.h nav.cpp opt.cpp rse.cpp rse.h sort.cpp sort.h sort_proto.h val.cpp Log Message: Update structure and class names to simplify merge Index: Attachment.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/Attachment.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- Attachment.h 20 Jan 2005 19:22:42 -0000 1.1.1.1 +++ Attachment.h 28 Feb 2005 00:43:18 -0000 1.2 @@ -99,7 +99,7 @@ class usr; class Request; class lck; -class scb; +class sort_context; class scl; class bkm; @@ -122,7 +122,7 @@ Transaction* att_transactions; // Transactions belonging to attachment Transaction* att_dbkey_trans; // transaction to control db-key scope Request* att_requests; // Requests belonging to attachment - scb* att_active_sorts; // Active sorts + sort_context* att_active_sorts; // Active sorts lck* att_id_lock; // Attachment lock (if any) SLONG att_attachment_id; // Attachment ID SLONG att_lock_owner_handle; // Handle for the lock manager Index: btr.cpp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/btr.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- btr.cpp 20 Jan 2005 19:32:21 -0000 1.1.1.1 +++ btr.cpp 28 Feb 2005 00:43:18 -0000 1.2 @@ -78,7 +78,7 @@ #endif **********************************************/ -#define MAX_LEVELS 16 +const int MAX_LEVELS = 16; inline void MOVE_BYTE(UCHAR*& x_from, UCHAR*& x_to) { @@ -92,7 +92,7 @@ #define NO_VALUE END_LEVEL // A split page will never have the number 0, because that's the value // of the main page. -#define NO_SPLIT 0 +const SLONG NO_SPLIT = 0; // Thresholds for determing of a page should be garbage collected // Garbage collect if page size is below GARBAGE_COLLECTION_THRESHOLD @@ -102,21 +102,23 @@ // 256 is the old maximum possible key_length. #define GARBAGE_COLLECTION_NEW_PAGE_MAX_THRESHOLD ((dbb->dbb_page_size - 256)) -typedef struct { +struct INT64_KEY { double d_part; SSHORT s_part; -} INT64_KEY; +}; -#define INT64_KEY_LENGTH (sizeof (double) + sizeof (SSHORT)) +// I assume this wasn't done sizeof(INT64_KEY) on purpose, since alignment might affect it. +size_t INT64_KEY_LENGTH = sizeof (double) + sizeof (SSHORT); -static const double pow10[] = - { 1.e00, 1.e01, 1.e02, 1.e03, 1.e04, 1.e05, 1.e06, 1.e07, 1.e08, 1.e09, +static const double pow10_table[] = +{ + 1.e00, 1.e01, 1.e02, 1.e03, 1.e04, 1.e05, 1.e06, 1.e07, 1.e08, 1.e09, 1.e10, 1.e11, 1.e12, 1.e13, 1.e14, 1.e15, 1.e16, 1.e17, 1.e18, 1.e19, 1.e20, 1.e21, 1.e22, 1.e23, 1.e24, 1.e25, 1.e26, 1.e27, 1.e28, 1.e29, 1.e30, 1.e31, 1.e32, 1.e33, 1.e34, 1.e35, 1.e36 }; -#define powerof10(s) ((s) <= 0 ? pow10[-(s)] : 1./pow10[-(s)]) +#define powerof10(s) ((s) <= 0 ? pow10_table[-(s)] : 1. / pow10_table[-(s)]) static const struct { /* Used in make_int64_key() */ UINT64 limit; @@ -157,45 +159,59 @@ /* enumerate the possible outcomes of deleting a node */ -typedef enum contents { +enum contents { contents_empty = 0, contents_single, contents_below_threshold, contents_above_threshold -} CONTENTS; +}; -static SLONG add_node(TDBB, WIN *, IIB *, KEY *, SLONG *, SLONG *, SLONG *); -static void complement_key(KEY *); -static void compress(TDBB, DSC *, KEY *, USHORT, bool, bool, USHORT); +typedef contents CONTENTS; + +static SLONG add_node(TDBB, WIN *, index_insertion*, temporary_key*, SLONG *, + SLONG *, SLONG *); +static void complement_key(temporary_key*); +static void compress(TDBB, DSC *, temporary_key*, USHORT, bool, bool, USHORT); static USHORT compress_root(TDBB, IRT); -static void copy_key(const KEY*, KEY*); +static void copy_key(const temporary_key*, temporary_key*); static CONTENTS delete_node(TDBB, WIN *, UCHAR *); static void delete_tree(TDBB, USHORT, USHORT, SLONG, SLONG); static DSC *eval(TDBB, JRD_NOD, DSC *, bool *); -static SLONG fast_load(TDBB, JRD_REL, Transaction*, IDX *, USHORT, SCB, SelectivityList&); -static IRT fetch_root(TDBB, WIN *, JRD_REL); -static UCHAR *find_node_start_point(BTR, KEY *, UCHAR *, USHORT *, bool, bool, bool = false, SLONG = NO_VALUE); -static UCHAR* find_area_start_point(BTR, const KEY*, UCHAR *, USHORT *, bool, bool, SLONG = NO_VALUE); -static SLONG find_page(BTR, const KEY*, UCHAR, SLONG = NO_VALUE, bool = false); +static SLONG fast_load(TDBB, Relation*, Transaction*, index_desc*, USHORT, sort_context*, + SelectivityList&); + +static IRT fetch_root(TDBB, WIN *, Relation*); +static UCHAR *find_node_start_point(BTR, temporary_key*, UCHAR *, USHORT *, + bool, bool, bool = false, SLONG = NO_VALUE); + +static UCHAR* find_area_start_point(BTR, const temporary_key*, UCHAR *, + USHORT *, bool, bool, SLONG = NO_VALUE); + +static SLONG find_page(BTR, const temporary_key*, UCHAR, SLONG = NO_VALUE, + bool = false); + static CONTENTS garbage_collect(TDBB, WIN *, SLONG); -static void generate_jump_nodes(TDBB, BTR, jumpNodeList*, USHORT, USHORT*, USHORT*, USHORT*); -static SLONG insert_node(TDBB, WIN *, IIB *, KEY *, SLONG *, SLONG *, SLONG *); +static void generate_jump_nodes(TDBB, BTR, jumpNodeList*, USHORT, + USHORT*, USHORT*, USHORT*); + +static SLONG insert_node(TDBB, WIN *, index_insertion*, temporary_key*, + SLONG *, SLONG *, SLONG *); + //static void journal_btree_segment(TDBB, WIN *, BTR); static INT64_KEY make_int64_key(SINT64, SSHORT); - #ifdef DEBUG_INDEXKEY static void print_int64_key(SINT64, SSHORT, INT64_KEY); #endif - -static CONTENTS remove_node(TDBB, IIB *, WIN *); -static CONTENTS remove_leaf_node(TDBB, IIB *, WIN *); -static bool scan(TDBB, UCHAR *, SBM *, USHORT, USHORT, KEY *, USHORT, SCHAR); +static CONTENTS remove_node(TDBB, index_insertion*, WIN *); +static CONTENTS remove_leaf_node(TDBB, index_insertion*, WIN *); +static bool scan(TDBB, UCHAR *, SBM *, USHORT, USHORT, + temporary_key*, USHORT, SCHAR); static void update_selectivity(DBB dbb, IRT, USHORT, const SelectivityList&); USHORT BTR_all(TDBB tdbb, - JRD_REL relation, - IDX** start_buffer, - IDX** csb_idx, + Relation* relation, + index_desc** start_buffer, + index_desc** csb_idx, STR* csb_idx_allocation, SLONG* idx_size) { @@ -215,7 +231,7 @@ IRT root; STR new_buffer; USHORT count, i; - IDX *buffer; + index_desc*buffer; SLONG size; SET_TDBB(tdbb); @@ -228,11 +244,11 @@ return 0; } - if ((SLONG) (root->irt_count * sizeof(IDX)) > *idx_size) { - size = (sizeof(IDX) * dbb->dbb_max_idx) + ALIGNMENT; + if ((SLONG) (root->irt_count * sizeof(index_desc)) > *idx_size) { + size = (sizeof(index_desc) * dbb->dbb_max_idx) + ALIGNMENT; *csb_idx_allocation = new_buffer = FB_NEW_RPT(*dbb->dbb_permanent, size) str(); buffer = *start_buffer = - (IDX *) FB_ALIGN((U_IPTR) new_buffer->str_data, ALIGNMENT); + (index_desc*) FB_ALIGN((U_IPTR) new_buffer->str_data, ALIGNMENT); *idx_size = size - ALIGNMENT; } count = 0; @@ -252,11 +268,11 @@ void BTR_create(TDBB tdbb, - JRD_REL relation, + Relation* relation, Transaction *transaction, - IDX * idx, + index_desc* idx, USHORT key_length, - SCB sort_handle, + sort_context* sort_handle, SelectivityList& selectivity) { /************************************** @@ -336,7 +352,7 @@ } -bool BTR_description(DBB dbb, JRD_REL relation, IRT root, IDX * idx, SSHORT id) +bool BTR_description(DBB dbb, Relation* relation, IRT root, index_desc* idx, SSHORT id) { /************************************** * @@ -376,7 +392,7 @@ // pick up field ids and type descriptions for each of the fields const UCHAR* ptr = (UCHAR*) root + irt_desc->irt_desc; - idx::idx_repeat* idx_desc = idx->idx_rpt; + index_desc::idx_repeat* idx_desc = idx->idx_rpt; for (int i = 0; i < idx->idx_count; i++, idx_desc++) { const irtd* key_descriptor = (irtd*) ptr; idx_desc->idx_field = key_descriptor->irtd_field; @@ -403,7 +419,7 @@ } -void BTR_evaluate(TDBB tdbb, IRB retrieval, SBM * bitmap) +void BTR_evaluate(TDBB tdbb, IndexRetrieval* retrieval, SBM * bitmap) { /************************************** * @@ -419,9 +435,9 @@ //SET_TDBB(tdbb); SBM_reset(bitmap); - IDX idx; + index_desc idx; WIN window(-1); - KEY lower, upper; + temporary_key lower, upper; BTR page = BTR_find_page(tdbb, retrieval, &window, &idx, &lower, &upper, false); // If there is a starting descriptor, search down index to starting position. @@ -496,7 +512,7 @@ } -UCHAR *BTR_find_leaf(BTR bucket, KEY *key, UCHAR *value, +UCHAR *BTR_find_leaf(BTR bucket, temporary_key*key, UCHAR *value, USHORT *return_value, int descending, bool retrieval) { /************************************** @@ -516,9 +532,9 @@ BTR BTR_find_page(TDBB tdbb, - IRB retrieval, + IndexRetrieval* retrieval, WIN * window, - IDX * idx, KEY * lower, KEY * upper, bool backwards) + index_desc* idx, temporary_key* lower, temporary_key* upper, bool backwards) { /************************************** * @@ -627,7 +643,7 @@ } -void BTR_insert(TDBB tdbb, WIN * root_window, IIB * insertion) +void BTR_insert(TDBB tdbb, WIN * root_window, index_insertion* insertion) { /************************************** * @@ -643,7 +659,7 @@ SET_TDBB(tdbb); DBB dbb = tdbb->tdbb_database; - IDX* idx = insertion->iib_descriptor; + index_desc* idx = insertion->iib_descriptor; WIN window(idx->idx_root); BTR bucket = (BTR) CCH_FETCH(tdbb, &window, LCK_read, pag_index); @@ -653,7 +669,7 @@ } CCH_RELEASE(tdbb, root_window); - KEY key; + temporary_key key; SLONG recordNumber = 0; SLONG split_page = add_node(tdbb, &window, insertion, &key, &recordNumber, NULL, NULL); @@ -761,7 +777,7 @@ } -IDX_E BTR_key(TDBB tdbb, JRD_REL relation, REC record, IDX * idx, KEY * key, idx_null_state * null_state) +IDX_E BTR_key(TDBB tdbb, Relation* relation, REC record, index_desc* idx, temporary_key* key, idx_null_state * null_state) { /************************************** * @@ -776,12 +792,12 @@ * change. * **************************************/ - KEY temp; + temporary_key temp; DSC desc; DSC* desc_ptr; SSHORT stuff_count; IDX_E result; - idx::idx_repeat* tail; + index_desc::idx_repeat* tail; int missing_unique_segments = 0; SET_TDBB(tdbb); @@ -887,7 +903,7 @@ } -USHORT BTR_key_length(TDBB tdbb, JRD_REL relation, IDX * idx) +USHORT BTR_key_length(TDBB tdbb, Relation* relation, index_desc* idx) { /************************************** * @@ -900,7 +916,7 @@ * **************************************/ USHORT n, key_length, length; - idx::idx_repeat * tail; + index_desc::idx_repeat * tail; FMT format = relation->getCurrentFormat(tdbb); tail = idx->idx_rpt; @@ -1099,7 +1115,7 @@ #endif -USHORT BTR_lookup(TDBB tdbb, JRD_REL relation, USHORT id, IDX * buffer) +USHORT BTR_lookup(TDBB tdbb, Relation* relation, USHORT id, index_desc* buffer) { /************************************** * @@ -1134,7 +1150,7 @@ void BTR_make_key(TDBB tdbb, USHORT count, - JRD_NOD * exprs, IDX * idx, KEY * key, USHORT fuzzy) + JRD_NOD * exprs, index_desc* idx, temporary_key* key, USHORT fuzzy) { /************************************** * @@ -1151,9 +1167,9 @@ SSHORT stuff_count; USHORT n, l; UCHAR *p, *q; - KEY temp; + temporary_key temp; bool isNull; - idx::idx_repeat * tail; + index_desc::idx_repeat * tail; SET_TDBB(tdbb); DBB dbb = tdbb->tdbb_database; @@ -1205,7 +1221,7 @@ bool BTR_next_index(TDBB tdbb, - JRD_REL relation, JRD_TRA transaction, IDX * idx, WIN * window) + Relation* relation, JRD_TRA transaction, index_desc* idx, WIN * window) { /************************************** * @@ -1332,7 +1348,7 @@ } -void BTR_remove(TDBB tdbb, WIN * root_window, IIB * insertion) +void BTR_remove(TDBB tdbb, WIN * root_window, index_insertion* insertion) { /************************************** * @@ -1347,7 +1363,7 @@ **************************************/ DBB dbb = tdbb->tdbb_database; - IDX *idx; + index_desc*idx; idx = insertion->iib_descriptor; WIN window(idx->idx_root); BTR page = (BTR) CCH_FETCH(tdbb, &window, LCK_read, pag_index); @@ -1416,7 +1432,7 @@ } -void BTR_reserve_slot(TDBB tdbb, JRD_REL relation, JRD_TRA transaction, IDX * idx) +void BTR_reserve_slot(TDBB tdbb, Relation* relation, JRD_TRA transaction, index_desc* idx) { /************************************** * @@ -1516,7 +1532,7 @@ } -void BTR_selectivity(TDBB tdbb, JRD_REL relation, USHORT id, SelectivityList& selectivity) +void BTR_selectivity(TDBB tdbb, Relation* relation, USHORT id, SelectivityList& selectivity) { /************************************** * @@ -1565,7 +1581,7 @@ bool dup; SLONG nodes = 0; SLONG duplicates = 0; - KEY key; + temporary_key key; key.key_length = 0; SSHORT l; bool firstNode = true; @@ -1715,8 +1731,8 @@ static SLONG add_node(TDBB tdbb, WIN * window, - IIB * insertion, - KEY * new_key, + index_insertion* insertion, + temporary_key* new_key, SLONG * new_record_number, SLONG * original_page, SLONG * sibling_page) @@ -1775,7 +1791,7 @@ (SSHORT) ((bucket->btr_level == 1) ? LCK_write : LCK_read), pag_index); // now recursively try to insert the node at the next level down - IIB propogate; + index_insertion propogate; split = add_node(tdbb, window, insertion, new_key, new_record_number, &page, &propogate.iib_sibling); if (split == NO_SPLIT) { @@ -1829,7 +1845,7 @@ } -static void complement_key(KEY * key) +static void complement_key(temporary_key* key) { /************************************** * @@ -1851,7 +1867,7 @@ static void compress(TDBB tdbb, DSC * desc, - KEY * key, + temporary_key* key, USHORT itype, bool isNull, bool descending, USHORT fuzzy) { @@ -2229,7 +2245,7 @@ } -static void copy_key(const KEY* in, KEY* out) +static void copy_key(const temporary_key* in, temporary_key* out) { /************************************** * @@ -2544,11 +2560,11 @@ static SLONG fast_load(TDBB tdbb, - JRD_REL relation, + Relation* relation, Transaction *transaction, - IDX * idx, + index_desc* idx, USHORT key_length, - SCB sort_handle, + sort_context* sort_handle, SelectivityList& selectivity) { /************************************** @@ -2564,7 +2580,7 @@ * **************************************/ - KEY keys[MAX_LEVELS]; + temporary_key keys[MAX_LEVELS]; btr* buckets[MAX_LEVELS]; win_for_array windows[MAX_LEVELS]; ULONG split_pages[MAX_LEVELS]; @@ -2715,10 +2731,10 @@ IndexNode previousNode; // pointer holds the "main" pointer for inserting new nodes. - ISR isr; + index_sort_record* isr; win_for_array split_window; - KEY split_key, temp_key; - key* key; + temporary_key split_key, temp_key; + temporary_key* key; dynKey* jumpKey = (*jumpKeys)[0]; jumpNodeList* leafJumpNodes = (*jumpNodes)[0]; bool duplicate = false; @@ -2746,7 +2762,7 @@ if (!record) break; - isr = (ISR) (record + key_length); + isr = (index_sort_record*) (record + key_length); count++; // restore previous values @@ -3361,7 +3377,7 @@ } -static UCHAR *find_node_start_point(BTR bucket, KEY * key, UCHAR * value, +static UCHAR *find_node_start_point(BTR bucket, temporary_key* key, UCHAR * value, USHORT * return_value, bool descending, bool retrieval, bool pointer_by_marker, SLONG find_record_number) @@ -3601,7 +3617,7 @@ } -static UCHAR* find_area_start_point(BTR bucket, const KEY* key, UCHAR * value, +static UCHAR* find_area_start_point(BTR bucket, const temporary_key* key, UCHAR * value, USHORT * return_prefix, bool descending, bool retrieval, SLONG find_record_number) { @@ -3638,7 +3654,7 @@ // Retrieve jump information. pointer = BTreeNode::getPointerFirstNode(bucket, &jumpInfo); USHORT n = jumpInfo.jumpers; - KEY jumpKey; + temporary_key jumpKey; // Set begin of page as default. prevJumpNode.offset = jumpInfo.firstNodeOffset; @@ -3806,7 +3822,7 @@ } -static SLONG find_page(BTR bucket, const KEY* key, UCHAR idx_flags, SLONG find_record_number, +static SLONG find_page(BTR bucket, const temporary_key* key, UCHAR idx_flags, SLONG find_record_number, bool retrieval) { /************************************** @@ -4295,7 +4311,7 @@ bool useJumpInfo = (flags & btr_jump_info); bool leafPage = (gc_page->btr_level == 0); UCHAR* leftPointer; - KEY lastKey; + temporary_key lastKey; leftPointer = BTreeNode::getPointerFirstNode(left_page); lastKey.key_length = 0; @@ -4706,7 +4722,7 @@ *jumpersSize = 0; UCHAR* pointer = (UCHAR*)page + jumpInfo.firstNodeOffset; - key jumpKey, currentKey; + temporary_key jumpKey, currentKey; UCHAR* jumpData = jumpKey.key_data;// FB_NEW(*tdbb->tdbb_default) UCHAR[jumpInfo.keyLength]; USHORT jumpLength = 0; UCHAR* currentData = currentKey.key_data;//FB_NEW(*tdbb->tdbb_default) UCHAR[jumpInfo.keyLength]; @@ -4835,8 +4851,8 @@ static SLONG insert_node(TDBB tdbb, WIN * window, - IIB * insertion, - KEY * new_key, + index_insertion* insertion, + temporary_key* new_key, SLONG * new_record_number, SLONG * original_page, SLONG * sibling_page) @@ -4862,7 +4878,7 @@ // find the insertion point for the specified key BTR bucket = (BTR) window->win_buffer; const SCHAR flags = bucket->btr_header.pag_flags; - KEY* key = insertion->iib_key; + temporary_key* key = insertion->iib_key; bool unique = (insertion->iib_descriptor->idx_flags & idx_unique); bool leafPage = (bucket->btr_level == 0); @@ -5529,7 +5545,7 @@ #endif /* DEBUG_INDEXKEY */ -static CONTENTS remove_node(TDBB tdbb, IIB * insertion, WIN * window) +static CONTENTS remove_node(TDBB tdbb, index_insertion* insertion, WIN * window) { /************************************** * @@ -5546,7 +5562,7 @@ SET_TDBB(tdbb); DBB dbb = tdbb->tdbb_database; - IDX* idx = insertion->iib_descriptor; + index_desc* idx = insertion->iib_descriptor; BTR page = (BTR) window->win_buffer; // if we are on a leaf page, remove the leaf node @@ -5607,7 +5623,7 @@ } -static CONTENTS remove_leaf_node(TDBB tdbb, IIB * insertion, WIN * window) +static CONTENTS remove_leaf_node(TDBB tdbb, index_insertion* insertion, WIN * window) { /************************************** * @@ -5621,7 +5637,7 @@ **************************************/ SET_TDBB(tdbb); BTR page = (BTR) window->win_buffer; - KEY *key = insertion->iib_key; + temporary_key*key = insertion->iib_key; // Look for the first node with the value to be removed. UCHAR *pointer; @@ -5754,7 +5770,7 @@ static bool scan(TDBB tdbb, UCHAR *pointer, SBM *bitmap, USHORT to_segment, - USHORT prefix, KEY *key, USHORT flag, SCHAR page_flags) + USHORT prefix, temporary_key*key, USHORT flag, SCHAR page_flags) { /************************************** * Index: btr.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/btr.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- btr.h 20 Jan 2005 19:20:13 -0000 1.1.1.1 +++ btr.h 28 Feb 2005 00:43:18 -0000 1.2 @@ -47,7 +47,7 @@ /* Index descriptor block -- used to hold info from index root page */ -typedef struct idx { +struct index_desc { SLONG idx_root; /* Index root */ float idx_selectivity; /* selectivity of index */ USHORT idx_id; @@ -62,95 +62,100 @@ jrd_nod* idx_expression; /* node tree for indexed expresssion */ struct dsc idx_expression_desc; /* descriptor for expression result */ Request *idx_expression_request; /* stored request for expression evaluation */ + // This structure should exactly match IRTD structure for current ODS struct idx_repeat { USHORT idx_field; /* field id */ USHORT idx_itype; /* data of field in index */ float idx_selectivity; /* segment selectivity */ - } idx_rpt[16]; -} IDX; + } idx_rpt[MAX_INDEX_SEGMENTS]; +}; + +struct IndexDescAlloc : public pool_alloc_rpt<index_desc> { + index_desc items[1]; +}; /* index types and flags */ /* See jrd/intl.h for notes on idx_itype and dsc_sub_type considerations */ /* idx_numeric .. idx_byte_array values are compatible with VMS values */ -#define idx_numeric 0 -#define idx_string 1 -#define idx_timestamp1 2 -#define idx_byte_array 3 -#define idx_metadata 4 -#define idx_sql_date 5 -#define idx_sql_time 6 -#define idx_timestamp2 7 -#define idx_numeric2 8 /* Introduced for 64-bit Integer support */ - -/* Historical alias for pre v6 applications */ -#define idx_date idx_timestamp1 +const int idx_numeric = 0; +const int idx_string = 1; +const int idx_timestamp1 = 2; +const int idx_byte_array = 3; +const int idx_metadata = 4; +const int idx_sql_date = 5; +const int idx_sql_time = 6; +const int idx_timestamp2 = 7; +const int idx_numeric2 = 8; /* Introduced for 64-bit Integer support */ /* idx_itype space for future expansion */ -#define idx_first_intl_string 64 /* .. MAX (short) Range of computed key strings */ +const int idx_first_intl_string = 64; /* .. MAX (short) Range of computed key strings */ -#define idx_offset_intl_range (0x7FFF + idx_first_intl_string) +const int idx_offset_intl_range = (0x7FFF + idx_first_intl_string); /* these flags must match the irt_flags */ -#define idx_unique 1 -#define idx_descending 2 -#define idx_in_progress 4 -#define idx_foreign 8 -#define idx_primary 16 -#define idx_expressn 32 +const int idx_unique = 1; +const int idx_descending = 2; +const int idx_in_progress = 4; +const int idx_foreign = 8; +const int idx_primary = 16; +const int idx_expressn = 32; /* these flags are for idx_runtime_flags */ -#define idx_plan_dont_use 1 /* index is not mentioned in user-specified access plan */ -#define idx_plan_navigate 2 /* plan specifies index to be used for ordering */ -#define idx_used 4 /* index was in fact selected for retrieval */ -#define idx_navigate 8 /* index was in fact selected for navigation */ -#define idx_plan_missing 16 /* index mentioned in missing clause */ -#define idx_plan_starts 32 /* index mentioned in starts clause */ -#define idx_used_with_and 64 /* marker used in procedure sort_indices */ -#define idx_marker 128 /* marker used in procedure sort_indices */ +const int idx_plan_dont_use = 1; /* index is not mentioned in user-specified access plan */ +const int idx_plan_navigate = 2; /* plan specifies index to be used for ordering */ +const int idx_used = 4; /* index was in fact selected for retrieval */ +const int idx_navigate = 8; /* index was in fact selected for navigation */ +const int idx_plan_missing = 16; /* index mentioned in missing clause */ +const int idx_plan_starts = 32; /* index mentioned in starts clause */ +const int idx_used_with_and = 64; /* marker used in procedure sort_indices */ +const int idx_marker = 128; /* marker used in procedure sort_indices */ /* Macro to locate the next IDX block */ -#define NEXT_IDX(buffer,count) (IDX*) (buffer + count) +#define NEXT_IDX(buffer,count) (index_desc*) (buffer + count) /* Index insertion block -- parameter block for index insertions */ -typedef struct iib { +struct index_insertion { SLONG iib_number; /* record number (or lower level page) */ SLONG iib_sibling; /* right sibling page */ - idx* iib_descriptor; /* index descriptor */ + index_desc* iib_descriptor; /* index descriptor */ Relation *iib_relation; /* relation block */ - struct key *iib_key; /* varying string for insertion */ + struct temporary_key* iib_key; /* varying string for insertion */ struct sbm *iib_duplicates; /* spare bit map of duplicates */ class Transaction *iib_transaction; /* insertion transaction */ -} IIB; +}; /* Temporary key block */ -typedef struct key { +struct temporary_key { USHORT key_length; UCHAR key_data[MAX_KEY]; + UCHAR key_flags; /* AB: I don't see the use of multiplying with 2 anymore. */ //UCHAR key_data[MAX_KEY * 2]; // This needs to be on a SHORT boundary. // This is because key_data is complemented as // (SSHORT *) if value is negative. // See compress() (JRD/btr.c) for more details -} KEY; +}; /* Index Sort Record -- fix part of sort record for index fast load */ -typedef struct isr { +struct index_sort_record { + // RecordNumber should be at the first place, because it's used + // for determing sort by creating index (see idx.cpp) + ULONG isr_record_number; USHORT isr_key_length; USHORT isr_flags; - ULONG isr_record_number; -} *ISR; +}; #define ISR_secondary 1 // Record is secondary version #define ISR_null 2 // Record consists of NULL values only @@ -159,19 +164,18 @@ /* Index retrieval block -- hold stuff for index retrieval */ -class irb : public pool_alloc_rpt<jrd_nod*, type_irb> +class IndexRetrieval : public pool_alloc_rpt<jrd_nod*, type_irb> { public: - IDX irb_desc; /* Index descriptor */ + index_desc irb_desc; /* Index descriptor */ USHORT irb_index; /* Index id */ USHORT irb_generic; /* Flags for generic search */ Relation *irb_relation; /* Relation for retrieval */ USHORT irb_lower_count; /* Number of segments for retrieval */ USHORT irb_upper_count; /* Number of segments for retrieval */ - KEY *irb_key; /* key for equality retrival */ + temporary_key* irb_key; /* key for equality retrival */ jrd_nod* irb_value[1]; }; -typedef irb *IRB; #define irb_partial 1 /* Partial match: not all segments or starting of key only */ #define irb_starting 2 /* Only compute "starting with" key for index segment */ Index: btr_proto.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/btr_proto.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- btr_proto.h 20 Jan 2005 19:26:23 -0000 1.1.1.1 +++ btr_proto.h 28 Feb 2005 00:43:18 -0000 1.2 @@ -30,24 +30,24 @@ class Transaction; -USHORT BTR_all(TDBB, jrd_rel*, idx**, idx**, str**, SLONG*); -void BTR_create(TDBB, jrd_rel*, Transaction*, idx*, USHORT, scb*, SelectivityList&); +USHORT BTR_all(TDBB, jrd_rel*, index_desc**, index_desc**, str**, SLONG*); +void BTR_create(TDBB, jrd_rel*, Transaction*, index_desc*, USHORT, sort_context*, SelectivityList&); void BTR_delete_index(TDBB, win*, USHORT); //USHORT BTR_delete_node(TDBB, btr*, USHORT); -bool BTR_description(DBB dbb, JRD_REL, irt*, idx*, SSHORT); -void BTR_evaluate(tdbb*, irb*, sbm**); -UCHAR* BTR_find_leaf(btr*, key*, UCHAR*, USHORT*, int, bool); -btr* BTR_find_page(tdbb*, irb*, win*, idx*, key*, key*, bool); -void BTR_insert(tdbb*, win*, iib*); -enum idx_e BTR_key(tdbb*, jrd_rel*, rec*, idx*, key*, idx_null_state*); -USHORT BTR_key_length(TDBB tdbb, jrd_rel*, idx*); +bool BTR_description(DBB dbb, JRD_REL, irt*, index_desc*, SSHORT); +void BTR_evaluate(tdbb*, IndexRetrieval*, sbm**); +UCHAR* BTR_find_leaf(btr*, temporary_key*, UCHAR*, USHORT*, int, bool); +btr* BTR_find_page(tdbb*, IndexRetrieval*, win*, index_desc*, temporary_key*, temporary_key*, bool); +void BTR_insert(tdbb*, win*, index_insertion*); +enum idx_e BTR_key(tdbb*, jrd_rel*, rec*, index_desc*, temporary_key*, idx_null_state*); +USHORT BTR_key_length(TDBB tdbb, jrd_rel*, index_desc*); UCHAR* BTR_last_node(btr*, jrd_exp*, struct btx**); btr* BTR_left_handoff(tdbb*, win*, btr*, SSHORT); -USHORT BTR_lookup(TDBB, jrd_rel*, USHORT, idx*); -void BTR_make_key(tdbb*, USHORT, jrd_nod**, idx*, key*, USHORT); -bool BTR_next_index(TDBB, jrd_rel*, Transaction*, idx*, win*); -void BTR_remove(tdbb*, win*, iib*); -void BTR_reserve_slot(TDBB, jrd_rel*, Transaction*, idx*); +USHORT BTR_lookup(TDBB, jrd_rel*, USHORT, index_desc*); +void BTR_make_key(tdbb*, USHORT, jrd_nod**, index_desc*, temporary_key*, USHORT); +bool BTR_next_index(TDBB, jrd_rel*, Transaction*, index_desc*, win*); +void BTR_remove(tdbb*, win*, index_insertion*); +void BTR_reserve_slot(TDBB, jrd_rel*, Transaction*, index_desc*); void BTR_selectivity(TDBB, jrd_rel*, USHORT, SelectivityList&); #endif // JRD_BTR_PROTO_H Index: constants.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/constants.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- constants.h 20 Jan 2005 19:19:28 -0000 1.1.1.1 +++ constants.h 28 Feb 2005 00:43:18 -0000 1.2 @@ -49,19 +49,26 @@ - /* Column Limits */ -#define MAX_COLUMN_SIZE 32767 /* Bytes */ +const ULONG MAX_COLUMN_SIZE = 32767; /* Bytes */ /* Misc constant values */ -#define USERNAME_LENGTH 31 /* Bytes */ +const int USERNAME_LENGTH = 31; /* Bytes */ static const int MAX_SQL_IDENTIFIER_SIZE = 32; static const int MAX_SQL_IDENTIFIER_LEN = 31; typedef TEXT SqlIdentifier[MAX_SQL_IDENTIFIER_SIZE]; +static const char* NULL_ROLE = "NONE"; + +static const char* PRIMARY_KEY = "PRIMARY KEY"; +static const char* FOREIGN_KEY = "FOREIGN KEY"; +static const char* UNIQUE_CNSTRT = "UNIQUE"; +static const char* CHECK_CNSTRT = "CHECK"; +static const char* NOT_NULL_CNSTRT = "NOT NULL"; + /* literal strings in rdb$ref_constraints to be used to identify the cascade actions for referential constraints. Used by isql/show and isql/extract for now. */ @@ -75,6 +82,9 @@ static const char* IMPLICIT_DOMAIN_PREFIX = "RDB$"; static const int IMPLICIT_DOMAIN_PREFIX_LEN = 4; +static const char* SQL_SECCLASS_PREFIX = "SQL$"; +static const int SQL_SECCLASS_PREFIX_LEN = 4; + /******************************************/ /* System flag meaning - mainly Firebird. */ @@ -93,18 +103,23 @@ /* UDF Arguments are numbered from 0 to MAX_UDF_ARGUMENTS -- argument 0 is reserved for the return-type of the UDF */ -#define MAX_UDF_ARGUMENTS 10 +const int MAX_UDF_ARGUMENTS = 10; // Maximum length of single line returned from pretty printer -#define PRETTY_BUFFER_SIZE 1024 +const int PRETTY_BUFFER_SIZE = 1024; -#define MAX_INDEX_SEGMENTS 16 +const int MAX_INDEX_SEGMENTS = 16; // Maximum index key length // AB: If the maximum key-size will change, don't forget dyn.h and dba.epp // which cannot use these defines. -#define MAX_KEY 4096 // Maximum page size possible divide by 4 (16384 / 4) -#define MAX_KEY_PRE_ODS11 255 // Max key-size before ODS11 +const int MAX_KEY = 4096; // Maximum page size possible divide by 4 (16384 / 4) +const int MAX_KEY_PRE_ODS11 = 255; // Max key-size before ODS11 + +const char SQL_MATCH_1_CHAR = '_'; /* Not translatable */ +const char SQL_MATCH_ANY_CHARS = '%'; /* Not translatable */ + +const int MAX_CONTEXT_VARS = 1000; // Maximum number of context variables allowed for a single object #endif /* JRD_CONSTANTS_H */ Index: dfw.epp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/dfw.epp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- dfw.epp 20 Jan 2005 19:19:46 -0000 1.1.1.1 +++ dfw.epp 28 Feb 2005 00:43:18 -0000 1.2 @@ -1488,7 +1488,7 @@ Request *request; JRD_REL relation, partner_relation; - IDX idx; + index_desc idx; int key_count; SSHORT text_type; SSHORT collate; Index: dyn.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/dyn.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- dyn.h 20 Jan 2005 19:20:16 -0000 1.1.1.1 +++ dyn.h 28 Feb 2005 00:43:18 -0000 1.2 @@ -32,11 +32,6 @@ #define STUFF_COUNT 4 #define TEXT_BLOB_LENGTH 512 -const char* const PRIMARY_KEY = "PRIMARY KEY"; -const char* const FOREIGN_KEY = "FOREIGN KEY"; -const char* const UNIQUE_CNSTRT = "UNIQUE"; -const char* const CHECK_CNSTRT = "CHECK"; -const char* const NOT_NULL_CNSTRT = "NOT NULL"; #define GET_STRING(from,to) DYN_get_string (tdbb, (const UCHAR**)from, (TEXT*)to, sizeof (to), true) Index: evl.cpp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/evl.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- evl.cpp 20 Jan 2005 19:25:00 -0000 1.1.1.1 +++ evl.cpp 28 Feb 2005 00:43:18 -0000 1.2 @@ -378,7 +378,7 @@ inv* impure = (INV) IMPURE (tdbb->tdbb_request, node->nod_impure); BTR_evaluate(tdbb, reinterpret_cast < - irb * >(node->nod_arg[e_idx_retrieval]), + IndexRetrieval* >(node->nod_arg[e_idx_retrieval]), &impure->inv_bitmap); return &impure->inv_bitmap; } @@ -1684,7 +1684,7 @@ iasb* asb_impure = (IASB) IMPURE (request, asb->nod_impure); UCHAR* data; SORT_put(tdbb, - reinterpret_cast<scb*>(asb_impure->iasb_sort_handle), + reinterpret_cast<sort_context*>(asb_impure->iasb_sort_handle), reinterpret_cast<ULONG**>(&data)); MOVE_CLEAR(data, ROUNDUP_LONG(asb->asb_key_desc->skd_length)); asb->asb_desc.dsc_address = data; @@ -3219,7 +3219,7 @@ /* Sort the values already "put" to sort */ if (!SORT_sort(tdbb, - reinterpret_cast<SCB>(asb_impure->iasb_sort_handle))) + reinterpret_cast<sort_context*>(asb_impure->iasb_sort_handle))) { ERR_punt(); } @@ -3230,7 +3230,7 @@ { UCHAR* data; SORT_get(tdbb, - reinterpret_cast < SCB > (asb_impure->iasb_sort_handle), + reinterpret_cast < sort_context* > (asb_impure->iasb_sort_handle), reinterpret_cast < ULONG ** >(&data) #ifdef SCROLLABLE_CURSORS , RSE_get_forward @@ -3240,7 +3240,7 @@ if (data == NULL) { /* we are done, close the sort */ - SORT_fini(reinterpret_cast < SCB > (asb_impure->iasb_sort_handle), + SORT_fini(reinterpret_cast < sort_context* > (asb_impure->iasb_sort_handle), tdbb->tdbb_attachment); asb_impure->iasb_sort_handle = NULL; break; @@ -3768,7 +3768,7 @@ iasb* asb_impure = (iasb*) IMPURE (request, agSortBlk->nod_impure); const skd* sort_key = agSortBlk->asb_key_desc; - scb* handle = + sort_context* handle = SORT_init(tdbb, ROUNDUP_LONG(sort_key->skd_length), 1, sort_key, reject_duplicate, 0, Index: exe.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/exe.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- exe.h 20 Jan 2005 19:20:17 -0000 1.1.1.1 +++ exe.h 28 Feb 2005 00:43:18 -0000 1.2 @@ -565,7 +565,7 @@ Procedure* csb_procedure; Relation* csb_view; /* parent view */ - struct idx* csb_idx; /* Packed description of indices */ + struct index_desc* csb_idx; /* Packed description of indices */ struct str* csb_idx_allocation; /* Memory allocated to hold index descriptions */ jrd_nod* csb_message; /* Msg for send/receive */ struct fmt* csb_format; /* Default fmt for stream */ Index: idx.cpp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/idx.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- idx.cpp 20 Jan 2005 19:29:51 -0000 1.1.1.1 +++ idx.cpp 28 Feb 2005 00:43:18 -0000 1.2 @@ -80,14 +80,14 @@ USHORT ifl_key_length; } *IFL; -static IDX_E check_duplicates(TDBB, REC, IDX *, IIB *, JRD_REL); -static IDX_E check_foreign_key(TDBB, REC, JRD_REL, JRD_TRA, IDX *, JRD_REL *, USHORT *); -static IDX_E check_partner_index(TDBB, JRD_REL, REC, JRD_TRA, IDX *, JRD_REL, SSHORT); +static IDX_E check_duplicates(TDBB, REC, index_desc *, index_insertion*, JRD_REL); +static IDX_E check_foreign_key(TDBB, REC, JRD_REL, JRD_TRA, index_desc *, JRD_REL *, USHORT *); +static IDX_E check_partner_index(TDBB, JRD_REL, REC, JRD_TRA, index_desc *, JRD_REL, SSHORT); static bool duplicate_key(const UCHAR*, const UCHAR*, void*); static SLONG get_root_page(TDBB, JRD_REL); static int index_block_flush(void *ast_object); -static IDX_E insert_key(TDBB, JRD_REL, REC, JRD_TRA, WIN *, IIB *, JRD_REL *, USHORT *); -static bool key_equal(const KEY*, const KEY*); +static IDX_E insert_key(TDBB, JRD_REL, REC, JRD_TRA, WIN *, index_insertion*, JRD_REL *, USHORT *); +static bool key_equal(const temporary_key*, const temporary_key*); static void signal_index_deletion(TDBB, JRD_REL, USHORT); @@ -109,7 +109,7 @@ **************************************/ SET_TDBB(tdbb); DBB dbb = tdbb->tdbb_database; - IDX idx; + index_desc idx; idx.idx_id = (USHORT) -1; WIN window(-1); WIN referenced_window(-1); @@ -131,14 +131,14 @@ referenced_window.win_page = get_root_page(tdbb, referenced_relation); referenced_window.win_flags = 0; irt* referenced_root = (IRT) CCH_FETCH(tdbb, &referenced_window, LCK_read, pag_root); - IDX referenced_idx; + index_desc referenced_idx; if (!BTR_description (dbb, referenced_relation, referenced_root, &referenced_idx, index_id)) BUGCHECK(173); /* msg 173 referenced index description not found */ /* post references access to each field in the index */ - const idx::idx_repeat* idx_desc = referenced_idx.idx_rpt; + const index_desc::idx_repeat* idx_desc = referenced_idx.idx_rpt; for (USHORT i = 0; i < referenced_idx.idx_count; i++, idx_desc++) { @@ -162,7 +162,7 @@ void IDX_create_index( TDBB tdbb, JRD_REL relation, - IDX* idx, + index_desc* idx, const TEXT* index_name, USHORT* index_id, JRD_TRA transaction, @@ -229,8 +229,8 @@ FPTR_REJECT_DUP_CALLBACK callback = (idx->idx_flags & idx_unique) ? duplicate_key : NULL; void* callback_arg = (idx->idx_flags & idx_unique) ? &ifl_data : NULL; - SCB sort_handle = SORT_init(tdbb, - key_length + sizeof(struct isr), + sort_context* sort_handle = SORT_init(tdbb, + key_length + sizeof(struct index_sort_record), 1, &key_desc, callback, callback_arg, tdbb->tdbb_attachment, 0); @@ -269,7 +269,7 @@ find them, too. */ BOOLEAN cancel = FALSE; - KEY key; + temporary_key key; while (!cancel && DPM_next(tdbb, &primary, LCK_read, FALSE, FALSE)) { @@ -395,7 +395,7 @@ *p++ = pad; } while (--l); } - ISR isr = (ISR) p; + index_sort_record* isr = (index_sort_record*) p; isr->isr_key_length = key.key_length; isr->isr_record_number = primary.rpb_number; isr->isr_flags = (stack ? ISR_secondary : 0) | (key_is_null ? ISR_null : 0); @@ -545,7 +545,7 @@ * a duplicate record. * **************************************/ - IDX idx; + index_desc idx; SET_TDBB(tdbb); @@ -582,9 +582,9 @@ * each. * **************************************/ - IIB insertion; - IDX idx; - KEY key1, key2; + index_insertion insertion; + index_desc idx; + temporary_key key1, key2; SET_TDBB(tdbb); DBB dbb = tdbb->tdbb_database; @@ -659,9 +659,9 @@ * -1. * **************************************/ - IDX idx; - IIB insertion; - KEY key1, key2; + index_desc idx; + index_insertion insertion; + temporary_key key1, key2; SET_TDBB(tdbb); @@ -714,8 +714,8 @@ * Check for foreign key constraint after a modify statement * **************************************/ - IDX idx; - KEY key1, key2; + index_desc idx; + temporary_key key1, key2; SET_TDBB(tdbb); @@ -810,9 +810,9 @@ * -1. * **************************************/ - IDX idx; - IIB insertion; - KEY key; + index_desc idx; + index_insertion insertion; + temporary_key key; SET_TDBB(tdbb); @@ -852,8 +852,8 @@ static IDX_E check_duplicates( TDBB tdbb, REC record, - IDX * record_idx, - IIB * insertion, JRD_REL relation_2) + index_desc * record_idx, + index_insertion* insertion, JRD_REL relation_2) { /************************************** * @@ -872,7 +872,7 @@ SET_TDBB(tdbb); IDX_E result = idx_e_ok; - IDX* insertion_idx = insertion->iib_descriptor; + index_desc* insertion_idx = insertion->iib_descriptor; rpb.rpb_number = -1; rpb.rpb_relation = insertion->iib_relation; @@ -959,7 +959,7 @@ REC record, JRD_REL relation, JRD_TRA transaction, - IDX * idx, + index_desc * idx, JRD_REL * bad_relation, USHORT * bad_index) { /************************************** @@ -1033,7 +1033,7 @@ JRD_REL relation, REC record, JRD_TRA transaction, - IDX * idx, + index_desc * idx, JRD_REL partner_relation, SSHORT index_id) { /************************************** @@ -1048,10 +1048,10 @@ * record appears in the partner index. * **************************************/ - IDX partner_idx; - IIB insertion; - KEY key; - struct irb retrieval; + index_desc partner_idx; + index_insertion insertion; + temporary_key key; + struct IndexRetrieval retrieval; SET_TDBB(tdbb); DBB dbb = tdbb->tdbb_database; @@ -1080,7 +1080,7 @@ generating a bitmap of duplicate records */ sbm* bitmap = NULL; - MOVE_CLEAR(&retrieval, sizeof(struct irb)); + MOVE_CLEAR(&retrieval, sizeof(struct IndexRetrieval)); //retrieval.blk_type = type_irb; retrieval.irb_index = partner_idx.idx_id; MOVE_FAST(&partner_idx, &retrieval.irb_desc, @@ -1137,8 +1137,8 @@ * **************************************/ ifl* ifl_data = static_cast<ifl*>(ifl_void); - const isr* rec1 = (ISR) (record1 + ifl_data->ifl_key_length); - const isr* rec2 = (ISR) (record2 + ifl_data->ifl_key_length); + const index_sort_record* rec1 = (index_sort_record*) (record1 + ifl_data->ifl_key_length); + const index_sort_record* rec2 = (index_sort_record*) (record2 + ifl_data->ifl_key_length); if (!(rec1->isr_flags & (ISR_secondary | ISR_null)) && !(rec2->isr_flags & (ISR_secondary | ISR_null))) @@ -1231,7 +1231,7 @@ REC record, JRD_TRA transaction, WIN * window_ptr, - IIB * insertion, + index_insertion* insertion, JRD_REL * bad_relation, USHORT * bad_index) { @@ -1251,7 +1251,7 @@ SET_TDBB(tdbb); IDX_E result = idx_e_ok; - IDX* idx = insertion->iib_descriptor; + index_desc* idx = insertion->iib_descriptor; /* Insert the key into the index. If the index is unique, BTR will keep track of duplicates. */ @@ -1276,7 +1276,7 @@ idx->idx_flags |= idx_unique; CCH_FETCH(tdbb, window_ptr, LCK_read, pag_root); - KEY key; + temporary_key key; idx_null_state null_state; result = BTR_key(tdbb, relation, record, idx, &key, &null_state); CCH_RELEASE(tdbb, window_ptr); @@ -1292,7 +1292,7 @@ } -static bool key_equal(const KEY* key1, const KEY* key2) +static bool key_equal(const temporary_key* key1, const temporary_key* key2) { /************************************** * Index: idx_proto.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/idx_proto.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- idx_proto.h 20 Jan 2005 19:19:19 -0000 1.1.1.1 +++ idx_proto.h 28 Feb 2005 00:43:18 -0000 1.2 @@ -31,7 +31,7 @@ void IDX_check_access(TDBB, class Csb *, Relation *, Relation *, Field *); -void IDX_create_index(TDBB, Relation*, struct idx*, const TEXT*, +void IDX_create_index(TDBB, Relation*, struct index_desc*, const TEXT*, USHORT*, Transaction*, SelectivityList&); struct idb* IDX_create_index_block(TDBB, Relation *, USHORT); void IDX_delete_index(TDBB, Relation *, USHORT); Index: ini.epp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/ini.epp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- ini.epp 20 Jan 2005 19:31:30 -0000 1.1.1.1 +++ ini.epp 28 Feb 2005 00:43:18 -0000 1.2 @@ -900,8 +900,8 @@ JRD_REL relation; TEXT string[32]; const ini_idx_t::ini_idx_segment_t* segment; - IDX idx; - idx::idx_repeat* tail; + index_desc idx; + index_desc::idx_repeat* tail; USHORT position; JRD_FLD field; Index: met.epp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/met.epp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- met.epp 20 Jan 2005 19:24:33 -0000 1.1.1.1 +++ met.epp 28 Feb 2005 00:43:18 -0000 1.2 @@ -1633,7 +1633,7 @@ int MET_lookup_partner( - TDBB tdbb, Relation* relation, IDX* idx, const TEXT* index_name) + TDBB tdbb, Relation* relation, index_desc* idx, const TEXT* index_name) { /************************************** * Index: met_proto.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/met_proto.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- met_proto.h 20 Jan 2005 19:31:55 -0000 1.1.1.1 +++ met_proto.h 28 Feb 2005 00:43:19 -0000 1.2 @@ -42,7 +42,7 @@ class Triggers; struct dsc; -struct idx; +struct index_desc; void MET_activate_shadow(tdbb* tdbb); ULONG MET_align(const dsc*, USHORT); @@ -71,7 +71,7 @@ void MET_lookup_generator_id(tdbb* tdbb, SLONG, TEXT *); void MET_lookup_index(tdbb* tdbb, TEXT*, const TEXT*, USHORT); SLONG MET_lookup_index_name(tdbb* tdbb, const TEXT*, SLONG*, SSHORT*); -int MET_lookup_partner(tdbb* tdbb, Relation*, idx*, const TEXT*); +int MET_lookup_partner(tdbb* tdbb, Relation*, index_desc*, const TEXT*); Procedure* MET_lookup_procedure(tdbb* tdbb, const TEXT*); //Procedure* MET_lookup_procedure_id(tdbb* tdbb, SSHORT, BOOLEAN, BOOLEAN, USHORT); Relation* MET_lookup_relation(tdbb* tdbb, const char*); Index: nav.cpp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/nav.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- nav.cpp 20 Jan 2005 19:25:46 -0000 1.1.1.1 +++ nav.cpp 28 Feb 2005 00:43:19 -0000 1.2 @@ -57,18 +57,18 @@ #define MOVE_BYTE(x_from, x_to) *x_to++ = *x_from++; -static SSHORT compare_keys(IDX *, UCHAR *, USHORT, KEY *, USHORT); +static SSHORT compare_keys(index_desc*, UCHAR *, USHORT, temporary_key *, USHORT); #ifdef SCROLLABLE_CURSORS static void expand_index(WIN *); #endif #ifdef PC_ENGINE static BOOLEAN find_dbkey(TDBB tdbb, RSB, ULONG); -static BOOLEAN find_record(TDBB tdbb, RSB, RSE_GET_MODE, KEY *, USHORT, USHORT); +static BOOLEAN find_record(TDBB tdbb, RSB, RSE_GET_MODE, temporary_key *, USHORT, USHORT); #endif static BTX find_current(EXP, BTR, UCHAR *); static bool find_saved_node(TDBB tdbb, RSB, IRSB_NAV, WIN *, UCHAR **); static UCHAR* get_position(TDBB, RSB, IRSB_NAV, WIN *, RSE_GET_MODE, BTX *); -static BOOLEAN get_record(TDBB tdbb, RSB, IRSB_NAV, RPB *, KEY *, BOOLEAN); +static BOOLEAN get_record(TDBB tdbb, RSB, IRSB_NAV, RPB *, temporary_key *, BOOLEAN); static void init_fetch(IRSB_NAV); static UCHAR* nav_open(TDBB, RSB, IRSB_NAV, WIN *, RSE_GET_MODE, BTX *); static void set_position(IRSB_NAV, RPB *, WIN *, UCHAR *, BTX, UCHAR *, USHORT); @@ -168,8 +168,8 @@ **************************************/ JRD_REQ request; IRSB_NAV impure; - IDX *idx; - KEY key_value; + index_desc* idx; + temporary_key key_value; WIN window; BTN expanded_node; BOOLEAN backwards; @@ -198,7 +198,7 @@ SBM_reset(&impure->irsb_nav_records_visited); idx = - (IDX *) ((SCHAR *) impure + (SLONG) rsb->rsb_arg[RSB_NAV_idx_offset]); + (index_desc* ) ((SCHAR *) impure + (SLONG) rsb->rsb_arg[RSB_NAV_idx_offset]); if ((idx == NULL) || (find_key->nod_count == 0) || (find_key->nod_count > idx->idx_count)) @@ -465,7 +465,7 @@ #endif init_fetch(impure); - IDX *idx = (IDX*) ((SCHAR*) impure + (long) rsb->rsb_arg[RSB_NAV_idx_offset]); + index_desc* idx = (index_desc*) ((SCHAR*) impure + (long) rsb->rsb_arg[RSB_NAV_idx_offset]); // The bitmap is only valid when we are continuing on in one // direction. It is of no help when we change direction, @@ -488,16 +488,16 @@ // find the last fetched position from the index WIN window(impure->irsb_nav_page); - KEY key; + temporary_key key; BTX expanded_next = NULL; UCHAR *nextPointer = get_position(tdbb, rsb, impure, &window, direction, &expanded_next); MOVE_FAST(impure->irsb_nav_data, key.key_data, impure->irsb_nav_length); JRD_NOD retrieval_node = (JRD_NOD) rsb->rsb_arg[RSB_NAV_index]; - IRB retrieval = (IRB) retrieval_node->nod_arg[e_idx_retrieval]; + IndexRetrieval* retrieval = (IndexRetrieval*) retrieval_node->nod_arg[e_idx_retrieval]; // set the upper (or lower) limit for navigational retrieval - KEY upper, lower; + temporary_key upper, lower; if ((direction == RSE_get_forward) && retrieval->irb_upper_count) { upper.key_length = impure->irsb_nav_upper_length; #ifdef SCROLLABLE_CURSORS @@ -776,9 +776,9 @@ * **************************************/ JRD_REQ request; - KEY key_value; + temporary_key key_value; IRSB_NAV impure; - IDX *idx; + index_desc* idx; WIN window; BTN expanded_node; ULONG record_number; @@ -796,7 +796,7 @@ // resetting the stream invalidates the visited records SBM_reset(&impure->irsb_nav_records_visited); - IDX *idx = (IDX*) ((SCHAR*) impure + (SLONG) rsb->rsb_arg[RSB_NAV_idx_offset]); + index_desc* idx = (index_desc*) ((SCHAR*) impure + (SLONG) rsb->rsb_arg[RSB_NAV_idx_offset]); // save the record number, in case the passed new_rpb is // the same as the one on the rpb, in which case it will @@ -868,9 +868,9 @@ static SSHORT compare_keys( - IDX * idx, + index_desc* idx, UCHAR * key_string1, - USHORT length1, KEY * key2, USHORT flags) + USHORT length1, temporary_key * key2, USHORT flags) { /************************************** * @@ -888,7 +888,7 @@ **************************************/ UCHAR *string1, *string2, *segment; USHORT length2, l, remainder; - idx::idx_repeat * tail; + index_desc::idx_repeat* tail; string1 = key_string1; string2 = key2->key_data; @@ -992,7 +992,7 @@ expanded_page->exp_incarnation = CCH_GET_INCARNATION(window); // go through the nodes on the original page and expand them - KEY key; + temporary_key key; BTX expanded_node = (BTX) expanded_page->exp_nodes; bool priorPointer = false; UCHAR *pointer = BTreeNode::getPointerFirstNode(page); @@ -1067,7 +1067,7 @@ WIN window; BTN node; BTX expanded_node = NULL; - KEY key; + temporary_key key; request = tdbb->tdbb_request; impure = (IRSB_NAV) IMPURE (request, rsb->rsb_impure); @@ -1135,7 +1135,7 @@ static BOOLEAN find_record(TDBB tdbb, RSB rsb, RSE_GET_MODE mode, - KEY * find_key, + temporary_key * find_key, USHORT find_count, USHORT search_flags) { /************************************** @@ -1156,14 +1156,14 @@ IRSB_NAV impure; RPB *rpb; JRD_NOD retrieval_node; - IRB retrieval; - IDX *idx; + IndexRetrieval* retrieval; + index_desc* idx; BTR page; WIN window; BTN node; EXP expanded_page; BTX expanded_node; - KEY lower, upper, *tmp, value; + temporary_key lower, upper, *tmp, value; USHORT upper_count, lower_count; BOOLEAN result = FALSE, position_set = FALSE; UCHAR *p, *q; @@ -1175,7 +1175,7 @@ window.win_flags = 0; retrieval_node = (JRD_NOD) rsb->rsb_arg[RSB_NAV_index]; - retrieval = (IRB) retrieval_node->nod_arg[e_idx_retrieval]; + retrieval = (IndexRetrieval*) retrieval_node->nod_arg[e_idx_retrieval]; // save the current equality retrieval key tmp = retrieval->irb_key; @@ -1187,7 +1187,7 @@ retrieval->irb_upper_count = retrieval->irb_lower_count = find_count; idx = - (IDX *) ((SCHAR *) impure + (SLONG) rsb->rsb_arg[RSB_NAV_idx_offset]); + (index_desc* ) ((SCHAR *) impure + (SLONG) rsb->rsb_arg[RSB_NAV_idx_offset]); page = BTR_find_page(tdbb, retrieval, &window, idx, &lower, &upper, false); @@ -1359,13 +1359,13 @@ * **************************************/ - IDX *idx = (IDX*) ((SCHAR*) impure + (long) rsb->rsb_arg[RSB_NAV_idx_offset]); + index_desc* idx = (index_desc*) ((SCHAR*) impure + (long) rsb->rsb_arg[RSB_NAV_idx_offset]); BTR page = (BTR) CCH_FETCH(tdbb, window, LCK_read, pag_index); // the outer loop goes through all the sibling pages // looking for the node (in case the page has split); // the inner loop goes through the nodes on each page - KEY key; + temporary_key key; SCHAR flags = page->btr_header.pag_flags; UCHAR *pointer; UCHAR *endPointer; @@ -1561,7 +1561,7 @@ static BOOLEAN get_record(TDBB tdbb, RSB rsb, IRSB_NAV impure, - RPB * rpb, KEY * key, BOOLEAN inhibit_cleanup) + RPB * rpb, temporary_key * key, BOOLEAN inhibit_cleanup) { /************************************** * @@ -1576,9 +1576,9 @@ **************************************/ JRD_REQ request = tdbb->tdbb_request; - IDX *idx = (IDX*) ((SCHAR*) impure + (long) rsb->rsb_arg[RSB_NAV_idx_offset]); + index_desc* idx = (index_desc*) ((SCHAR*) impure + (long) rsb->rsb_arg[RSB_NAV_idx_offset]); - KEY value; + temporary_key value; USHORT old_att_flags; BOOLEAN result; @@ -1606,7 +1606,7 @@ if (result) { BTR_key(tdbb, rpb->rpb_relation, rpb->rpb_record, - reinterpret_cast<struct idx *>((SCHAR*) impure + + reinterpret_cast<struct index_desc*>((SCHAR*) impure + (long) rsb->rsb_arg[RSB_NAV_idx_offset]), &value, 0); @@ -1684,8 +1684,8 @@ * Open a stream to walk an index. * **************************************/ - IRB retrieval; - KEY lower, upper, *limit_ptr; + IndexRetrieval* retrieval; + temporary_key lower, upper, *limit_ptr; //EXP expanded_page; JRD_NOD retrieval_node; @@ -1705,8 +1705,8 @@ // Find the starting leaf page retrieval_node = (JRD_NOD) rsb->rsb_arg[RSB_NAV_index]; - retrieval = (IRB) retrieval_node->nod_arg[e_idx_retrieval]; - IDX *idx = (IDX *) ((SCHAR *) impure + (long) rsb->rsb_arg[RSB_NAV_idx_offset]); + retrieval = (IndexRetrieval*) retrieval_node->nod_arg[e_idx_retrieval]; + index_desc* idx = (index_desc* ) ((SCHAR *) impure + (long) rsb->rsb_arg[RSB_NAV_idx_offset]); BTR page = BTR_find_page(tdbb, retrieval, window, idx, &lower, &upper, (direction == RSE_get_backward)); impure->irsb_nav_page = window->win_page; Index: opt.cpp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/jrd/opt.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- opt.cpp 20 Jan 2005 19:30:15 -0000 1.1.1.1 +++ opt.cpp 28 Feb 2005 00:43:19 -0000 1.2 @@ -88,12 +88,12 @@ #endif static bool augment_stack(JRD_NOD, LLS *); -static UINT64 calculate_priority_level(TDBB tdbb, OPT, IDX *); +static UINT64 calculate_priority_level(TDBB tdbb, OPT, index_desc*); static void check_indices(TDBB tdbb, csb_repeat *); static bool check_relationship(OPT, USHORT, USHORT); static void check_sorts(RSE); static void class_mask(USHORT, JRD_NOD *, ULONG *); -static void clear_bounds(OPT, IDX *); +static void clear_bounds(OPT, index_desc*); static JRD_NOD compose(TDBB tdbb, JRD_NOD *, JRD_NOD, NOD_T); static bool computable(CSB, JRD_NOD, SSHORT, bool); static void compute_dependencies(JRD_NOD, ULONG *); @@ -121,11 +121,11 @@ static RSB gen_boolean(TDBB, OPT, RSB, JRD_NOD); static RSB gen_first(TDBB, OPT, RSB, JRD_NOD); static void gen_join(TDBB, OPT, UCHAR *, LLS *, JRD_NOD *, JRD_NOD *, JRD_NOD); -static RSB gen_navigation(TDBB, OPT, USHORT, JRD_REL, STR, IDX *, JRD_NOD *); +static RSB gen_navigation(TDBB, OPT, USHORT, JRD_REL, STR, index_desc*, JRD_NOD *); #ifdef SCROLLABLE_CURSORS -static RSB gen_nav_rsb(TDBB, OPT, USHORT, JRD_REL, STR, IDX *, RSE_GET_MODE); +static RSB gen_nav_rsb(TDBB, OPT, USHORT, JRD_REL, STR, index_desc*, RSE_GET_MODE); #else -static RSB gen_nav_rsb(TDBB, OPT, USHORT, JRD_REL, STR, IDX *); +static RSB gen_nav_rsb(TDBB, OPT, USHORT, JRD_REL, STR, index_desc*); #endif static RSB gen_outer(TDBB, OPT, RSE, LLS, JRD_NOD *, JRD_NOD *); static RSB gen_procedure(TDBB, OPT, JRD_NOD); @@ -142,15 +142,15 @@ static STR make_alias(TDBB, CSB, csb_repeat *); static JRD_NOD make_binary_node(TDBB tdbb, NOD_T, JRD_NOD, JRD_NOD, bool); static RSB make_cross(TDBB, OPT, LLS); -static JRD_NOD make_index_node(TDBB, JRD_REL, CSB, IDX *); +static JRD_NOD make_index_node(TDBB, JRD_REL, CSB, index_desc*); static JRD_NOD make_inference_node(TDBB tdbb, CSB, JRD_NOD, JRD_NOD, JRD_NOD); static JRD_NOD make_inversion(TDBB, OPT, JRD_NOD, USHORT); -static JRD_NOD make_missing(TDBB, OPT, JRD_REL, JRD_NOD, USHORT, IDX *); -static JRD_NOD make_starts(TDBB, OPT, JRD_REL, JRD_NOD, USHORT, IDX *); +static JRD_NOD make_missing(TDBB, OPT, JRD_REL, JRD_NOD, USHORT, index_desc*); +static JRD_NOD make_starts(TDBB, OPT, JRD_REL, JRD_NOD, USHORT, index_desc*); static bool map_equal(JRD_NOD, JRD_NOD, JRD_NOD); static void mark_indices(csb_repeat *, SSHORT); -static SSHORT match_index(TDBB, OPT, SSHORT, JRD_NOD, IDX *); -static bool match_indices(TDBB, OPT, SSHORT, JRD_NOD, IDX *); +static SSHORT match_index(TDBB, OPT, SSHORT, JRD_NOD, index_desc*); +static bool match_indices(TDBB, OPT, SSHORT, JRD_NOD, index_desc*); static USHORT nav_rsb_size(RSB, USHORT, USHORT); static bool node_equality(JRD_NOD, JRD_NOD); static JRD_NOD optimize_like(TDBB, JRD_NOD); @@ -167,7 +167,7 @@ static void set_position(JRD_NOD, JRD_NOD, JRD_NOD); static void set_rse_inactive(CSB, RSE); static void sort_indices_by_selectivity(TDBB tdbb, csb_repeat *); -static SSHORT sort_indices_by_priority(TDBB tdbb, csb_repeat *, IDX **, UINT64 *); +static SSHORT sort_indices_by_priority(TDBB tdbb, csb_repeat *, index_desc**, UINT64 *); /* macro definitions */ @@ -299,7 +299,7 @@ **************************************/ DBB dbb; OPT opt_; - IDX *idx; + index_desc* idx; RIV river; JRD_NOD node, *ptr, *end, sort, project, aggregate; LLS conjunct_stack, rivers_stack, *stack_end; @@ -330,7 +330,7 @@ enough to hold this crud. */ -/* Do not allocate the IDX struct. Let BTR_all do the job. The allocated +/* Do not allocate the index_desc struct. Let BTR_all do the job. The allocated memory will then be in csb->csb_rpt[stream].csb_idx_allocation, which gets cleaned up before this function exits. */ @@ -839,7 +839,7 @@ } -JRD_NOD OPT_make_index(TDBB tdbb, OPT opt_, JRD_REL relation, IDX * idx) +JRD_NOD OPT_make_index(TDBB tdbb, OPT opt_, JRD_REL relation, index_desc* idx) { /************************************** * @@ -851,7 +851,7 @@ * Build node for index scan. * **************************************/ - IRB retrieval; + IndexRetrieval* retrieval; JRD_NOD node, *lower, *upper, *end_node; Opt::opt_segment *tail, *end; @@ -863,7 +863,7 @@ /* Allocate both a index retrieval node and block. */ node = make_index_node(tdbb, relation, opt_->opt_csb, idx); - retrieval = (IRB) node->nod_arg[e_idx_retrieval]; + retrieval = (IndexRetrieval*) node->nod_arg[e_idx_retrieval]; retrieval->irb_relation = relation; /* Pick up lower bound segment values */ @@ -932,7 +932,7 @@ } -int OPT_match_index(TDBB tdbb, OPT opt, USHORT stream, IDX * idx) +int OPT_match_index(TDBB tdbb, OPT opt, USHORT stream, index_desc* idx) { /************************************** * @@ -978,7 +978,7 @@ void OPT_set_index(TDBB tdbb, - JRD_REQ request, RSB * rsb_ptr, JRD_REL relation, IDX * idx) + JRD_REQ request, RSB * rsb_ptr, JRD_REL relation, index_desc* idx) { /************************************** * @@ -998,7 +998,7 @@ OPT opt; JRD_NOD inversion = NULL; JRD_NOD index_node, new_index_node; - IRB retrieval; + IndexRetrieval* retrieval; IDL index; VEC vector; DBB dbb; @@ -1095,7 +1095,7 @@ if (old_rsb->rsb_type == rsb_navigate) { - retrieval = (IRB) index_node->nod_arg[e_idx_retrieval]; + retrieval = (IndexRetrieval*) index_node->nod_arg[e_idx_retrieval]; index_id = retrieval->irb_index; if ( (index = CMP_get_index_lock(tdbb, relation, index_id)) ) @@ -1171,7 +1171,7 @@ } -static UINT64 calculate_priority_level(TDBB tdbb, OPT opt, IDX * idx) +static UINT64 calculate_priority_level(TDBB tdbb, OPT opt, index_desc* idx) { /************************************** * @@ -1244,7 +1244,7 @@ TEXT index_name[32]; JRD_NOD plan, access_type; JRD_REL relation; - IDX *idx; + index_desc* idx; USHO... [truncated message content] |