mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 20:43:02 +01:00
Implementation of CORE-5064 (#73)
* Implementation of CORE-5064 * Use constants instead of magic numbers
This commit is contained in:
parent
120a1d08a9
commit
7b9b408658
@ -74,3 +74,30 @@ BOOLEAN (FB 3.0)
|
|||||||
5. It's allowed to test booleans without compare with TRUE or FALSE. For example,
|
5. It's allowed to test booleans without compare with TRUE or FALSE. For example,
|
||||||
"field1 OR field2" and "NOT field1" are valid expressions. It's also allowed to compare with
|
"field1 OR field2" and "NOT field1" are valid expressions. It's also allowed to compare with
|
||||||
others operators, including the new IS operator: "field1 IS FALSE".
|
others operators, including the new IS operator: "field1 IS FALSE".
|
||||||
|
|
||||||
|
|
||||||
|
BINARY, VARBINARY, BINARY VARYING (FB 4.0)
|
||||||
|
------------------------------------------
|
||||||
|
|
||||||
|
Function:
|
||||||
|
Alias for CHAR, VARCHAR, VARYING CHAR with CHARACTER SET OCTETS.
|
||||||
|
|
||||||
|
Author:
|
||||||
|
Dimitry Sibiryakov
|
||||||
|
|
||||||
|
Syntax rules:
|
||||||
|
BINARY[(length)]
|
||||||
|
VARBINARY(length)
|
||||||
|
BINARY VARYING(length)
|
||||||
|
|
||||||
|
Example(s):
|
||||||
|
1. DECLARE VARIABLE VAR1 VARBINARY(10);
|
||||||
|
2. CREATE TABLE TABLE1 (FIELD1 BINARY(16),
|
||||||
|
FIELD2 VARBINARY(100),
|
||||||
|
FIELD3 BINARY VARYING(1000));
|
||||||
|
|
||||||
|
Note(s):
|
||||||
|
1. If length is omitted for type BINARY, it is considered to be 1.
|
||||||
|
2. Can be distinguished from text types by value 1 in RDB$FIELD_SUB_TYPE.
|
||||||
|
3. Character set is set to OCTETS for backward compatibility.
|
||||||
|
4. In API are similar to corresponding text types, getSubType() returns 0.
|
||||||
|
@ -591,6 +591,7 @@ using namespace Firebird;
|
|||||||
|
|
||||||
// tokens added for Firebird 4.0
|
// tokens added for Firebird 4.0
|
||||||
|
|
||||||
|
%token <metaNamePtr> BINARY
|
||||||
%token <metaNamePtr> CUME_DIST
|
%token <metaNamePtr> CUME_DIST
|
||||||
%token <metaNamePtr> DEFINER
|
%token <metaNamePtr> DEFINER
|
||||||
%token <metaNamePtr> EXCLUDE
|
%token <metaNamePtr> EXCLUDE
|
||||||
@ -611,6 +612,7 @@ using namespace Firebird;
|
|||||||
%token <metaNamePtr> SYSTEM
|
%token <metaNamePtr> SYSTEM
|
||||||
%token <metaNamePtr> TIES
|
%token <metaNamePtr> TIES
|
||||||
%token <metaNamePtr> UNBOUNDED
|
%token <metaNamePtr> UNBOUNDED
|
||||||
|
%token <metaNamePtr> VARBINARY
|
||||||
%token <metaNamePtr> WINDOW
|
%token <metaNamePtr> WINDOW
|
||||||
|
|
||||||
// precedence declarations for expression evaluation
|
// precedence declarations for expression evaluation
|
||||||
@ -4429,6 +4431,7 @@ simple_type
|
|||||||
%type <legacyField> non_charset_simple_type
|
%type <legacyField> non_charset_simple_type
|
||||||
non_charset_simple_type
|
non_charset_simple_type
|
||||||
: national_character_type
|
: national_character_type
|
||||||
|
| binary_character_type
|
||||||
| numeric_type
|
| numeric_type
|
||||||
| float_type
|
| float_type
|
||||||
| BIGINT
|
| BIGINT
|
||||||
@ -4614,6 +4617,40 @@ national_character_type
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
%type <legacyField> binary_character_type
|
||||||
|
binary_character_type
|
||||||
|
: binary_character_keyword '(' pos_short_integer ')'
|
||||||
|
{
|
||||||
|
$$ = newNode<dsql_fld>();
|
||||||
|
$$->dtype = dtype_text;
|
||||||
|
$$->charLength = (USHORT) $3;
|
||||||
|
$$->length = (USHORT) $3;
|
||||||
|
$$->textType = ttype_binary;
|
||||||
|
$$->charSetId = CS_BINARY;
|
||||||
|
$$->subType = fb_text_subtype_binary;
|
||||||
|
}
|
||||||
|
| binary_character_keyword
|
||||||
|
{
|
||||||
|
$$ = newNode<dsql_fld>();
|
||||||
|
$$->dtype = dtype_text;
|
||||||
|
$$->charLength = 1;
|
||||||
|
$$->length = 1;
|
||||||
|
$$->textType = ttype_binary;
|
||||||
|
$$->charSetId = CS_BINARY;
|
||||||
|
$$->subType = fb_text_subtype_binary;
|
||||||
|
}
|
||||||
|
| varbinary_character_keyword '(' pos_short_integer ')'
|
||||||
|
{
|
||||||
|
$$ = newNode<dsql_fld>();
|
||||||
|
$$->dtype = dtype_varying;
|
||||||
|
$$->charLength = (USHORT) $3;
|
||||||
|
$$->length = (USHORT) $3 + sizeof(USHORT);
|
||||||
|
$$->textType = ttype_binary;
|
||||||
|
$$->charSetId = CS_BINARY;
|
||||||
|
$$->subType = fb_text_subtype_binary;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
%type <legacyField> character_type
|
%type <legacyField> character_type
|
||||||
character_type
|
character_type
|
||||||
: character_keyword '(' pos_short_integer ')'
|
: character_keyword '(' pos_short_integer ')'
|
||||||
@ -4653,6 +4690,14 @@ national_character_keyword
|
|||||||
| NATIONAL CHAR
|
| NATIONAL CHAR
|
||||||
;
|
;
|
||||||
|
|
||||||
|
binary_character_keyword
|
||||||
|
: BINARY
|
||||||
|
;
|
||||||
|
|
||||||
|
varbinary_character_keyword
|
||||||
|
: VARBINARY
|
||||||
|
| BINARY VARYING
|
||||||
|
;
|
||||||
|
|
||||||
// numeric type
|
// numeric type
|
||||||
|
|
||||||
|
@ -650,6 +650,13 @@
|
|||||||
//#define isc_blob_dbase_ole 23
|
//#define isc_blob_dbase_ole 23
|
||||||
//#define isc_blob_typed_binary 24
|
//#define isc_blob_typed_binary 24
|
||||||
|
|
||||||
|
/*****************/
|
||||||
|
/* Text Subtypes */
|
||||||
|
/*****************/
|
||||||
|
|
||||||
|
#define fb_text_subtype_text 0
|
||||||
|
#define fb_text_subtype_binary 1
|
||||||
|
|
||||||
/* Deprecated definitions maintained for compatibility only */
|
/* Deprecated definitions maintained for compatibility only */
|
||||||
|
|
||||||
//#define isc_info_db_SQL_dialect 62
|
//#define isc_info_db_SQL_dialect 62
|
||||||
|
@ -410,7 +410,7 @@ int EXTRACT_list_table(const SCHAR* relation_name,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SCALE))
|
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_PRECISION, FLD.RDB$FIELD_SCALE))
|
||||||
return FINI_ERROR;
|
return FINI_ERROR;
|
||||||
|
|
||||||
if ((FLD.RDB$FIELD_TYPE == T_CHAR) || (FLD.RDB$FIELD_TYPE == VARCHAR))
|
if ((FLD.RDB$FIELD_TYPE == T_CHAR) || (FLD.RDB$FIELD_TYPE == VARCHAR))
|
||||||
@ -440,7 +440,7 @@ int EXTRACT_list_table(const SCHAR* relation_name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// International character sets
|
// International character sets
|
||||||
if ((FLD.RDB$FIELD_TYPE == T_CHAR || FLD.RDB$FIELD_TYPE == VARCHAR ||
|
if ((((FLD.RDB$FIELD_TYPE == T_CHAR || FLD.RDB$FIELD_TYPE == VARCHAR) && FLD.RDB$FIELD_SUB_TYPE == fb_text_subtype_text) ||
|
||||||
FLD.RDB$FIELD_TYPE == BLOB) &&
|
FLD.RDB$FIELD_TYPE == BLOB) &&
|
||||||
!FLD.RDB$CHARACTER_SET_ID.NULL)
|
!FLD.RDB$CHARACTER_SET_ID.NULL)
|
||||||
{
|
{
|
||||||
@ -801,7 +801,7 @@ static void get_procedure_args(const char* proc_name)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SCALE))
|
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_PRECISION, FLD.RDB$FIELD_SCALE))
|
||||||
return; // ps_ERR;
|
return; // ps_ERR;
|
||||||
|
|
||||||
// Changed this to return RDB$CHARACTER_LENGTH if available
|
// Changed this to return RDB$CHARACTER_LENGTH if available
|
||||||
@ -816,7 +816,8 @@ static void get_procedure_args(const char* proc_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show international character sets and collations
|
// Show international character sets and collations
|
||||||
if (!FLD.RDB$COLLATION_ID.NULL || !FLD.RDB$CHARACTER_SET_ID.NULL)
|
if ((!FLD.RDB$COLLATION_ID.NULL || !FLD.RDB$CHARACTER_SET_ID.NULL) &&
|
||||||
|
!(((FLD.RDB$FIELD_TYPE == T_CHAR) || (FLD.RDB$FIELD_TYPE == VARCHAR)) && FLD.RDB$FIELD_SUB_TYPE != fb_text_subtype_text))
|
||||||
{
|
{
|
||||||
char_sets[0] = 0;
|
char_sets[0] = 0;
|
||||||
|
|
||||||
@ -1017,7 +1018,7 @@ static void get_function_args_ods12(const char* func_name, USHORT out_arg)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SCALE))
|
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_PRECISION, FLD.RDB$FIELD_SCALE))
|
||||||
return; // ps_ERR;
|
return; // ps_ERR;
|
||||||
|
|
||||||
// Changed this to return RDB$CHARACTER_LENGTH if available
|
// Changed this to return RDB$CHARACTER_LENGTH if available
|
||||||
@ -1032,7 +1033,8 @@ static void get_function_args_ods12(const char* func_name, USHORT out_arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show international character sets and collations
|
// Show international character sets and collations
|
||||||
if (!FLD.RDB$COLLATION_ID.NULL || !FLD.RDB$CHARACTER_SET_ID.NULL)
|
if ((!FLD.RDB$COLLATION_ID.NULL || !FLD.RDB$CHARACTER_SET_ID.NULL) &&
|
||||||
|
!(((FLD.RDB$FIELD_TYPE == T_CHAR) || (FLD.RDB$FIELD_TYPE == VARCHAR)) && FLD.RDB$FIELD_SUB_TYPE != fb_text_subtype_text))
|
||||||
{
|
{
|
||||||
char_sets[0] = 0;
|
char_sets[0] = 0;
|
||||||
|
|
||||||
@ -2235,7 +2237,7 @@ static void list_domain_table(const SCHAR* table_name, SSHORT default_char_set_i
|
|||||||
|
|
||||||
isqlGlob.printf("CREATE DOMAIN %s AS ", FLD.RDB$FIELD_NAME);
|
isqlGlob.printf("CREATE DOMAIN %s AS ", FLD.RDB$FIELD_NAME);
|
||||||
|
|
||||||
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SCALE))
|
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_PRECISION, FLD.RDB$FIELD_SCALE))
|
||||||
return; // ps_ERR;
|
return; // ps_ERR;
|
||||||
|
|
||||||
if (FLD.RDB$FIELD_TYPE == BLOB)
|
if (FLD.RDB$FIELD_TYPE == BLOB)
|
||||||
@ -2265,7 +2267,8 @@ static void list_domain_table(const SCHAR* table_name, SSHORT default_char_set_i
|
|||||||
// do, then the domain syntax when printed is not correct.
|
// do, then the domain syntax when printed is not correct.
|
||||||
|
|
||||||
// Since the character set is part of the field type, display that information now.
|
// Since the character set is part of the field type, display that information now.
|
||||||
if (!FLD.RDB$CHARACTER_SET_ID.NULL)
|
if (!FLD.RDB$CHARACTER_SET_ID.NULL &&
|
||||||
|
!(((FLD.RDB$FIELD_TYPE == T_CHAR) || (FLD.RDB$FIELD_TYPE == VARCHAR)) && FLD.RDB$FIELD_SUB_TYPE != fb_text_subtype_text))
|
||||||
{
|
{
|
||||||
|
|
||||||
char_sets[0] = 0;
|
char_sets[0] = 0;
|
||||||
@ -2357,7 +2360,7 @@ static void list_domains(SSHORT default_char_set_id)
|
|||||||
else
|
else
|
||||||
isqlGlob.printf("CREATE DOMAIN %s AS ", FLD.RDB$FIELD_NAME);
|
isqlGlob.printf("CREATE DOMAIN %s AS ", FLD.RDB$FIELD_NAME);
|
||||||
|
|
||||||
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SCALE))
|
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_PRECISION, FLD.RDB$FIELD_SCALE))
|
||||||
return; // ps_ERR;
|
return; // ps_ERR;
|
||||||
|
|
||||||
if (FLD.RDB$FIELD_TYPE == BLOB)
|
if (FLD.RDB$FIELD_TYPE == BLOB)
|
||||||
@ -2388,7 +2391,8 @@ static void list_domains(SSHORT default_char_set_id)
|
|||||||
// do, then the domain syntax when printed is not correct.
|
// do, then the domain syntax when printed is not correct.
|
||||||
|
|
||||||
// Since the character set is part of the field type, display that information now.
|
// Since the character set is part of the field type, display that information now.
|
||||||
if (!FLD.RDB$CHARACTER_SET_ID.NULL)
|
if (!FLD.RDB$CHARACTER_SET_ID.NULL &&
|
||||||
|
!(((FLD.RDB$FIELD_TYPE == T_CHAR) || (FLD.RDB$FIELD_TYPE == VARCHAR)) && FLD.RDB$FIELD_SUB_TYPE != fb_text_subtype_text))
|
||||||
{
|
{
|
||||||
char_sets[0] = 0;
|
char_sets[0] = 0;
|
||||||
if ((FLD.RDB$CHARACTER_SET_ID != default_char_set_id) ||
|
if ((FLD.RDB$CHARACTER_SET_ID != default_char_set_id) ||
|
||||||
@ -2575,7 +2579,7 @@ static void listRelationComputed(LegacyTables flag, SSHORT default_char_set_id)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SCALE))
|
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_PRECISION, FLD.RDB$FIELD_SCALE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((FLD.RDB$FIELD_TYPE == T_CHAR) || (FLD.RDB$FIELD_TYPE == VARCHAR))
|
if ((FLD.RDB$FIELD_TYPE == T_CHAR) || (FLD.RDB$FIELD_TYPE == VARCHAR))
|
||||||
@ -2605,7 +2609,7 @@ static void listRelationComputed(LegacyTables flag, SSHORT default_char_set_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// International character sets
|
// International character sets
|
||||||
if ((FLD.RDB$FIELD_TYPE == T_CHAR || FLD.RDB$FIELD_TYPE == VARCHAR ||
|
if ((((FLD.RDB$FIELD_TYPE == T_CHAR || FLD.RDB$FIELD_TYPE == VARCHAR) && FLD.RDB$FIELD_SUB_TYPE == fb_text_subtype_text) ||
|
||||||
FLD.RDB$FIELD_TYPE == BLOB) &&
|
FLD.RDB$FIELD_TYPE == BLOB) &&
|
||||||
!FLD.RDB$CHARACTER_SET_ID.NULL)
|
!FLD.RDB$CHARACTER_SET_ID.NULL)
|
||||||
{
|
{
|
||||||
|
@ -1808,7 +1808,7 @@ bool ISQL_is_domain(const TEXT* field_name)
|
|||||||
|
|
||||||
// Print the numeric type as accurately as possible, depending on the ODS.
|
// Print the numeric type as accurately as possible, depending on the ODS.
|
||||||
// If it isn't numeric/decimal or is another non-numeric data type, print only the type.
|
// If it isn't numeric/decimal or is another non-numeric data type, print only the type.
|
||||||
bool ISQL_printNumericType(const char* fieldName, const int fieldType, const int fieldScale)
|
bool ISQL_printNumericType(const char* fieldName, const int fieldType, const int fieldSubType, const int fieldPrecision, const int fieldScale)
|
||||||
{
|
{
|
||||||
// Look through types array
|
// Look through types array
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -1822,63 +1822,68 @@ bool ISQL_printNumericType(const char* fieldName, const int fieldType, const int
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool precision_known = false;
|
switch (fieldType)
|
||||||
|
|
||||||
if (isqlGlob.major_ods >= ODS_VERSION10 &&
|
|
||||||
(fieldType == SMALLINT || fieldType == INTEGER || fieldType == BIGINT))
|
|
||||||
{
|
{
|
||||||
|
case SMALLINT:
|
||||||
|
case INTEGER:
|
||||||
|
case BIGINT:
|
||||||
// Handle Integral subtypes NUMERIC and DECIMAL
|
// Handle Integral subtypes NUMERIC and DECIMAL
|
||||||
// We are ODS >= 10 and could be any Dialect
|
// We are ODS >= 10 and could be any Dialect
|
||||||
FOR FLD1 IN RDB$FIELDS WITH
|
|
||||||
FLD1.RDB$FIELD_NAME EQ fieldName
|
|
||||||
AND NOT FLD1.RDB$FIELD_PRECISION EQ 0
|
|
||||||
|
|
||||||
// We are Dialect >=3 since FIELD_PRECISION is non-NULL
|
// We are Dialect >=3 since FIELD_PRECISION is non-NULL
|
||||||
if (FLD1.RDB$FIELD_SUB_TYPE > 0 && FLD1.RDB$FIELD_SUB_TYPE <= MAX_INTSUBTYPES)
|
if (isqlGlob.major_ods >= ODS_VERSION10 && fieldPrecision != 0 && fieldSubType > 0 && fieldSubType <= MAX_INTSUBTYPES)
|
||||||
{
|
|
||||||
isqlGlob.printf("%s(%d, %d)",
|
|
||||||
Integral_subtypes[FLD1.RDB$FIELD_SUB_TYPE],
|
|
||||||
FLD1.RDB$FIELD_PRECISION,
|
|
||||||
-FLD1.RDB$FIELD_SCALE);
|
|
||||||
precision_known = true;
|
|
||||||
}
|
|
||||||
END_FOR
|
|
||||||
ON_ERROR
|
|
||||||
ISQL_errmsg (fbStatus);
|
|
||||||
return false;
|
|
||||||
END_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!precision_known)
|
|
||||||
{
|
|
||||||
if (fieldScale < 0)
|
|
||||||
{
|
{
|
||||||
// Take a stab at numerics and decimals
|
isqlGlob.printf("%s(%d, %d)",
|
||||||
switch (fieldType)
|
Integral_subtypes[fieldSubType],
|
||||||
{
|
fieldPrecision,
|
||||||
case SMALLINT:
|
-fieldScale);
|
||||||
isqlGlob.printf("NUMERIC(4, %d)", -fieldScale);
|
|
||||||
break;
|
|
||||||
case INTEGER:
|
|
||||||
isqlGlob.printf("NUMERIC(9, %d)", -fieldScale);
|
|
||||||
break;
|
|
||||||
case BIGINT:
|
|
||||||
isqlGlob.printf("NUMERIC(18, %d)", -fieldScale);
|
|
||||||
break;
|
|
||||||
case DOUBLE_PRECISION:
|
|
||||||
isqlGlob.printf("NUMERIC(15, %d)", -fieldScale);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
isqlGlob.printf("%s", Column_types[i].type_name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// This is a non-numeric data type
|
if (fieldScale < 0)
|
||||||
isqlGlob.printf("%s", Column_types[i].type_name);
|
{
|
||||||
|
// Take a stab at numerics and decimals
|
||||||
|
switch (fieldType)
|
||||||
|
{
|
||||||
|
case SMALLINT:
|
||||||
|
isqlGlob.printf("NUMERIC(4, %d)", -fieldScale);
|
||||||
|
break;
|
||||||
|
case INTEGER:
|
||||||
|
isqlGlob.printf("NUMERIC(9, %d)", -fieldScale);
|
||||||
|
break;
|
||||||
|
case BIGINT:
|
||||||
|
isqlGlob.printf("NUMERIC(18, %d)", -fieldScale);
|
||||||
|
break;
|
||||||
|
case DOUBLE_PRECISION:
|
||||||
|
isqlGlob.printf("NUMERIC(15, %d)", -fieldScale);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
case T_CHAR:
|
||||||
|
if (fieldSubType >= 0 && fieldSubType <= MAX_TEXTSUBTYPES)
|
||||||
|
{
|
||||||
|
isqlGlob.printf("%s", Text_subtypes[fieldSubType]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case VARCHAR:
|
||||||
|
if (fieldSubType >= 0 && fieldSubType <= MAX_VARYINGSUBTYPES)
|
||||||
|
{
|
||||||
|
isqlGlob.printf("%s", Varying_subtypes[fieldSubType]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Field type without recognizable subtypes
|
||||||
|
isqlGlob.printf("%s", Column_types[i].type_name);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,6 +324,24 @@ static const SCHAR* Integral_subtypes[] = {
|
|||||||
"DECIMAL" // DECIMAL, keyword
|
"DECIMAL" // DECIMAL, keyword
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Text subtypes
|
||||||
|
|
||||||
|
const int MAX_TEXTSUBTYPES = 1;
|
||||||
|
|
||||||
|
static const SCHAR* Text_subtypes[] = {
|
||||||
|
"CHAR",
|
||||||
|
"BINARY"
|
||||||
|
};
|
||||||
|
|
||||||
|
// Varying subtypes
|
||||||
|
|
||||||
|
const int MAX_VARYINGSUBTYPES = 1;
|
||||||
|
|
||||||
|
static const SCHAR* Varying_subtypes[] = {
|
||||||
|
"VARCHAR",
|
||||||
|
"VARBINARY"
|
||||||
|
};
|
||||||
|
|
||||||
// Blob subtypes
|
// Blob subtypes
|
||||||
|
|
||||||
const int MAX_BLOBSUBTYPES = 8;
|
const int MAX_BLOBSUBTYPES = 8;
|
||||||
|
@ -53,7 +53,7 @@ SSHORT ISQL_init(FILE*, FILE*);
|
|||||||
bool ISQL_is_domain(const TEXT*);
|
bool ISQL_is_domain(const TEXT*);
|
||||||
#endif
|
#endif
|
||||||
int ISQL_main(int, char**);
|
int ISQL_main(int, char**);
|
||||||
bool ISQL_printNumericType(const char* fieldName, const int fieldType, const int fieldScale);
|
bool ISQL_printNumericType(const char* fieldName, const int fieldType, const int fieldSubType, const int fieldPrecision, const int fieldScale);
|
||||||
void ISQL_print_validation(FILE*, ISC_QUAD*, bool, Firebird::ITransaction*);
|
void ISQL_print_validation(FILE*, ISC_QUAD*, bool, Firebird::ITransaction*);
|
||||||
//void ISQL_query_database(SSHORT*, FILE*, FILE*, FILE*);
|
//void ISQL_query_database(SSHORT*, FILE*, FILE*, FILE*);
|
||||||
//void ISQL_reset_settings();
|
//void ISQL_reset_settings();
|
||||||
|
@ -3855,7 +3855,7 @@ static processing_state show_domains(const SCHAR* domain_name)
|
|||||||
isqlGlob.printf("%s ", NEWLINE);
|
isqlGlob.printf("%s ", NEWLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SCALE))
|
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_PRECISION, FLD.RDB$FIELD_SCALE))
|
||||||
return ps_ERR;
|
return ps_ERR;
|
||||||
|
|
||||||
// Length for CHARs
|
// Length for CHARs
|
||||||
@ -3877,8 +3877,8 @@ static processing_state show_domains(const SCHAR* domain_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show international character sets
|
// Show international character sets
|
||||||
if (FLD.RDB$FIELD_TYPE == T_CHAR ||
|
if (((FLD.RDB$FIELD_TYPE == T_CHAR ||
|
||||||
FLD.RDB$FIELD_TYPE == VARCHAR ||
|
FLD.RDB$FIELD_TYPE == VARCHAR) && FLD.RDB$FIELD_SUB_TYPE == fb_text_subtype_text) ||
|
||||||
FLD.RDB$FIELD_TYPE == BLOB)
|
FLD.RDB$FIELD_TYPE == BLOB)
|
||||||
{
|
{
|
||||||
show_charsets(NULL, FLD.RDB$FIELD_NAME, true, false, false, false);
|
show_charsets(NULL, FLD.RDB$FIELD_NAME, true, false, false, false);
|
||||||
@ -4351,7 +4351,7 @@ static processing_state show_func(const SCHAR* funcname)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SCALE))
|
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_PRECISION, FLD.RDB$FIELD_SCALE))
|
||||||
return ps_ERR;
|
return ps_ERR;
|
||||||
|
|
||||||
// Use RDB$CHARACTER_LENGTH instead of RDB$FIELD_LENGTH
|
// Use RDB$CHARACTER_LENGTH instead of RDB$FIELD_LENGTH
|
||||||
@ -4364,8 +4364,8 @@ static processing_state show_func(const SCHAR* funcname)
|
|||||||
|
|
||||||
// Show international character sets and collations
|
// Show international character sets and collations
|
||||||
|
|
||||||
if (FLD.RDB$FIELD_TYPE == T_CHAR ||
|
if (((FLD.RDB$FIELD_TYPE == T_CHAR ||
|
||||||
FLD.RDB$FIELD_TYPE == VARCHAR ||
|
FLD.RDB$FIELD_TYPE == VARCHAR) && FLD.RDB$FIELD_SUB_TYPE == fb_text_subtype_text) ||
|
||||||
FLD.RDB$FIELD_TYPE == BLOB)
|
FLD.RDB$FIELD_TYPE == BLOB)
|
||||||
{
|
{
|
||||||
SSHORT charset = 0, collation = 0;
|
SSHORT charset = 0, collation = 0;
|
||||||
@ -5244,7 +5244,7 @@ static processing_state show_proc(const SCHAR* procname)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SCALE))
|
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_PRECISION, FLD.RDB$FIELD_SCALE))
|
||||||
return ps_ERR;
|
return ps_ERR;
|
||||||
|
|
||||||
// Use RDB$CHARACTER_LENGTH instead of RDB$FIELD_LENGTH
|
// Use RDB$CHARACTER_LENGTH instead of RDB$FIELD_LENGTH
|
||||||
@ -5257,8 +5257,8 @@ static processing_state show_proc(const SCHAR* procname)
|
|||||||
|
|
||||||
// Show international character sets and collations
|
// Show international character sets and collations
|
||||||
|
|
||||||
if (FLD.RDB$FIELD_TYPE == T_CHAR ||
|
if (((FLD.RDB$FIELD_TYPE == T_CHAR ||
|
||||||
FLD.RDB$FIELD_TYPE == VARCHAR ||
|
FLD.RDB$FIELD_TYPE == VARCHAR) && FLD.RDB$FIELD_SUB_TYPE == fb_text_subtype_text) ||
|
||||||
FLD.RDB$FIELD_TYPE == BLOB)
|
FLD.RDB$FIELD_TYPE == BLOB)
|
||||||
{
|
{
|
||||||
SSHORT charset = 0;
|
SSHORT charset = 0;
|
||||||
@ -5775,14 +5775,17 @@ static processing_state show_table(const SCHAR* relation_name, bool isView)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SCALE))
|
if (!ISQL_printNumericType(FLD.RDB$FIELD_NAME, FLD.RDB$FIELD_TYPE, FLD.RDB$FIELD_SUB_TYPE, FLD.RDB$FIELD_PRECISION, FLD.RDB$FIELD_SCALE))
|
||||||
return ps_ERR;
|
return ps_ERR;
|
||||||
|
|
||||||
if ((FLD.RDB$FIELD_TYPE == T_CHAR) || (FLD.RDB$FIELD_TYPE == VARCHAR)) {
|
if ((FLD.RDB$FIELD_TYPE == T_CHAR) || (FLD.RDB$FIELD_TYPE == VARCHAR)) {
|
||||||
isqlGlob.printf("(%d)", ISQL_get_field_length(FLD.RDB$FIELD_NAME));
|
isqlGlob.printf("(%d)", ISQL_get_field_length(FLD.RDB$FIELD_NAME));
|
||||||
|
|
||||||
// Show international character sets and collations
|
if (FLD.RDB$FIELD_SUB_TYPE == fb_text_subtype_text)
|
||||||
show_charsets(relation_name, RFR.RDB$FIELD_NAME, true, false, false, false);
|
{
|
||||||
|
// Show international character sets and collations
|
||||||
|
show_charsets(relation_name, RFR.RDB$FIELD_NAME, true, false, false, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FLD.RDB$FIELD_TYPE == BLOB)
|
if (FLD.RDB$FIELD_TYPE == BLOB)
|
||||||
|
@ -94,6 +94,7 @@ static const TOK tokens[] =
|
|||||||
{TOK_BIN_SHL, "BIN_SHL", true},
|
{TOK_BIN_SHL, "BIN_SHL", true},
|
||||||
{TOK_BIN_SHR, "BIN_SHR", true},
|
{TOK_BIN_SHR, "BIN_SHR", true},
|
||||||
{TOK_BIN_XOR, "BIN_XOR", true},
|
{TOK_BIN_XOR, "BIN_XOR", true},
|
||||||
|
{TOK_BINARY, "BINARY", false},
|
||||||
{TOK_BIT_LENGTH, "BIT_LENGTH", false},
|
{TOK_BIT_LENGTH, "BIT_LENGTH", false},
|
||||||
{TOK_BLOB, "BLOB", false},
|
{TOK_BLOB, "BLOB", false},
|
||||||
{TOK_BLOCK, "BLOCK", true},
|
{TOK_BLOCK, "BLOCK", true},
|
||||||
@ -462,6 +463,7 @@ static const TOK tokens[] =
|
|||||||
{TOK_VALUES, "VALUES", false},
|
{TOK_VALUES, "VALUES", false},
|
||||||
{TOK_VAR_POP, "VAR_POP", false},
|
{TOK_VAR_POP, "VAR_POP", false},
|
||||||
{TOK_VAR_SAMP, "VAR_SAMP", false},
|
{TOK_VAR_SAMP, "VAR_SAMP", false},
|
||||||
|
{TOK_VARBINARY, "VARBINARY", false},
|
||||||
{TOK_VARCHAR, "VARCHAR", false},
|
{TOK_VARCHAR, "VARCHAR", false},
|
||||||
{TOK_VARIABLE, "VARIABLE", false},
|
{TOK_VARIABLE, "VARIABLE", false},
|
||||||
{TOK_VARYING, "VARYING", false},
|
{TOK_VARYING, "VARYING", false},
|
||||||
|
@ -330,7 +330,7 @@ int SQLDAMetadata::getSubType(CheckStatusWrapper* status, unsigned index)
|
|||||||
fb_assert(sqlda->sqld > (int) index);
|
fb_assert(sqlda->sqld > (int) index);
|
||||||
ISC_SHORT sqltype = sqlda->sqlvar[index].sqltype & ~1;
|
ISC_SHORT sqltype = sqlda->sqlvar[index].sqltype & ~1;
|
||||||
if (sqltype == SQL_VARYING || sqltype == SQL_TEXT)
|
if (sqltype == SQL_VARYING || sqltype == SQL_TEXT)
|
||||||
return 0;
|
return sqlda->sqlvar[index].sqlsubtype == CS_BINARY ? fb_text_subtype_binary : fb_text_subtype_text;
|
||||||
return sqlda->sqlvar[index].sqlsubtype;
|
return sqlda->sqlvar[index].sqlsubtype;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user