-
-
Notifications
You must be signed in to change notification settings - Fork 263
Description
Unfortunately, we have one more problem with gstat output when use non-ascii names for created DB objects.
This occurs when all three conditions are met:
- custom schemas are created and tables are specified as belonged to these schemas;
- all names have approx. max allowed length (56 characters for schema and 63 for tables and 63 for indices);
- DB objects have character = UTF-8 and 3 or 4 bytes per character required for encoding in appropriate unicode range.
In that case gstat -r can not display full name of indices (maybe because total number of bytes for <schema>.<table>.<index> representation become close to 255 bytes ?).
What's worse is that it is NOT the last Unicode that is 'cutted off'.
Rather some part of it remains in the string, thus it can not be correctly decoded / displayed (see screens below).
Following example illustrates this (3 bytes per character are required for euro sign and for any letter from Georgian alphabet; 4 bytes per character needs to display musician sign 'treble clef' ( 𝄞 )and any of Dominoes (e.g. 🂉).
This is script for Linux:
set bail on;
set blob all;
set list on;
set names utf8;
shell rm -f /var/tmp/tmp4test.fdb;
create database 'localhost:/var/tmp/tmp4test.fdb' user 'sysdba' password 'masterkey' default character set utf8;
-- 2 bytes per char:
create schema "έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ";
-- 2 bytes per char:
create schema "МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр";
-- 3 bytes per char:
create schema "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€";
-- 3 bytes per char:
create schema "ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ";
commit;
-- 4 bytes per char:
create schema "𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞";
-- 4 bytes per char:
create schema "🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉";
commit;
set count on;
select
'>' || trim(rdb$schema_name) || '<' as sch_name
,char_length(trim(rdb$schema_name)) as char_len
,octet_length(trim(rdb$schema_name)) as octet_len
from rdb$schemas
where rdb$schema_name not in ('SYSTEM', 'PUBLIC')
;
set count off;
-- tables with schemas:
set term ^;
execute block as
declare v_sn varchar(8190) character set utf8;
begin
for
execute statement
q'#select trim(rdb$schema_name) sn from rdb$schemas where rdb$system_flag=0 and rdb$schema_name<>'PUBLIC'#'
into v_sn
do begin
execute statement 'create table "' || v_sn || '_pub"(id int primary key using index "' || v_sn || '_asc")';
execute statement 'create table "' || v_sn || '"."' || v_sn || '_sch"(id int primary key using descending index "' || v_sn || '_dec")';
end
end
^
set term ;^
commit;
set echo on;
show schema;
show table;
show index;
quit;
NOTE. We create 6 schemas but number of created tables is 2*6 = **12**: first table (from each pair) is created in the schema PUBLIC and second in the "long-named' custom schema.
Tables within PUBLIC schema have suffix ```_pub``` and PK which index name has suffix ```_asc```.
Tables within 'long-named' schemas have suffix ```_sch``` and PK based on descending index with suffix ```_dec```.
Output of this script will be following:
ISQL Version: LI-T6.0.0.1313 Firebird 6.0 7e32c33
Server version:
LI-T6.0.0.1313 Firebird 6.0 7e32c33
LI-T6.0.0.1313 Firebird 6.0 7e32c33/tcp (deb10build1)/P20:C
LI-T6.0.0.1313 Firebird 6.0 7e32c33/tcp (deb10build1)/P20:C
SCH_NAME >έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ<
CHAR_LEN 56
OCTET_LEN 112
SCH_NAME >МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр<
CHAR_LEN 56
OCTET_LEN 112
SCH_NAME >€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€<
CHAR_LEN 56
OCTET_LEN 168
SCH_NAME >ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ<
CHAR_LEN 56
OCTET_LEN 168
SCH_NAME >𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞<
CHAR_LEN 56
OCTET_LEN 224
SCH_NAME >🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉<
CHAR_LEN 56
OCTET_LEN 224
Records affected: 6
show schema;
PUBLIC
"έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ"
"МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр"
"ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ"
"€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"
"𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞"
"🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉"
show table;
PUBLIC."έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_pub"
PUBLIC."МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_pub"
PUBLIC."ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_pub"
PUBLIC."€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_pub"
PUBLIC."𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_pub"
PUBLIC."🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_pub"
"έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ"."έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_sch"
"МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр"."МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_sch"
"ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ"."ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_sch"
"€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"."€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_sch"
"𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞"."𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_sch"
"🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉"."🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_sch"
show index;
PUBLIC."έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_asc" UNIQUE INDEX ON "έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_pub"(ID)
PUBLIC."МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_asc" UNIQUE INDEX ON "МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_pub"(ID)
PUBLIC."ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_asc" UNIQUE INDEX ON "ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_pub"(ID)
PUBLIC."€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_asc" UNIQUE INDEX ON "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_pub"(ID)
PUBLIC."𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_asc" UNIQUE INDEX ON "𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_pub"(ID)
PUBLIC."🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_asc" UNIQUE INDEX ON "🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_pub"(ID)
"έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ"."έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_dec" UNIQUE DESCENDING INDEX ON "έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_sch"(ID)
"МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр"."МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_dec" UNIQUE DESCENDING INDEX ON "МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_sch"(ID)
"ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ"."ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_dec" UNIQUE DESCENDING INDEX ON "ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_sch"(ID)
"€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"."€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_dec" UNIQUE DESCENDING INDEX ON "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_sch"(ID)
"𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞"."𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_dec" UNIQUE DESCENDING INDEX ON "𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_sch"(ID)
"🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉"."🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_dec" UNIQUE DESCENDING INDEX ON "🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_sch"(ID)
quit;
Screen:


(so far - so good: all names are readable and not truncated).
Now let's run
gstat localhost:/var/tmp/tmp4test.fdb -r -user sysdba -pas masterkey 1>gstat-8773-long.txt 2>&1
-- and see in log.
It will contain truncated names of indices for cases when 3 or 4 bytes required to display unicode symbol.
These two screens are for names when 3 bytes per character are used:


And these two - when 4 bytes per character are used:


Checked on LI-T6.0.0.1313-7e32c33.
Similar result on Windows (checked 6.0.0.1312-2cac6fc):