mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-24 06:03:02 +01:00
2fa67d46bc
Reduce reinterpret and C casts Fix isql so it can show all predefined blob types in readable form.
197 lines
5.7 KiB
C
197 lines
5.7 KiB
C
/*
|
|
* PROGRAM: JRD access method
|
|
* MODULE: dsc.h
|
|
* DESCRIPTION: Definitions associated with descriptors
|
|
*
|
|
* 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): ______________________________________.
|
|
* 2002.04.16 Paul Beach - HP10 Define changed from -4 to (-4) to make it
|
|
* compatible with the HP Compiler
|
|
*/
|
|
|
|
#ifndef JRD_DSC_H
|
|
#define JRD_DSC_H
|
|
|
|
|
|
/* Descriptor format */
|
|
|
|
/* WARNING !
|
|
This run-time structure is stored in RDB$FORMATS.RDB$DESCRIPTORS.
|
|
Any modification to this structure is tantamount to an ODS change.
|
|
See MET_format() and make_format() in MET.EPP for enlightenment.
|
|
*/
|
|
|
|
typedef struct dsc
|
|
{
|
|
dsc()
|
|
: dsc_dtype(0),
|
|
dsc_scale(0),
|
|
dsc_length(0),
|
|
dsc_sub_type(0),
|
|
dsc_flags(0),
|
|
dsc_address(0)
|
|
{}
|
|
|
|
UCHAR dsc_dtype;
|
|
SCHAR dsc_scale;
|
|
USHORT dsc_length;
|
|
SSHORT dsc_sub_type;
|
|
USHORT dsc_flags;
|
|
UCHAR* dsc_address; // Used either as offset in a message or as a pointer
|
|
} DSC;
|
|
|
|
/* values for dsc_flags */
|
|
/* Note: DSC_null is only reliably set for local variables
|
|
(blr_variable) */
|
|
#define DSC_null 1
|
|
#define DSC_no_subtype 2 /* dsc has no sub type specified */
|
|
#define DSC_nullable 4 /* not stored. instead, is derived
|
|
from metadata primarily to flag
|
|
SQLDA (in DSQL) */
|
|
|
|
/* Overload text typing information into the dsc_sub_type field.
|
|
See intl.h for definitions of text types */
|
|
|
|
#ifndef dsc_ttype
|
|
#define dsc_ttype dsc_sub_type
|
|
#endif
|
|
|
|
#define DSC_GET_CHARSET(dsc) (((dsc)->dsc_ttype) & 0x00FF)
|
|
#define DSC_GET_COLLATE(dsc) (((dsc)->dsc_ttype) >> 8)
|
|
|
|
|
|
typedef struct alt_dsc {
|
|
SLONG dsc_combined_type;
|
|
SSHORT dsc_sub_type;
|
|
USHORT dsc_flags; /* Not currently used */
|
|
} ALT_DSC;
|
|
|
|
|
|
|
|
#define DSC_EQUIV(d1,d2) ((((ALT_DSC*) d1)->dsc_combined_type == ((ALT_DSC*) d2)->dsc_combined_type) && \
|
|
((DSC_GET_CHARSET (d1) == DSC_GET_CHARSET (d2)) || d1->dsc_dtype > dtype_any_text))
|
|
|
|
|
|
|
|
/* Data types */
|
|
|
|
/* WARNING: if you add another manifest constant to this group, then you
|
|
* must add another entry to the array compare_priority in jrd/cvt2.c.
|
|
*/
|
|
|
|
/* Note that dtype_null actually means that we do not yet know the
|
|
dtype for this descriptor. A nice cleanup item would be to globally
|
|
change it to dtype_unknown. --chrisj 1999-02-17 */
|
|
// Name changed on 2003.12.17 by CVC.
|
|
|
|
#define dtype_unknown 0
|
|
#define dtype_text 1
|
|
#define dtype_cstring 2
|
|
#define dtype_varying 3
|
|
|
|
#define dtype_packed 6
|
|
#define dtype_byte 7
|
|
#define dtype_short 8
|
|
#define dtype_long 9
|
|
#define dtype_quad 10
|
|
#define dtype_real 11
|
|
#define dtype_double 12
|
|
#define dtype_d_float 13
|
|
#define dtype_sql_date 14
|
|
#define dtype_sql_time 15
|
|
#define dtype_timestamp 16
|
|
#define dtype_blob 17
|
|
#define dtype_array 18
|
|
#define dtype_int64 19
|
|
|
|
#define DTYPE_TYPE_MAX 20
|
|
|
|
/* In DSC_*_result tables, DTYPE_CANNOT means that the two operands
|
|
cannot participate together in the requested operation. */
|
|
|
|
#define DTYPE_CANNOT 127
|
|
|
|
/* Historical alias definition */
|
|
#define dtype_date dtype_timestamp
|
|
|
|
#define dtype_aligned dtype_varying
|
|
#define dtype_any_text dtype_varying
|
|
#define dtype_min_comp dtype_packed
|
|
#define dtype_max_comp dtype_d_float
|
|
|
|
/* NOTE: For types <= dtype_any_text the dsc_sub_type field defines
|
|
the text type */
|
|
|
|
#define TEXT_LEN(d) ((d->dsc_dtype == dtype_text) ? d->dsc_length : (d->dsc_dtype == dtype_cstring) ? d->dsc_length - 1 : d->dsc_length - sizeof(USHORT))
|
|
|
|
|
|
/* Text Sub types, distinct from character sets & collations */
|
|
|
|
#define dsc_text_type_none 0 /* Normal text */
|
|
#define dsc_text_type_fixed 1 /* strings can contain null bytes */
|
|
#define dsc_text_type_metadata 3 /* string represents system metadata */
|
|
|
|
|
|
/* Exact numeric subtypes: with ODS >= 10, these apply when dtype
|
|
is short, long, or quad. */
|
|
|
|
#define dsc_num_type_none 0 /* defined as SMALLINT or INTEGER */
|
|
#define dsc_num_type_numeric 1 /* defined as NUMERIC(n,m) */
|
|
#define dsc_num_type_decimal 2 /* defined as DECIMAL(n,m) */
|
|
|
|
|
|
/* Date type information */
|
|
|
|
#define DTYPE_IS_TEXT(d) (((d) >= dtype_text) && ((d) <= dtype_varying))
|
|
#define DTYPE_IS_DATE(t) (((t) >= dtype_sql_date) && ((t) <= dtype_timestamp))
|
|
|
|
/* DTYPE_IS_BLOB includes both BLOB and ARRAY since array's are implemented over blobs. */
|
|
#define DTYPE_IS_BLOB(d) (((d) == dtype_blob) || ((d) == dtype_array))
|
|
|
|
/* Exact numeric? */
|
|
|
|
#define DTYPE_IS_EXACT(d) (((d) == dtype_int64) || \
|
|
((d) == dtype_long) || \
|
|
((d) == dtype_short))
|
|
|
|
#ifdef VMS
|
|
#define DTYPE_IS_APPROX(d) (((d) == dtype_double) || \
|
|
((d) == dtype_real) || \
|
|
((d) == dtype_d_float))
|
|
#else
|
|
#define DTYPE_IS_APPROX(d) (((d) == dtype_double) || \
|
|
((d) == dtype_real))
|
|
#endif
|
|
|
|
#define DTYPE_IS_NUMERIC(d) ((((d) >= dtype_byte) && \
|
|
((d) <= dtype_d_float)) || \
|
|
((d) == dtype_int64))
|
|
|
|
#define NUMERIC_SCALE(desc) ((DTYPE_IS_TEXT((desc).dsc_dtype)) ? 0 : (desc).dsc_scale)
|
|
|
|
/* Macros defining what operations are legal on data types */
|
|
#define DTYPE_CAN_NEGATE(d) DTYPE_IS_NUMERIC(d)
|
|
#define DTYPE_CAN_AVERAGE(d) DTYPE_IS_NUMERIC(d)
|
|
#define DTYPE_CAN_DIVIDE(d) DTYPE_IS_NUMERIC(d)
|
|
#define DTYPE_CAN_MULTIPLY(d) DTYPE_IS_NUMERIC(d)
|
|
|
|
|
|
#define ISC_TIME_SECONDS_PRECISION 10000L
|
|
#define ISC_TIME_SECONDS_PRECISION_SCALE (-4)
|
|
|
|
#endif /* JRD_DSC_H */
|