/* * PROGRAM: Language Preprocessor * MODULE: gpre.h * DESCRIPTION: Common header modules * * 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): ______________________________________. * $Id: gpre.h,v 1.17 2002-11-17 00:04:18 hippoman Exp $ * Revision 1.3 2000/11/27 09:26:13 fsg * Fixed bugs in gpre to handle PYXIS forms * and allow edit.e and fred.e to go through * gpre without errors (and correct result). * * This is a partial fix until all * PYXIS datatypes are adjusted in frm_trn.c * * removed some compiler warnings too * * Revision 1.2 2000/11/16 15:54:29 fsg * Added new switch -verbose to gpre that will dump * parsed lines to stderr * * Fixed gpre bug in handling row names in WHERE clauses * that are reserved words now (DATE etc) * (this caused gpre to dump core when parsing tan.e) * * Fixed gpre bug in handling lower case table aliases * in WHERE clauses for sql dialect 2 and 3. * (cause a core dump in a test case from C.R. Zamana) * * 2002.02.15 Sean Leyne - Code Cleanup, removed obsolete ports: * - "IMP" and "HP9000 s300" * * 2002.10.27 Sean Leyne - Code Cleanup, removed obsolete "UNIXWARE" port * 2002.10.27 Sean Leyne - Code Cleanup, removed obsolete "Ultrix" port * * 2002.10.28 Sean Leyne - Completed removal of obsolete "DGUX" port * 2002.10.28 Sean Leyne - Completed removal of obsolete "SGI" port * 2002.10.28 Sean Leyne - Completed removal of obsolete "HP700" port * * 2002.10.30 Sean Leyne - Removed support for obsolete "PC_PLATFORM" define * */ #ifndef _GPRE_GPRE_H_ #define _GPRE_GPRE_H_ #include // offsetof #include "../jrd/ib_stdio.h" #include "../jrd/common.h" #ifdef __cplusplus extern "C" { #endif #if (defined AIX || defined AIX_PPC) #define FORTRAN 1 #define FTN_BLK_DATA 1 #define COBOL 1 #endif #ifdef LINUX #define COBOL 1 #endif #ifdef hpux #ifdef HP10 #define ADA 1 #define ALSYS_ADA 1 #define COBOL 1 #endif #define FORTRAN 1 #endif #ifdef SCO_UNIX #define ADA 1 #define ALSYS_ADA 1 #endif #ifdef sun #define ADA 1 #define FORTRAN 1 #define FTN_BLK_DATA 1 #ifdef sparc #define COBOL 1 #endif #endif #ifdef VMS #define ADA 1 #define PASCAL 1 #define FORTRAN 1 #define COBOL 1 #define EITHER_CASE 1 #endif /* If the C compiler supports the ANSI const directive, we emit it before BLR string definitions */ #if (defined (SOLARIS) || defined (AIX) || defined (WIN_NT)) #define CONST_STR "const " #endif #ifndef CONST_STR #define CONST_STR "" #endif #define MAXSYMLEN 512 /* max length of symbol + terminator */ #define NAME_SIZE 32 #define SQL_DIALECT_V5 1 /* pre 6.0 dialect */ #define MAKE_ACTION(request,type) MSC_action(request,type) #define ALLOC(size) MSC_alloc (size) #define MAKE_CONTEXT(request) MSC_context (request) #define COPY(from, length, to) MSC_copy (from, length, to) #define FREE(block) MSC_free (block) #define MAKE_NODE(type, count) MSC_node (type, count) #define POP(stack) MSC_pop (stack) #define PUSH(object, stack) MSC_push (object, stack) #define REALLOC(block, size) MSC_realloc (block, size) #define MAKE_REFERENCE(link) MSC_reference (link); #define MAKE_REQUEST(type) MSC_request (type) #define MAKE_STRING(string) MSC_string (string) #define MAKE_PRIVILEGE_BLOCK() MSC_privilege_block () #define MAKE_USERNAME(string, dyn) MSC_username (string, dyn) #define IBERROR CPR_error #define RANGE_SHORT_INTEGER(X) ((X) < 32768 && (X) >= -32768) #define RANGE_POSITIVE_SHORT_INTEGER(X) ((X) < 32768 && (X) >= 0) #define SINGLE_QUOTED(typ) (typ == tok_quoted) #define DOUBLE_QUOTED(typ) (typ == tok_dblquoted) #define QUOTED(typ) (SINGLE_QUOTED(typ) || DOUBLE_QUOTED(typ)) #define DOUBLE_QUOTES_ON(str) (str[0] == '\"') #define REMOVE_DOUBLE_QUOTES(str) {int ij,ii; \ for (ii=0, ij=1; str[ij] != '\"'; ij++) \ str[ii++] = str[ij];\ str[ii] = 0; \ } #define STRIP_QUOTES(tkn) {int ij; \ for (ij=1; ijfld_sub_type)) /* Linked list stack stuff */ typedef struct lls { struct nod *lls_object; /* object on stack */ struct lls *lls_next; /* next item on stack */ } *LLS; #define LLS_LEN sizeof (struct lls) /* Maps used by union and global aggregates */ typedef struct map { struct ctx *map_context; /* Pseudo context for map */ struct mel *map_elements; /* Map elements */ USHORT map_count; /* Number of things in map */ } *MAP; typedef struct mel { struct mel *mel_next; /* Next element in map */ struct nod *mel_expr; /* Expression */ struct ref *mel_reference; struct ctx *mel_context; USHORT mel_position; /* Position in map */ } *MEL; /* General Syntax node, produced by parser */ typedef enum nod_t { nod_field = 1, nod_literal, nod_value, nod_and, nod_or, nod_not, nod_eq, nod_ne, nod_ge, nod_le, nod_gt, nod_lt, nod_containing, nod_matches, nod_any, nod_unique, nod_plus, nod_times, nod_divide, nod_minus, nod_negate, nod_msg, nod_for, nod_send, nod_receive, nod_block, nod_select, nod_boolean, nod_projection, nod_sort, nod_store, nod_modify, nod_erase, nod_if, nod_assignment, nod_rse, nod_first, nod_relation, nod_end, nod_label, nod_leave, nod_loop, nod_max, nod_min, nod_count, nod_total, nod_average, nod_list, nod_defered, nod_missing, nod_between, nod_union, nod_map, nod_starting, nod_like, nod_agg_count, nod_agg_max, nod_agg_min, nod_agg_total, nod_agg_average, nod_aggregate, nod_from, nod_null, nod_asterisk, nod_map_ref, nod_user_name, nod_upcase, nod_sleuth, nod_event_init, nod_udf, nod_array, nod_index, nod_via, nod_join_inner, nod_join_left, nod_join_right, nod_join_full, nod_join, nod_concatenate, nod_cast, nod_dom_value, nod_ansi_any, nod_gen_id, nod_set_generator, nod_merge, nod_plan_expr, nod_plan_item, nod_natural, nod_index_order, nod_ansi_all, nod_extract, nod_current_date, nod_current_time, nod_current_timestamp, nod_LASTNOD /* Leave this debugging GPRE_NOD last */ } NOD_T; typedef struct nod { enum nod_t nod_type; /* node type */ USHORT nod_count; /* number of sub-items */ struct nod *nod_arg[1]; /* argument */ } *GPRE_NOD; #define nod_arg0 nod_arg[0] #define nod_arg1 nod_arg[1] #define nod_arg2 nod_arg[2] #define NOD_LEN(cnt) (sizeof (struct nod) + (cnt - 1) * sizeof (int *)) /* Open cursor block */ typedef struct opn { struct sym *opn_cursor; /* Symbol block of cursor */ TEXT *opn_trans; /* Transaction handle */ struct ref *opn_using; /* Using variables */ } *OPN; #define OPN_LEN (sizeof (struct opn)) /* Port block */ typedef struct por { USHORT por_msg_number; /* message number within request */ USHORT por_ident; /* ident in source */ int por_length; /* length of port in bytes */ struct ref *por_references; /* linked list of field references */ struct por *por_next; /* next port in request */ USHORT por_count; /* number of items in port */ } *POR; #define POR_LEN (sizeof (struct por)) /* Procedure structure */ typedef struct prc { struct sym *prc_symbol; /* symbol for relation */ SSHORT prc_id; /* procedure id */ struct sym *prc_owner; /* owner of procedure, if any */ struct dbb *prc_database; /* parent database */ struct prc *prc_next; /* next procedure in database */ struct fld *prc_inputs; /* linked list of input parameters */ struct fld *prc_outputs; /* linked list of output parameters */ SSHORT prc_in_count; /* count of input parameters */ SSHORT prc_out_count; /* count of output parameters */ SSHORT prc_flags; /* procedure flags */ } *GPRE_PRC; #define PRC_LEN sizeof (struct prc) #define PRC_scanned 1 /* Grant/revoke block */ typedef struct prv { USHORT prv_privileges; /* holds privileges being granted or revoked */ SCHAR *prv_username; /* user having privileges granted or revoked */ USHORT prv_user_dyn; /* the dyn-verb to be used with prv_username i.e. gds__dyn_grant_user/proc/trig/view */ struct str *prv_relation; /* relation on which we're doing grant/revoke */ USHORT prv_object_dyn; /* the dyn-verb to be used with prv_relation i.e. gds__dyn_rel/proc_name */ struct lls *prv_fields; /* fields on which we're doing grant/revoke */ struct prv *prv_next; /* next grant/revoke block (with different user) */ } *PRV; #define PRV_LEN (sizeof (struct prv)) #define PRV_no_privs 0 /* no privileges being granted or revoked */ #define PRV_select 1 /* select privilege being granted or revoked */ #define PRV_insert 2 /* insert privilege being granted or revoked */ #define PRV_delete 4 /* delete privilege being granted or revoked */ #define PRV_update 8 /* update privilege being granted or revoked */ #define PRV_execute 16 /* execute privilege being granted or revoked */ #define PRV_references 32 /* reference privilege */ #define PRV_grant_option 64 /* privilege to grant privileges being granted */ #define PRV_all 128 /* all privileges being granted/revoked */ /* Ready block */ typedef struct rdy { struct req *rdy_request; /* dpb message & info */ struct rdy *rdy_next; struct dbb *rdy_database; USHORT rdy_id; /* id for unique string variable- MPEXL COB */ TEXT *rdy_filename; } *RDY; #define RDY_LEN sizeof (struct rdy) /* Field reference */ typedef struct ref { USHORT ref_ident; /* identifier */ USHORT ref_level; /* highest level of access */ USHORT ref_parameter; /* parameter in port */ USHORT ref_id; /* id of reference in union */ struct fld *ref_field; /* field in question */ struct ctx *ref_context; /* context for reference */ struct ref *ref_next; /* next reference in context */ struct por *ref_port; /* associated port */ struct ref *ref_source; /* source reference for modified field */ struct ref *ref_null; /* reference for null value */ struct ref *ref_master; /* master field for null value */ struct ref *ref_friend; /* value for variable */ struct nod *ref_expr; /* expression, if node is expression */ TEXT *ref_value; /* value string if host language value */ struct val *ref_values; /* linked list of values */ TEXT *ref_null_value; /* value string if host language value */ TEXT *ref_sdl; /* Raw slice description language for an array */ TEXT *ref_sdl_base; /* base of sdl string during generation */ int ref_sdl_length; /* sdl length for this reference */ struct slc *ref_slice; /* Slice, if field referenced is sliced */ USHORT ref_sdl_ident; /* identifier of sdl structure */ USHORT ref_offset; /* offset of field in port */ USHORT ref_flags; SSHORT ref_ttype; /* Character set type for literals */ } *REF; #define REF_union 1 /* Pseudo field for union */ #define REF_pseudo 2 /* Other pseudo field (probably for forms) */ #define REF_null 4 /* Only here cause of related null reference */ #define REF_fetch_array 8 /* Need to fetch full array */ #define REF_literal 16 /* Reference is to a constant */ #define REF_ttype 32 /* Reference contains character set spec */ #define REF_array_elem 64 /* Reference to an array element */ #define REF_sql_date 128 /* Reference is to a date constant */ #define REF_sql_time 256 /* Reference is to a time constant */ #define REF_timestamp 512 /* Reference is to a timestamp constant */ #define REF_LEN sizeof (struct ref) /* value block, used to store a set of values */ typedef struct val { struct val *val_next; /* next value in list */ TEXT *val_value; /* value */ } *VAL; #define VAL_LEN sizeof (struct val) /* Relation block, not to be confused with siblings or in-laws */ typedef struct rel { USHORT rel_id; /* relation id */ struct fld *rel_fields; /* linked list of known fields */ struct fld *rel_dbkey; /* linked list of known fields */ struct sym *rel_symbol; /* symbol for relation */ struct dbb *rel_database; /* parent database */ struct rel *rel_next; /* next relation in database */ BOOLEAN rel_meta; /* if true, created for a metadata operation */ struct rse *rel_view_rse; struct txt *rel_view_text; /* source for VIEW definition */ struct sym *rel_owner; /* owner of relation, if any */ struct cnstrt *rel_constraints; /* linked list of constraints defined during a meta operation */ TEXT *rel_ext_file; /* external file name */ USHORT rel_flags; } *GPRE_REL; #define REL_LEN sizeof (struct rel) #define REL_view_check 1 /* View created with check option */ /* Request block, corresponds to a single JRD request */ enum req_t { REQ_for, REQ_store, REQ_store2, REQ_insert, REQ_cursor, REQ_select, REQ_mass_update, REQ_any, REQ_statistical, REQ_ddl, REQ_form, REQ_create_database, REQ_menu, REQ_slice, REQ_ready, REQ_procedure, REQ_set_generator, REQ_LASTREQUEST /* Leave this debugging GPRE_REQ last */ }; typedef struct req { enum req_t req_type; /* request type */ USHORT req_ident; /* ident for request handle */ USHORT req_act_flag; /* activity flag ident, if used */ int req_length; /* blr length of request */ UCHAR *req_base; /* base of blr string during generation */ UCHAR *req_blr; /* raw blr string */ SCHAR *req_handle; /* request handle */ TEXT *req_trans; /* transaction handle */ SCHAR *req_request_level; /* request level expression */ SCHAR *req_form_handle; /* optional handle for forms */ USHORT req_level; /* access level */ USHORT req_count; /* number of ports in request */ USHORT req_internal; /* next internal context number */ USHORT req_labels; /* next available label */ USHORT req_top_label; /* fortran label for top of request */ USHORT req_btm_label; /* fortran label for request exit */ struct nod *req_node; /* request definition tree */ struct dbb *req_database; /* database */ struct act *req_actions; /* actions within request */ struct ctx *req_contexts; /* contexts within request */ struct ctx *req_update; /* update context for mass insert */ struct req *req_next; /* next request in module or metadata action */ struct ref *req_values; /* host values required */ #ifdef SCROLLABLE_CURSORS struct ref *req_avalues; /* parameters to pass to asynchronous message */ #endif struct ref *req_eof; /* eof reference for FOR */ struct ref *req_index; /* index variable */ struct ref *req_references; /* fields referenced in context */ struct ref *req_term_field; /* terminating field for forms */ struct map *req_map; /* map for aggregates, etc */ struct rse *req_rse; /* record selection expression */ struct por *req_ports; /* linked list of ports */ struct por *req_primary; /* primary input or output port */ struct por *req_sync; /* synchronization port */ struct por *req_vport; /* port to send values in */ #ifdef SCROLLABLE_CURSORS struct por *req_aport; /* port for asynchronous message */ #endif struct req *req_routine; /* other requests in routine */ blb* req_blobs; /* blobs in request */ struct form *req_form; /* form for request */ struct slc *req_slice; /* slice for request */ struct ref *req_array_references; /* array fields referenced in context */ USHORT req_scope_level; /* scope level for SQL subquery parsing */ USHORT req_in_aggregate; /* now processing value expr for aggr */ USHORT req_in_select_list; /* processing select list */ USHORT req_in_where_clause; /* processing where clause */ USHORT req_in_having_clause; /* processing having clause */ USHORT req_in_order_by_clause; /* processing order by clause */ USHORT req_in_subselect; /* processing a subselect clause */ ULONG req_flags; } *GPRE_REQ; #define REQ_exp_hand 1 #define REQ_local 2 /* defined in an included routine */ #define REQ_menu_tag 4 /* tag line menu */ #define REQ_menu_pop_up 8 /* pop-up style menu */ #define REQ_exp_form_handle 16 /* Explicit handle for form */ #define REQ_transparent 32 /* Form is transparent */ #define REQ_form_tag 64 /* Put form on tag line */ #define REQ_form_nowait 128 #define REQ_menu_for 256 /* dynamic menu */ #define REQ_menu_for_item 512 /* dynamic menu for item */ #define REQ_sql_cursor 1024 /* request is an SQL cursor */ #define REQ_extend_dpb 2048 /* we need to extend dpb at runtime */ #define REQ_sql_declare_cursor 4096 /* request is declare cursor */ #define REQ_sql_blob_open 8192 /* request is SQL open blob cursor */ #define REQ_sql_blob_create 16384 /* request is SQL create blob cursor */ #define REQ_sql_database_dyn 32768 /* request is to generate DYN to add files o database */ #ifdef SCROLLABLE_CURSORS #define REQ_scroll 65536 /* request is a scrollable cursor */ #define REQ_backwards 131072 /* request was last scrolled backwards */ #endif #define REQ_blr_version4 262144 /* request must generate blr_version4 */ #define REQ_LEN sizeof (struct req) /* act_object block for SQL database commands. */ typedef struct mdbb { struct dbb *mdbb_database; struct req *mdbb_dpb_request; struct req *mdbb_dpb_extend_request; } *MDBB; /* Reserved relation lock block */ typedef struct rrl { struct rrl *rrl_next; /* next locked relation */ UCHAR rrl_lock_level; /* lock level (SHARE, PROT, EXC */ UCHAR rrl_lock_mode; /* lock mode (READ/WRITE) */ struct rel *rrl_relation; /* relation block */ } *RRL; #define RRL_LEN sizeof (struct rrl) /* Record selection expresion syntax node */ typedef struct rse { USHORT rse_type; /* node type */ struct nod *rse_boolean; /* boolean expression, if present */ struct nod *rse_first; /* "first n" clause, if present */ struct nod *rse_reduced; /* projection clause, if present */ struct nod *rse_sort; /* sort clause, if present */ struct nod *rse_fields; /* list of fields */ struct nod *rse_into; /* list of output variables */ struct nod *rse_union; /* if union, list of sub-rses */ struct nod *rse_group_by; /* list of grouping fields */ struct nod *rse_plan; /* user-specified access plan */ struct map *rse_map; /* map for aggregates */ struct rse *rse_aggregate; /* Aggregate rse */ enum nod_t rse_join_type; /* Join type */ USHORT rse_flags; /* flags */ USHORT rse_count; /* number of relations */ struct ctx *rse_context[1]; /* context block */ } *RSE; #ifdef __cplusplus inline size_t RSE_LEN(size_t nItems) { return offsetof(rse, rse_context) + nItems * sizeof(int *); } #else /* __cplusplus */ #define RSE_LEN(nItems) (offsetof(struct rse, rse_context) + (nItems) * sizeof(int*)) #endif /* __cplusplus */ //#define RSE_LEN(cnt) (sizeof (struct rse) + (cnt - 1) * sizeof (int *)) #define RSE_singleton 1 /* Set generator block */ typedef struct sgen { TEXT *sgen_name; USHORT sgen_dialect; SLONG sgen_value; SINT64 sgen_int64value; } *SGEN; #define SGEN_LEN sizeof (struct sgen) /* Slice description block */ typedef struct slc { GPRE_REQ slc_parent_request; /* request for blob id */ FLD slc_field; /* database array field */ GPRE_NOD slc_array; /* user defined array */ REF slc_field_ref; /* array field reference */ USHORT slc_dimensions; /* dimensions */ USHORT slc_parameters; /* number of parameters */ struct slc_repeat { GPRE_NOD slc_lower; GPRE_NOD slc_upper; } slc_rpt[1]; } *SLC; #define SLC_LEN(count) (sizeof (struct slc) + sizeof (slc::slc_repeat) * (count - 1)) /* SQL WHENEVER BLOCK */ typedef struct swe { struct swe *swe_next; /* Next in chain */ USHORT swe_condition; /* Condition */ USHORT swe_length; /* Length of label */ TEXT swe_label[1]; /* Label */ } *SWE; #define SWE_error 0 #define SWE_warning 1 #define SWE_not_found 2 #define SWE_max 3 /* statistic block. Used for all statistics commands */ typedef struct sts { struct str *sts_name; /* object name */ USHORT sts_flags; /* Miscellaneous flags */ } *STS; #define STS_LEN sizeof (struct sts) #define STS_index 1 /* Object is an index */ /* STRing block - holds a null terminated string */ typedef struct str { TEXT str_string[1]; /* pretty simple, no? */ } *STR; #define STR_LEN(size) (sizeof (struct str) + size) /* Symbol block, also used for hash table */ enum sym_t { SYM_keyword, SYM_context, SYM_database, SYM_relation, SYM_field, SYM_variable, SYM_stream, SYM_cursor, SYM_delimited_cursor, SYM_index, SYM_blob, SYM_statement, SYM_dyn_cursor, SYM_form, SYM_form_map, SYM_form_field, SYM_type, SYM_udf, SYM_menu, SYM_menu_map, SYM_username, SYM_procedure, SYM_charset, SYM_collate, SYM_generator, SYM_dummy, SYM_LASTSYM /* Leave this debugging SYM last */ }; typedef struct sym { char *sym_string; /* address of asciz string */ enum sym_t sym_type; /* symbol type */ USHORT sym_keyword; /* keyword number, if keyword */ struct ctx *sym_object; /* general pointer to object */ struct sym *sym_collision; /* collision pointer */ struct sym *sym_homonym; /* homonym pointer */ SCHAR sym_name[1]; /* space for name, if necessary */ } *SYM; #define SYM_LEN sizeof (struct sym) /* Start transaction block */ typedef struct tra { struct tra *tra_next; /* next transaction */ TEXT *tra_handle; /* this handle */ USHORT tra_flags; /* transaction options */ struct tpb *tra_tpb; /* TPB's for this transaction */ int tra_db_count; /* number of db's and TPB's */ } *GPRE_TRA; #define TRA_LEN sizeof (struct tra) /* values for tra_flags */ #define TRA_ro 1 #define TRA_nw 2 #define TRA_con 4 #define TRA_rrl 8 #define TRA_inc 16 #define TRA_read_committed 32 #define TRA_autocommit 64 #define TRA_rec_version 128 #define TRA_no_auto_undo 256 #define MAX_TRA_OPTIONS 8 /* TPB block */ typedef struct tpb { struct tpb *tpb_tra_next; /* next TPB for this transaction */ struct tpb *tpb_dbb_next; /* next TPB for this database */ struct dbb *tpb_database; /* DBB of this part of the transaction */ USHORT tpb_length; /* length of actual TPB */ USHORT tpb_ident; /* unique part of name for this TPB */ UCHAR tpb_string[1]; /* actual TPB */ } *TPB; #define TPB_LEN(tpb_string) (sizeof (struct tpb) + tpb_string) /* Enumerated field type block */ typedef struct typ { SYM typ_symbol; /* Actual symbol */ FLD typ_field; /* Owner */ SSHORT typ_value; /* Value of type */ } *TYP; #define TYP_LEN sizeof (struct typ) /* Trigger block */ /* Note: This structure will need expansion later. Currently its use is to create a trigger for CHECK constraints which always abort on error */ typedef struct trg { struct str *trg_name; USHORT trg_type; /* Type of trigger */ struct str *trg_source; /* source for trigger */ struct nod *trg_boolean; /* boolean expression, for trigger */ struct str *trg_message; /* Message the trigger prints */ } *GPRE_TRG; #define TRG_LEN sizeof (struct trg) #define PRE_STORE_TRIGGER 1 #define POST_STORE_TRIGGER 2 #define PRE_MODIFY_TRIGGER 3 #define POST_MODIFY_TRIGGER 4 #define PRE_ERASE_TRIGGER 5 #define POST_ERASE_TRIGGER 6 /* Text block */ typedef struct txt { ULONG txt_position; USHORT txt_length; } *TXT; #define TXT_LEN sizeof (struct txt) /* User Defined Function */ typedef struct udf { struct dbb *udf_database; SYM udf_symbol; /* Function name or query name */ USHORT udf_args; /* Number of arguments */ USHORT udf_flags; /* UDF flags */ USHORT udf_dtype; /* Return data type */ SSHORT udf_scale; /* Return scale */ USHORT udf_length; /* Return length */ USHORT udf_sub_type; /* Return sub-type */ USHORT udf_charset_id; /* Return character set */ USHORT udf_ttype; /* Return text type */ USHORT udf_type; /* Function type */ struct fld *udf_inputs; /* List of udf input arguments */ TEXT udf_function[1]; /* Function name */ } *UDF; #define UDF_LEN (sizeof (struct udf)) #define UDF_value 0 #define UDF_boolean 1 #define UDF_scanned 1 /* Update block -- used for (at least) MODIFY */ typedef struct upd { USHORT upd_level; /* reference level */ struct req *upd_request; /* parent request */ struct ref *upd_references; /* references under modify */ struct ctx *upd_source; /* context being modified */ struct ctx *upd_update; /* update context */ struct por *upd_port; /* port for update */ struct upd *upd_outer; /* outer modify, if any */ struct nod *upd_assignments; /* assignments to port */ struct ref *upd_array_references; /* array references under modify */ } *UPD; #define UPD_LEN sizeof (struct upd) /* User name -- used for SQL GRANT/REVOKE */ typedef struct usn { struct usn *usn_next; SCHAR *usn_name; USHORT usn_dyn; /* describes the type of user via a dyn-verb, i.e. gds__dyn_grant_user/view/proc/trig */ } *USN; #define USN_LEN sizeof (struct usn) #ifdef __cplusplus } /* extern "C" */ #endif #include "../jrd/dsc.h" #ifdef __cplusplus extern "C" { #endif #define dtype_float dtype_real /* GPRE wide globals */ #ifdef GPRE_MAIN #define EXTERN #else #define EXTERN extern #endif /* Added sw_verbose FSG 14.Nov.2000 */ EXTERN USHORT sw_verbose, sw_auto, sw_sql, sw_gen_sql, sw_raw, sw_cstring, sw_dsql, sw_dyn_using, sw_ada, sw_standard_out, sw_ansi, sw_lines, sw_ids, sw_trace, sw_case, sw_external, sw_pyxis, sw_version, sw_window_scope, sw_alsys, sw_d_float, sw_sql_dialect, sw_know_interp, sw_server_version, sw_ods_version, override_case, dialect_specified; EXTERN SSHORT sw_interp; EXTERN USHORT compiletime_db_dialect; EXTERN TEXT ada_package[256], *ada_null_address; EXTERN DBB isc_databases; EXTERN TEXT *default_user, *default_password; EXTERN TEXT *default_lc_ctype; EXTERN TEXT *default_lc_messages; EXTERN GPRE_REQ requests; EXTERN LLS events; EXTERN IB_FILE *out_file; EXTERN LANG_T sw_language; EXTERN int line, errors, warnings, fatals; EXTERN ACT functions; EXTERN struct dbd global_db_list[32]; EXTERN USHORT global_db_count; EXTERN INTLSYM text_subtypes; /* ada_flags fields definition */ #define ADA_create_database 1 /* the flag is set when there is a create database SQL statement in user program, and is used to generate additional "with" and "function" declarations */ EXTERN USHORT ada_flags; #undef EXTERN #ifdef __cplusplus } /* extern "C" */ #endif #include "../gpre/msc_proto.h" #ifdef __cplusplus extern "C" { #endif #ifndef assert #ifdef DEV_BUILD #define _assert(ex) {if (!(ex)){(void) CPR_assert (__FILE__, __LINE__);}} #define assert(ex) _assert(ex) #else #define _assert(ex) #define assert(ex) #endif #endif #define assert_IS_REQ(x) assert(!(x) || ((x)->req_type >= 0 && (x)->req_type < REQ_LASTREQUEST)) #define assert_IS_SYM(x) assert(!(x) || ((x)->sym_type >= 0 && (x)->sym_type < SYM_LASTSYM)) #define assert_IS_NOD(x) assert(!(x) || ((x)->nod_type >= 1 && (x)->nod_type < nod_LASTNOD)) #define assert_IS_ACT(x) assert(!(x) || ((x)->act_type >= 0 && (x)->act_type < ACT_LASTACT)) #ifdef __cplusplus } /* extern "C" */ #endif #endif /* _GPRE_GPRE_H_ */