Browse Source

fcl-db: sqlDB: add more informations to schema query for table columns (SchemaType=stColumns)
(Values for COLUMN_DATATYPE are not compatible across TSQLConnections, but are proprietary)

git-svn-id: trunk@25721 -

lacak 12 years ago
parent
commit
3c0386ca19

+ 19 - 15
packages/fcl-db/src/sqldb/interbase/ibconnection.pp

@@ -1351,26 +1351,30 @@ begin
                           'rdb$procedures '+
                         'WHERE '+
                           '(rdb$system_flag = 0 or rdb$system_flag is null)';
-    stColumns    : s := 'select '+
-                           'rdb$field_id            as recno, '+
+
+    stColumns    : s := 'SELECT '+
+                          'rdb$field_id             as recno, '+
                           '''' + DatabaseName + ''' as catalog_name, '+
                           '''''                     as schema_name, '+
                           'rdb$relation_name        as table_name, '+
-                          'rdb$field_name           as column_name, '+
-                          'rdb$field_position       as column_position, '+
+                          'r.rdb$field_name         as column_name, '+
+                          'rdb$field_position+1     as column_position, '+
                           '0                        as column_type, '+
-                          '0                        as column_datatype, '+
-                          '''''                     as column_typename, '+
-                          '0                        as column_subtype, '+
-                          '0                        as column_precision, '+
-                          '0                        as column_scale, '+
-                          '0                        as column_length, '+
-                          '0                        as column_nullable '+
-                        'from '+
-                          'rdb$relation_fields '+
+                          'rdb$field_type           as column_datatype, '+
+                          'rdb$type_name            as column_typename, '+
+                          'rdb$field_sub_type       as column_subtype, '+
+                          'rdb$field_precision      as column_precision, '+
+                          '-rdb$field_scale         as column_scale, '+
+                          'rdb$field_length         as column_length, '+
+                          'case r.rdb$null_flag when 1 then 0 else 1 end as column_nullable '+
+                        'FROM '+
+                          'rdb$relation_fields r '+
+                            'JOIN rdb$fields f ON r.rdb$field_source=f.rdb$field_name '+
+                            'JOIN rdb$types t ON f.rdb$field_type=t.rdb$type AND t.rdb$field_name=''RDB$FIELD_TYPE'' '+
                         'WHERE '+
-                          '(rdb$system_flag = 0 or rdb$system_flag is null) and (rdb$relation_name = ''' + Uppercase(SchemaObjectName) + ''') ' +
-                        'order by rdb$field_name';
+                          '(r.rdb$system_flag = 0 or r.rdb$system_flag is null) and (rdb$relation_name = ''' + Uppercase(SchemaObjectName) + ''') ' +
+                        'ORDER BY '+
+                          'r.rdb$field_name';
   else
     DatabaseError(SMetadataUnavailable)
   end; {case}

+ 12 - 2
packages/fcl-db/src/sqldb/mssql/mssqlconn.pp

@@ -944,12 +944,22 @@ const SCHEMA_QUERY='select id as RECNO, db_name() as CATALOG_NAME, user_name(uid
                    'where type in (%s) '+
                    'order by name';
 begin
+  // for simplicity are used only system tables and columns, common to both MS SQL Server and Sybase
   case SchemaType of
     stTables     : Result := format(SCHEMA_QUERY, ['TABLE_NAME, 1 as TABLE_TYPE', '''U''']);
     stSysTables  : Result := format(SCHEMA_QUERY, ['TABLE_NAME, 4 as TABLE_TYPE', '''S''']);
     stProcedures : Result := format(SCHEMA_QUERY, ['PROC_NAME , case type when ''P'' then 1 else 2 end as PROC_TYPE', '''P'',''FN'',''IF'',''TF''']);
-    stColumns    : Result := 'select colid as RECNO, db_name() as CATALOG_NAME, user_name(uid) as SCHEMA_NAME, o.name as TABLE_NAME, c.name as COLUMN_NAME,'+
-                                    'colid as COLUMN_POSITION, prec as COLUMN_PRECISION, scale as COLUMN_SCALE, length as COLUMN_LENGTH, case when c.status&8=8 then 1 else 0 end as COLUMN_NULLABLE '+
+    stColumns    : Result := 'select colid as RECNO, db_name() as CATALOG_NAME, user_name(uid) as SCHEMA_NAME, o.name as TABLE_NAME,'+
+                                    'c.name   as COLUMN_NAME,'+
+                                    'colid    as COLUMN_POSITION,'+
+                                    '0        as COLUMN_TYPE,'+
+                                    'c.type   as COLUMN_DATATYPE,'+
+                                    '''''     as COLUMN_TYPENAME,'+
+                                    'usertype as COLUMN_SUBTYPE,'+
+                                    'prec     as COLUMN_PRECISION,'+
+                                    'scale    as COLUMN_SCALE,'+
+                                    'length   as COLUMN_LENGTH,'+
+                                    'case when c.status&8=8 then 1 else 0 end as COLUMN_NULLABLE '+
                              'from syscolumns c join sysobjects o on c.id=o.id '+
                              'where c.id=object_id(''' + SchemaObjectName + ''') '+
                              'order by colid';

+ 5 - 3
packages/fcl-db/src/sqldb/postgres/pqconnection.pp

@@ -1263,16 +1263,17 @@ begin
                           'left join pg_namespace n on c.relnamespace=n.oid '+
                         'where (relkind=''r'') and nspname in ((''pg_catalog'',''information_schema'')) ' + // only system tables
                         'order by relname';
+
     stColumns    : s := 'select '+
                           'a.attnum           as recno, '+
                           'current_database() as catalog_name, '+
                           'nspname            as schema_name, '+
                           'c.relname          as table_name, '+
                           'a.attname          as column_name, '+
-                          '0                  as column_position, '+
+                          'a.attnum           as column_position, '+
                           '0                  as column_type, '+
-                          '0                  as column_datatype, '+
-                          '''''               as column_typename, '+
+                          'a.atttypid         as column_datatype, '+
+                          't.typname          as column_typename, '+
                           '0                  as column_subtype, '+
                           '0                  as column_precision, '+
                           '0                  as column_scale, '+
@@ -1280,6 +1281,7 @@ begin
                           'not a.attnotnull   as column_nullable '+
                         'from pg_class c '+
                           'join pg_attribute a on c.oid=a.attrelid '+
+                          'join pg_type t on t.oid=a.atttypid '+
                           'left join pg_namespace n on c.relnamespace=n.oid '+
                           // This can lead to problems when case-sensitive tablenames are used.
                         'where (a.attnum>0) and (not a.attisdropped) and (upper(c.relname)=''' + Uppercase(SchemaObjectName) + ''') '+