mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-23 18:43:03 +01:00
543 lines
14 KiB
C
543 lines
14 KiB
C
/*
|
|
* PROGRAM: JRD Command Oriented Query Language
|
|
* MODULE: dtr.h
|
|
* DESCRIPTION: General definitions, etc.
|
|
*
|
|
* 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 QLI_DTR_H
|
|
#define QLI_DTR_H
|
|
|
|
#include "../jrd/common.h"
|
|
#include "../jrd/dsc.h"
|
|
|
|
const USHORT QLI_MSG_FAC = 1;
|
|
|
|
#define IBERROR(number) ERRQ_error (number, NULL, NULL, NULL, NULL, NULL)
|
|
|
|
#define ALLOCD(type) ALLQ_alloc (QLI_default_pool, type, 0)
|
|
#define ALLOCDV(type, repeat) ALLQ_alloc (QLI_default_pool, type, repeat)
|
|
#define ALLOCP(type) ALLQ_alloc (QLI_permanent_pool, type, 0)
|
|
#define ALLOCPV(type, repeat) ALLQ_alloc (QLI_permanent_pool, type, repeat)
|
|
|
|
#define BLKDEF(type, root, tail) type,
|
|
enum blk_t
|
|
{
|
|
type_MIN = 0,
|
|
#include "../qli/blk.h"
|
|
type_MAX
|
|
};
|
|
#undef BLKDEF
|
|
|
|
// Block types
|
|
|
|
#ifndef INCLUDE_FB_BLK
|
|
#include "../include/old_fb_blk.h"
|
|
#endif
|
|
|
|
typedef enum nod_t {
|
|
|
|
// Commands, not executed.
|
|
|
|
nod_ready = 1,
|
|
nod_finish,
|
|
nod_commit,
|
|
nod_rollback,
|
|
nod_prepare,
|
|
nod_start_trans,
|
|
nod_show,
|
|
nod_exit,
|
|
nod_quit,
|
|
nod_create,
|
|
nod_define,
|
|
nod_delete_proc,
|
|
nod_rename_proc,
|
|
nod_edit_proc,
|
|
nod_copy_proc,
|
|
nod_edit_form,
|
|
nod_del_form,
|
|
nod_extract,
|
|
nod_edit,
|
|
nod_set,
|
|
nod_help,
|
|
nod_shell,
|
|
nod_def_database,
|
|
nod_del_database,
|
|
nod_def_relation,
|
|
nod_mod_relation,
|
|
nod_del_relation,
|
|
nod_def_field,
|
|
nod_mod_field,
|
|
nod_del_field,
|
|
nod_def_index,
|
|
nod_del_index,
|
|
nod_mod_index,
|
|
|
|
// SQL statements, mapped into GDML statements
|
|
|
|
nod_select,
|
|
nod_insert,
|
|
nod_delete,
|
|
nod_fetch,
|
|
nod_close,
|
|
nod_open,
|
|
|
|
nod_for,
|
|
nod_restructure,
|
|
nod_print,
|
|
nod_list_fields,
|
|
nod_list,
|
|
nod_store,
|
|
nod_modify,
|
|
nod_erase,
|
|
nod_assign,
|
|
nod_report,
|
|
nod_report_loop,
|
|
nod_repeat,
|
|
nod_if,
|
|
nod_output,
|
|
nod_declare,
|
|
nod_variable,
|
|
nod_abort,
|
|
nod_label,
|
|
nod_leave,
|
|
nod_sync,
|
|
nod_commit_retaining,
|
|
|
|
nod_relation,
|
|
nod_name,
|
|
nod_rse,
|
|
nod_union,
|
|
nod_aggregate,
|
|
|
|
nod_print_item,
|
|
nod_star, // Bunch of items
|
|
nod_column,
|
|
nod_tab,
|
|
nod_skip,
|
|
nod_space,
|
|
nod_new_page,
|
|
nod_report_header,
|
|
nod_column_header,
|
|
|
|
nod_eql,
|
|
nod_neq,
|
|
nod_gtr,
|
|
nod_geq,
|
|
nod_leq,
|
|
nod_lss,
|
|
nod_between,
|
|
nod_containing,
|
|
nod_matches,
|
|
nod_like,
|
|
nod_starts,
|
|
nod_missing,
|
|
nod_and,
|
|
nod_or,
|
|
nod_any,
|
|
nod_not,
|
|
nod_unique,
|
|
|
|
nod_reference,
|
|
nod_field,
|
|
nod_prompt,
|
|
nod_prompt2,
|
|
nod_edit_blob,
|
|
nod_parameter,
|
|
nod_constant,
|
|
nod_position,
|
|
nod_map,
|
|
|
|
nod_add,
|
|
nod_subtract,
|
|
nod_multiply,
|
|
nod_divide,
|
|
nod_negate,
|
|
nod_concatenate,
|
|
nod_substr,
|
|
nod_null,
|
|
nod_user_name,
|
|
nod_format,
|
|
nod_choice,
|
|
nod_function,
|
|
|
|
nod_average,
|
|
nod_max,
|
|
nod_min,
|
|
nod_total,
|
|
nod_count,
|
|
|
|
nod_agg_average,
|
|
nod_agg_max,
|
|
nod_agg_min,
|
|
nod_agg_total,
|
|
nod_agg_count,
|
|
|
|
nod_rpt_average,
|
|
nod_rpt_max,
|
|
nod_rpt_min,
|
|
nod_rpt_total,
|
|
nod_rpt_count,
|
|
|
|
nod_running_count,
|
|
nod_running_total,
|
|
nod_from,
|
|
nod_via,
|
|
|
|
nod_upcase, // New blr for v3
|
|
nod_lowcase,
|
|
nod_sleuth,
|
|
nod_index,
|
|
|
|
nod_join_inner,
|
|
nod_join_left,
|
|
nod_join_right,
|
|
nod_join_full,
|
|
|
|
nod_sql_create, // SQL metadata
|
|
nod_sql_database,
|
|
nod_sql_dr_index,
|
|
nod_sql_al_table,
|
|
nod_sql_cr_table,
|
|
nod_sql_dr_table,
|
|
nod_sql_cr_view,
|
|
nod_sql_dr_view,
|
|
nod_sql_grant,
|
|
nod_sql_revoke
|
|
|
|
} NOD_T;
|
|
|
|
struct qli_vec {
|
|
blk vec_header;
|
|
ULONG vec_count;
|
|
blk* vec_object[1];
|
|
};
|
|
|
|
struct qli_vcl {
|
|
blk vcl_header;
|
|
ULONG vcl_count;
|
|
SLONG vcl_long[1];
|
|
};
|
|
|
|
// Constant block
|
|
|
|
struct qli_const {
|
|
blk con_header;
|
|
dsc con_desc;
|
|
UCHAR con_data[1];
|
|
};
|
|
|
|
// Symbol types
|
|
|
|
typedef enum sym_t {
|
|
SYM_keyword,
|
|
SYM_context,
|
|
SYM_database,
|
|
SYM_relation,
|
|
SYM_field,
|
|
SYM_stream,
|
|
SYM_cursor,
|
|
SYM_form,
|
|
SYM_function
|
|
} SYM_T;
|
|
|
|
struct qli_symbol {
|
|
blk sym_header;
|
|
const TEXT* sym_string; // address of asciz string
|
|
USHORT sym_length; // length of string (exc. term.)
|
|
SYM_T sym_type; // symbol type
|
|
USHORT sym_keyword; // keyword number, if keyword
|
|
blk* sym_object; // general pointer to object
|
|
qli_symbol* sym_collision; // collision pointer
|
|
qli_symbol* sym_homonym; // homonym pointer
|
|
TEXT sym_name[2]; // space for name, if necessary
|
|
};
|
|
|
|
// Syntax nodes (moved from compile.h because of cross-references)
|
|
|
|
struct qli_syntax {
|
|
blk syn_header;
|
|
NOD_T syn_type; // Type of node
|
|
USHORT syn_flags;
|
|
USHORT syn_count; // Number of arguments
|
|
qli_syntax* syn_arg[1];
|
|
};
|
|
|
|
// Database block
|
|
|
|
typedef struct dbb {
|
|
blk dbb_header;
|
|
dbb* dbb_next; // Next database in system
|
|
struct qli_rel* dbb_relations; // Linked list of relations
|
|
struct qli_fun* dbb_functions; // Known functions in database
|
|
FB_API_HANDLE dbb_handle; // database handle
|
|
FB_API_HANDLE dbb_transaction; // transaction handle
|
|
FB_API_HANDLE dbb_proc_trans; // procedure transaction
|
|
FB_API_HANDLE dbb_meta_trans; // metadata update transaction
|
|
FB_API_HANDLE dbb_field_request; // "get fields" request handle
|
|
qli_symbol* dbb_symbol; // Database variable
|
|
qli_const* dbb_user; // user name
|
|
qli_const* dbb_password; // password
|
|
USHORT dbb_filename_length; // Length of filename
|
|
FB_API_HANDLE dbb_lookup_blob; // Request to look up blob
|
|
FB_API_HANDLE dbb_store_blob; // Request to store blob
|
|
FB_API_HANDLE dbb_edit_blob;
|
|
FB_API_HANDLE dbb_edit_store;
|
|
FB_API_HANDLE dbb_scan_blobs;
|
|
FB_API_HANDLE dbb_delete_blob;
|
|
USHORT dbb_flags;
|
|
USHORT dbb_type; /* Friend or foe? */
|
|
USHORT dbb_pagesize; // For SQL metadata
|
|
ULONG dbb_capabilities; // Special characteristics to look out for
|
|
int* dbb_statistics; // Statistics memory
|
|
FB_API_HANDLE dbb_requests [96]; // Misc meta-data requests
|
|
TEXT dbb_filename [2]; // Filename of database
|
|
} *DBB;
|
|
|
|
// Bits in dbb_flags
|
|
|
|
const USHORT DBB_procedures = 1; // Procedures relation found
|
|
const USHORT DBB_active = 2; // Database is active in request
|
|
const USHORT DBB_updates = 8; // Updates in current transaction
|
|
const USHORT DBB_prepared = 32; // User transaction has been prepared
|
|
|
|
// Bits in dbb_capabilities
|
|
|
|
const ULONG DBB_cap_extern_file = 1; // supports the concept of external files
|
|
const ULONG DBB_cap_files = 2; // uses the Interbase concept of multi-file
|
|
const ULONG DBB_cap_security = 4; // InterBase style security classes
|
|
/* const ULONG DBB_cap_triggers = 8; -- OBSOLETE: triggers (old style) */
|
|
const ULONG DBB_cap_idx_inactive = 16; // Interbase index inactive flag
|
|
const ULONG DBB_cap_multi_trans = 32; // Database supports multiple transactions
|
|
const ULONG DBB_cap_single_trans = 64; // Database supports only a single transaction
|
|
const ULONG DBB_cap_dudley = 128; // We're authorized for meta-data updates
|
|
const ULONG DBB_cap_functions = 256; // The DBMS knows about function
|
|
const ULONG DBB_cap_new_triggers = 512; // triggers (new V3 style)
|
|
const ULONG DBB_cap_shadowing = 1024; // Database supports shadowing
|
|
const ULONG DBB_cap_types = 2048; // Database has RDB$TYPES relation
|
|
const ULONG DBB_cap_dimensions = 4096; // Database supports arrays -- What a database!
|
|
const ULONG DBB_cap_external_type = 8192; // Database supports external datatypes
|
|
const ULONG DBB_cap_rfr_sys_flag = 16384; // Database hasn't forgotten about the system flag
|
|
const ULONG DBB_cap_filters = 32768; // Database supports filters
|
|
const ULONG DBB_cap_index_type = 65536; // Database has too damn much stuff
|
|
// Relation block
|
|
|
|
struct qli_rel {
|
|
blk rel_header;
|
|
qli_rel* rel_next; // Next relation in database
|
|
dbb* rel_database; // Parent database
|
|
qli_symbol* rel_symbol; // Hash symbol for relation
|
|
struct qli_fld* rel_fields; // Field block
|
|
USHORT rel_id; // Relation id
|
|
USHORT rel_flags; // Misc flags
|
|
USHORT rel_system_flag; // System flag
|
|
USHORT rel_max_field_pos; // highest used field position
|
|
};
|
|
|
|
// rel_flags
|
|
const USHORT REL_fields = 1; // Fields have been fetched
|
|
const USHORT REL_system = 2; // Relation is system relation
|
|
const USHORT REL_view = 4; // Relation is a view
|
|
|
|
// Field block
|
|
|
|
struct qli_fld {
|
|
blk fld_header;
|
|
qli_fld* fld_next; // Next field in relation
|
|
qli_rel* fld_relation; // Parent relation
|
|
qli_symbol* fld_name; // Field name
|
|
qli_symbol* fld_query_name; // Field query name
|
|
qli_symbol* fld_based; // Name of global field, if we care
|
|
const TEXT* fld_edit_string; // Edit string, if any
|
|
const TEXT* fld_query_header; // Query header, if any
|
|
USHORT fld_flags;
|
|
USHORT fld_id; // Field in in database
|
|
USHORT fld_dtype; // Data type of field
|
|
FLD_LENGTH fld_length; // Length of field
|
|
USHORT fld_segment_length; // Segment length for blobs
|
|
SSHORT fld_scale; // Scale factor of field
|
|
qli_syntax* fld_validation; // Validation expression
|
|
qli_syntax* fld_computed; // Computed by expression
|
|
qli_const* fld_missing; // Missing value defined in system relation
|
|
SSHORT fld_sub_type; // Subtype for blobs, text and EXACT_NUMERICs.
|
|
SSHORT fld_sub_type_missing; // Subtype missing flag
|
|
SSHORT fld_precision; // Precision for NUMERIC and DECIMAL.
|
|
USHORT fld_system_flag; // System flag
|
|
double fld_dummy; // Force fld_data to a nice boundary word boundary
|
|
UCHAR fld_data [1];
|
|
};
|
|
|
|
// fld_flags
|
|
const USHORT FLD_computed = 1;
|
|
const USHORT FLD_drop = 2;
|
|
const USHORT FLD_modify = 4;
|
|
const USHORT FLD_missing = 8;
|
|
const USHORT FLD_not_null = 16;
|
|
const USHORT FLD_add = 32;
|
|
const USHORT FLD_unique = 64;
|
|
const USHORT FLD_array = 128;
|
|
|
|
// Privileges for SQL metadata
|
|
|
|
const USHORT PRV_select = 1;
|
|
const USHORT PRV_insert = 2;
|
|
const USHORT PRV_delete = 4;
|
|
const USHORT PRV_update = 8;
|
|
const USHORT PRV_all = PRV_select + PRV_insert + PRV_delete + PRV_update;
|
|
const USHORT PRV_grant_option = 16;
|
|
|
|
struct qli_lls {
|
|
blk lls_header;
|
|
blk* lls_object;
|
|
qli_lls* lls_next;
|
|
};
|
|
|
|
// Random string block -- jack of all kludges
|
|
|
|
struct qli_str {
|
|
blk str_header;
|
|
USHORT str_length;
|
|
USHORT str_fluff;
|
|
TEXT str_data[2];
|
|
};
|
|
|
|
// Free block
|
|
|
|
typedef struct frb {
|
|
blk frb_header;
|
|
frb* frb_next; // Next free block in pool
|
|
} *FRB;
|
|
|
|
// Hunk blocks
|
|
|
|
typedef struct hnk {
|
|
blk hnk_header;
|
|
SCHAR *hnk_address; // start of memory hunk
|
|
int hnk_length; // length of memory hunk
|
|
hnk* hnk_next; // next memory hunk in structure
|
|
} *HNK;
|
|
|
|
// Pool block
|
|
|
|
typedef struct plb {
|
|
blk plb_header;
|
|
USHORT plb_pool_id; // pool id
|
|
frb* plb_free; // first free block
|
|
hnk* plb_hunks; // first hunk block
|
|
qli_lls* plb_lls; // avaiable linked list stack nodes
|
|
} *PLB;
|
|
|
|
// Equivalence label dsc_missing to field dsc_flags in the dsc structure
|
|
|
|
#define dsc_missing dsc_flags
|
|
|
|
// State flags for dsc_missing
|
|
|
|
const USHORT DSC_missing = 1;
|
|
const USHORT DSC_initial = 2;
|
|
|
|
// Function description
|
|
|
|
struct qli_fun {
|
|
blk fun_header;
|
|
qli_fun* fun_next; // Next function in database
|
|
dbb* fun_database;
|
|
qli_symbol* fun_symbol; // Associated symbol block
|
|
qli_symbol* fun_query_name;
|
|
dsc fun_return; // Return descriptor
|
|
USHORT fun_args; // Number of arguments
|
|
dsc fun_arg[1]; /* Data type of arguments
|
|
If you change this change blk.h too */
|
|
};
|
|
|
|
// Program wide globals
|
|
#include <setjmp.h>
|
|
|
|
#ifdef QLI_MAIN
|
|
#define EXTERN
|
|
#else
|
|
#define EXTERN extern
|
|
#endif
|
|
|
|
EXTERN DBB QLI_databases;
|
|
EXTERN PLB QLI_permanent_pool;
|
|
EXTERN PLB QLI_default_pool;
|
|
EXTERN qli_fld* QLI_variables;
|
|
EXTERN TEXT QLI_prompt_string [32];
|
|
EXTERN TEXT QLI_cont_string [32];
|
|
EXTERN TEXT QLI_default_user [32];
|
|
EXTERN TEXT QLI_default_password [32];
|
|
EXTERN TEXT QLI_charset [32];
|
|
EXTERN qli_const* QLI_matching_language;
|
|
|
|
//EXTERN USHORT QLI_eof;
|
|
EXTERN bool QLI_blr;
|
|
EXTERN bool QLI_skip_line;
|
|
EXTERN bool QLI_statistics;
|
|
EXTERN bool QLI_semi;
|
|
EXTERN bool QLI_abort;
|
|
EXTERN bool QLI_echo;
|
|
EXTERN bool QLI_trace;
|
|
EXTERN USHORT QLI_count;
|
|
#ifdef DEV_BUILD
|
|
EXTERN bool QLI_explain;
|
|
EXTERN bool QLI_hex_output;
|
|
#endif
|
|
|
|
EXTERN jmp_buf QLI_env; // Error return environment
|
|
|
|
EXTERN TEXT *QLI_error;
|
|
EXTERN bool sw_verify;
|
|
EXTERN bool sw_trace;
|
|
EXTERN USHORT sw_buffers;
|
|
EXTERN USHORT QLI_lines;
|
|
EXTERN USHORT QLI_prompt_count;
|
|
EXTERN USHORT QLI_reprompt;
|
|
EXTERN USHORT QLI_name_columns;
|
|
EXTERN USHORT QLI_columns;
|
|
EXTERN USHORT QLI_form_mode;
|
|
|
|
//EXTERN USHORT QLI_euc_justify;
|
|
//EXTERN USHORT QLI_interp;
|
|
|
|
#include "parse.h"
|
|
|
|
// from parse.h
|
|
EXTERN qli_tok* QLI_token;
|
|
EXTERN qli_line* QLI_line;
|
|
EXTERN TEXT* QLI_prompt;
|
|
|
|
#include "exe.h"
|
|
|
|
// from exe.h
|
|
EXTERN qli_req* QLI_requests; // Requests in statement
|
|
|
|
|
|
#undef EXTERN
|
|
|
|
#include "../qli/all_proto.h"
|
|
|
|
inline bool isNullBlob(const ISC_QUAD* id)
|
|
{
|
|
return !id->gds_quad_high && !id->gds_quad_low;
|
|
}
|
|
|
|
#endif // QLI_DTR_H
|
|
|