8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-25 01:23:03 +01:00
firebird-mirror/src/jrd/rse.h
2001-12-24 02:51:06 +00:00

383 lines
13 KiB
C++

/*
* PROGRAM: JRD Access Method
* MODULE: rse.h
* DESCRIPTION: Record source block definitions
*
* The contents of this file are subject to the Interbase Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy
* of the License at http://www.Inprise.com/IPL.html
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code was created by Inprise Corporation
* and its predecessors. Portions created by Inprise Corporation are
* Copyright (C) Inprise Corporation.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*/
#ifndef _JRD_RSE_H_
#define _JRD_RSE_H_
#include "../jrd/jrd_blks.h"
#include "../include/fb_blk.h"
#include <vector>
#include "../jrd/dsc.h"
/* Record Source Block (RSB) types */
typedef ENUM rsb_t { rsb_boolean, rsb_cross, rsb_dbkey, rsb_first, rsb_indexed, rsb_merge, rsb_multiple, rsb_project, rsb_sequential, rsb_sort, rsb_union, rsb_aggregate, rsb_ext_sequential, /* External sequential access */
rsb_ext_indexed, /* External indexed access */
rsb_ext_dbkey, /* External dbkey access */
rsb_navigate, /* Walk navigational index */
rsb_bit_sieve, rsb_left_cross, /* Left outer join */
rsb_procedure, /* Stored procedure */
rsb_select, /* (Gateway only) */
rsb_sql_join, /* (Gateway only) */
rsb_simulate, /* (Gateway only) */
rsb_sim_cross, /* (Gateway only) */
rsb_once /* (Gateway only) */ } RSB_T;
/* Record Source Block */
class Rsb : public pool_alloc_rpt<class Rsb*, type_rsb>
{
public:
RSB_T rsb_type; /* type of rsb */
UCHAR rsb_stream; /* stream, if appropriate */
USHORT rsb_count; /* number of sub arguments */
USHORT rsb_flags;
ULONG rsb_impure; /* offset to impure area */
ULONG rsb_cardinality; /* estimated cardinality of stream */
ULONG rsb_record_count; /* count of records returned from rsb (not candidate records processed) */
struct Rsb *rsb_next; /* next rsb, if appropriate */
struct rel *rsb_relation; /* relation, if appropriate */
struct str *rsb_alias; /* SQL alias for relation */
struct prc *rsb_procedure; /* procedure, if appropriate */
struct fmt *rsb_format; /* format, if appropriate */
struct nod *rsb_any_boolean; /* any/all boolean */
Rsb* rsb_arg[1];
};
typedef Rsb *RSB;
/* bits for the rsb_flags field */
#define rsb_singular 1 /* singleton select, expect 0 or 1 records */
#define rsb_stream_type 2 /* rsb is for stream type request */
#define rsb_descending 4 /* an ascending index is being used for a descending sort or vice versa */
#define rsb_project 8 /* projection on this stream is requested */
/* Special argument positions within the RSB */
#define RSB_PRC_inputs 0
#define RSB_PRC_in_msg 1
#define RSB_PRC_count 2
#define RSB_NAV_index 0
#define RSB_NAV_inversion 1
#define RSB_NAV_key_length 2
#define RSB_NAV_idx_offset 3
#define RSB_NAV_count 4
#define RSB_LEFT_outer 0
#define RSB_LEFT_inner 1
#define RSB_LEFT_boolean 2
#define RSB_LEFT_streams 3
#define RSB_LEFT_rsbs 4
#define RSB_LEFT_inner_boolean 5
#define RSB_LEFT_inner_streams 6
#define RSB_LEFT_count 7
/* Merge (equivalence) file block */
typedef struct mfb {
struct sfb *mfb_sfb; /* merge file uses SORT I/O routines */
ULONG mfb_equal_records; /* equality group cardinality */
ULONG mfb_record_size; /* matches sort map length */
ULONG mfb_current_block; /* current merge block in buffer */
ULONG mfb_block_size; /* merge block I/O size */
ULONG mfb_blocking_factor; /* merge equality records per block */
UCHAR *mfb_block_data; /* merge block I/O buffer */
} *MFB;
#define MERGE_BLOCK_SIZE 65536
/* RSB impure area formats for the various rsb types */
typedef struct irsb {
ULONG irsb_flags;
USHORT irsb_count;
} *IRSB;
typedef struct irsb_first_n {
ULONG irsb_flags;
SLONG irsb_number;
} *IRSB_FIRST;
typedef struct irsb_index {
ULONG irsb_flags;
SLONG irsb_number;
SLONG irsb_prefetch_number;
struct sbm **irsb_bitmap;
} *IRSB_INDEX;
typedef struct irsb_sort {
ULONG irsb_flags;
struct scb *irsb_sort_handle;
} *IRSB_SORT;
typedef struct irsb_procedure {
ULONG irsb_flags;
struct req *irsb_req_handle;
struct str *irsb_message;
} *IRSB_PROCEDURE;
typedef struct irsb_mrg {
ULONG irsb_flags;
USHORT irsb_mrg_count; /* Next stream in group */
struct irsb_mrg_repeat {
SLONG irsb_mrg_equal; /* queue of equal records */
SLONG irsb_mrg_equal_end; /* end of the equal queue */
SLONG irsb_mrg_equal_current; /* Last fetched record from equal queue */
SLONG irsb_mrg_last_fetched; /* First sort merge record of next group */
SSHORT irsb_mrg_order; /* logical merge order by substream */
struct mfb irsb_mrg_file; /* merge equivalence file */
} irsb_mrg_rpt[1];
} *IRSB_MRG;
typedef struct irsb_sim {
ULONG irsb_flags;
USHORT irsb_sim_rid; /* Next relation id */
USHORT irsb_sim_fid; /* Next field id */
struct req *irsb_sim_req1; /* Request handle */
struct req *irsb_sim_req2; /* Request handle */
} *IRSB_SIM;
#define irsb_sim_alias 32 /* Duplicate relation but w/o user name */
#define irsb_sim_eos 64 /* Encountered end of stream */
#define irsb_sim_active 128 /* Remote simulated stream request is active */
/* impure area format for navigational rsb type,
which holds information used to get back to
the current location within an index */
typedef struct irsb_nav {
ULONG irsb_flags;
SLONG irsb_nav_expanded_offset; /* Page offset of current index node on expanded index page */
SLONG irsb_nav_number; /* last record number */
SLONG irsb_nav_page; /* index page number */
SLONG irsb_nav_incarnation; /* buffer/page incarnation counter */
ULONG irsb_nav_count; /* record count of last record returned */
struct sbm **irsb_nav_bitmap; /* Bitmap for inversion tree */
struct sbm *irsb_nav_records_visited; /* Bitmap of records already retrieved */
USHORT irsb_nav_offset; /* Page offset of current index node */
USHORT irsb_nav_lower_length; /* Length of lower key value */
USHORT irsb_nav_upper_length; /* Length of upper key value */
USHORT irsb_nav_length; /* Length of expanded key */
UCHAR irsb_nav_data[1]; /* Expanded key, upper bound, and index desc */
} *IRSB_NAV;
/* flags for the irsb_flags field */
#define irsb_first 1
#define irsb_joined 2 /* Set in left join when current record has been joined to something */
#define irsb_mustread 4 /* Set in left join when must read a record from left stream */
#define irsb_open 8 /* Indicated rsb is open */
#define irsb_backwards 16 /* Backwards navigation has been performed on this stream */
#define irsb_in_opened 32 /* Set in outer join when inner stream has been opened */
#define irsb_join_full 64 /* Set in full join when left join has completed */
#define irsb_checking_singular 128 /* fetching to verify singleton select */
#define irsb_singular_processed 256 /* singleton stream already delivered one record */
#define irsb_last_backwards 512 /* rsb was last scrolled in the backward direction */
#define irsb_bof 1024 /* rsb is at beginning of stream */
#define irsb_eof 2048 /* rsb is at end of stream */
#define irsb_crack 4096 /* the record at our current position is missing */
#define irsb_forced_crack 8192 /* the above-mentioned crack was forced by user */
#define irsb_refresh 16384 /* enter records into refresh range */
#define irsb_key_changed 32768 /* key has changed since record last returned from rsb */
/* Sort map block */
struct smb_repeat {
DSC smb_desc; /* Relative descriptor */
USHORT smb_flag_offset; /* Offset of missing flag */
USHORT smb_stream; /* Stream for field id */
SSHORT smb_field_id; /* Id for field (-1 if dbkey) */
struct nod *smb_node; /* Expression node */
};
class smb : public pool_alloc_rpt<smb_repeat, type_smb>
{
public:
USHORT smb_keys; /* Number of keys */
USHORT smb_count; /* Total number of fields */
USHORT smb_length; /* Sort record length */
USHORT smb_key_length; /* Key length in longwords */
struct skd *smb_key_desc; /* Address of key descriptors */
USHORT smb_flags; /* Misc sort flags */
smb_repeat smb_rpt[1];
};
typedef smb *SMB;
/* values for smb_field_id */
#define SMB_DBKEY -1 /* dbkey value */
#define SMB_TRANS_ID -2 /* transaction id of record */
/* bits for the smb_flags field */
#define SMB_project 1 /* Sort is really a project */
#define SMB_tag 2 /* Beast is a tag sort */
/* Blocks used to compute optimal join order:
Indexed relationships block (IRL) holds
information about potential join orders */
class irl : public pool_alloc<type_irl>
{
public:
struct irl *irl_next; /* Next irl block for stream */
USHORT irl_stream; /* Stream reachable by relation */
USHORT irl_unique; /* Is this stream reachable by unique index? */
};
typedef irl *IRL;
/* Types of simulated joins (Gateway only) */
#define SJN_by_fld 4
#define SJN_by_rel 3
#define SJN_by_rel_prv 2
#define SJN_none 0
/* Simulated relationships block holds information about potential joins (Gateway only) */
class srl : public pool_alloc<type_srl>
{
public:
struct srl *srl_next; /* Next srl block for stream */
USHORT srl_stream; /* Stream reachable by join */
USHORT srl_type; /* Simulated join type */
};
typedef srl *SRL;
/* the maximum number of opt items is the maximum
number of streams, conjuncts, or indices which
can be used in an rse, since this is the space
available in the opt block */
#define MAX_OPT_ITEMS 256
#define MAX_STREAMS MAX_OPT_ITEMS
#define MAX_CONJUNCTS MAX_OPT_ITEMS
#define MAX_INDICES MAX_OPT_ITEMS
#define OPT_BITS (MAX_OPT_ITEMS/32)
/* General optimizer block */
class Opt : public pool_alloc<type_opt>
{
public:
class Csb *opt_csb; /* Compiler scratch block */
SLONG opt_combinations; /* Number of partial orders considered */
double opt_best_cost; /* Cost of best join order */
SSHORT opt_count; /* Number of conjuncts */
SSHORT opt_parent_count; /* Number of conjuncts in parent rse */
USHORT opt_best_count; /* Longest length of indexable streams */
USHORT opt_g_flags; /* global flags */
struct opt_repeat {
struct nod *opt_conjunct; /* Conjunction */
#ifndef GATEWAY
struct nod *opt_lower; /* Lower bound on index value */
struct nod *opt_upper; /* Upper bound on index value */
struct nod *opt_match; /* Conjunct which matches index segment */
IRL opt_relationships; /* Streams directly reachable by index */
#else
SRL opt_relationships; /* Streams directly reachable by index */
#endif
ULONG opt_dependencies[MAX_OPT_ITEMS / 32];
/* Stream dependencies to compute conjunct */
double opt_best_stream_cost; /* best cost of retrieving first n streams */
USHORT opt_best_stream; /* stream in best join order seen so far */
USHORT opt_flags;
USHORT opt_stream; /* Stream in position of join order */
};
struct opt_repeat opt_rpt[MAX_OPT_ITEMS];
};
typedef Opt *OPT;
/* stream-dependent bits used in opt_flags */
#define opt_used 1
#define opt_stream_used 2
#define opt_matched 4 /* conjunct matches an index segment */
/* global optimizer bits used in opt_g_flags */
#define opt_g_stream 1 /* indicate that this is a blr_stream */
/* River block -- used to hold temporary information about a group of streams */
class riv : public pool_alloc_rpt<SCHAR, type_riv>
{
public:
struct Rsb *riv_rsb; /* Record source block for river */
USHORT riv_number; /* Temporary number for river */
UCHAR riv_count; /* Count of streams */
UCHAR riv_streams[1]; /* Actual streams */
};
typedef riv *RIV;
/* bookmark block, used to hold information about the current position
within an index; a pointer to this block is passed to the user as a
handle to facilitate returning to this position */
class bkm : public pool_alloc_rpt<SCHAR, type_bkm>
{
public:
struct bkm *bkm_next;
struct dsc bkm_desc; /* bookmark descriptor describing the bookmark handle */
ULONG bkm_handle; /* bookmark handle containing pointer to this block */
SLONG bkm_number; /* current record number */
SLONG bkm_page; /* current btree page */
SLONG bkm_incarnation; /* last known incarnation number of current btree page */
SLONG bkm_expanded_offset; /* offset into expanded index page (if it exists) */
USHORT bkm_offset; /* offset into current btree page */
USHORT bkm_flags; /* flag values indicated below */
struct dsc bkm_key_desc; /* descriptor containing current key value */
UCHAR bkm_key_data[1]; /* current key value */
};
typedef bkm *BKM;
#define bkm_bof 1
#define bkm_eof 2
#define bkm_crack 4
#define bkm_forced_crack 8
/* types for navigating through a stream */
typedef enum rse_get_mode {
RSE_get_forward,
RSE_get_backward,
RSE_get_current,
RSE_get_first,
RSE_get_last,
RSE_get_next
} RSE_GET_MODE;
#endif /* _JRD_RSE_H_ */