Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

STANDARD-GENERIC-FUNCTION PGLOADER.CATALOG:FORMAT-TABLE-NAME : MS SQL missing FK table #1016

Closed
4 of 5 tasks
deem0n opened this issue Aug 27, 2019 · 6 comments
Closed
4 of 5 tasks

Comments

@deem0n
Copy link

deem0n commented Aug 27, 2019

  • pgloader --version
pgloader version "3.6.1"
compiled with SBCL 1.4.0-1.el7
load database
     from mssql://mssql/iam_storage
     into postgresql://localhost/mi

including only table names like 'DataSet_3_Periods' in schema 'dbo'

alter schema 'dbo' rename to '_dbo_3'

ALTER TABLE NAMES MATCHING 'DataSet_3_Periods' IN SCHEMA 'dbo' RENAME TO 'periods'

set work_mem to '16MB', maintenance_work_mem to '512 MB'
;

/*
before load do $$ drop schema if exists _dbo cascade; $$;
*/
  • pgloader output you obtain
pgloader version 3.6.1
compiled with SBCL 1.4.0-1.el7
sb-impl::*default-external-format* :UTF-8
tmpdir: #P"/tmp/pgloader/"
2019-08-27T21:29:06.022000+01:00 NOTICE Starting pgloader, log system is ready.
2019-08-27T21:29:06.053000+01:00 INFO Starting monitor
2019-08-27T21:29:06.061000+01:00 LOG pgloader version "3.6.1"
2019-08-27T21:29:06.071000+01:00 INFO Parsed command:
load database
     from mssql://mssql/iam_storage
     into postgresql://localhost/mi

including only table names like 'DataSet_3_Periods' in schema 'dbo'

alter schema 'dbo' rename to '_dbo_3'

ALTER TABLE NAMES MATCHING 'DataSet_3_Periods' IN SCHEMA 'dbo' RENAME TO 'periods'

set work_mem to '16MB', maintenance_work_mem to '512 MB'
;

/*
before load do $$ drop schema if exists _dbo cascade; $$;
*/

2019-08-27T21:29:06.167000+01:00 DEBUG CONNECTED TO #<PGLOADER.PGSQL:PGSQL-CONNECTION pgsql://localhost:5432/mi {1006574573}>
2019-08-27T21:29:06.167000+01:00 DEBUG SET client_encoding TO 'utf8'
2019-08-27T21:29:06.167000+01:00 DEBUG SET work_mem TO '16MB'
2019-08-27T21:29:06.167000+01:00 DEBUG SET maintenance_work_mem TO '512 MB'
2019-08-27T21:29:06.168000+01:00 DEBUG SET application_name TO 'pgloader'
2019-08-27T21:29:06.184000+01:00 LOG Migrating from #<MSSQL-CONNECTION mssql://mssql:1433/iam_storage {10065731B3}>
2019-08-27T21:29:06.184000+01:00 LOG Migrating into #<PGSQL-CONNECTION pgsql://localhost:5432/mi {1006574573}>
Max connections reached, increase value of TDS_MAX_CONN
2019-08-27T21:29:06.206000+01:00 SQL MSSQL: sending query: -- params: dbname
--         table-type-name
--         including
--         filter-list-to-where-clause including
--         excluding
--         filter-list-to-where-clause excluding
  select c.TABLE_SCHEMA,
         c.TABLE_NAME,
         c.COLUMN_NAME,
         c.DATA_TYPE,
         CASE
         WHEN c.COLUMN_DEFAULT LIKE '((%' AND c.COLUMN_DEFAULT LIKE '%))' THEN
             CASE
                 WHEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4) = 'newid()' THEN 'GENERATE_UUID'
                 WHEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4) LIKE 'convert(%varchar%,getdate(),%)' THEN 'today'
                 WHEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4) = 'getdate()' THEN 'CURRENT_TIMESTAMP'
                 WHEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4) LIKE '''%''' THEN SUBSTRING(c.COLUMN_DEFAULT,4,len(c.COLUMN_DEFAULT)-6)
                 ELSE SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4)
             END
         WHEN c.COLUMN_DEFAULT LIKE '(%' AND c.COLUMN_DEFAULT LIKE '%)' THEN
             CASE
                 WHEN SUBSTRING(c.COLUMN_DEFAULT,2,len(c.COLUMN_DEFAULT)-2) = 'newid()' THEN 'GENERATE_UUID'
                 WHEN SUBSTRING(c.COLUMN_DEFAULT,2,len(c.COLUMN_DEFAULT)-2) LIKE 'convert(%varchar%,getdate(),%)' THEN 'today'
                 WHEN SUBSTRING(c.COLUMN_DEFAULT,2,len(c.COLUMN_DEFAULT)-2) = 'getdate()' THEN 'CURRENT_TIMESTAMP'
                 WHEN SUBSTRING(c.COLUMN_DEFAULT,2,len(c.COLUMN_DEFAULT)-2) LIKE '''%''' THEN SUBSTRING(c.COLUMN_DEFAULT,3,len(c.COLUMN_DEFAULT)-4)
                 ELSE SUBSTRING(c.COLUMN_DEFAULT,2,len(c.COLUMN_DEFAULT)-2)
             END
         ELSE c.COLUMN_DEFAULT
         END,
         c.IS_NULLABLE,
         COLUMNPROPERTY(object_id(c.TABLE_NAME), c.COLUMN_NAME, 'IsIdentity'),
         c.CHARACTER_MAXIMUM_LENGTH,
         c.NUMERIC_PRECISION,
         c.NUMERIC_PRECISION_RADIX,
         c.NUMERIC_SCALE,
         c.DATETIME_PRECISION,
         c.CHARACTER_SET_NAME,
         c.COLLATION_NAME

    from INFORMATION_SCHEMA.COLUMNS c
         join INFORMATION_SCHEMA.TABLES t
              on c.TABLE_SCHEMA = t.TABLE_SCHEMA
             and c.TABLE_NAME = t.TABLE_NAME

   where     c.TABLE_CATALOG = 'iam_storage'
         and t.TABLE_TYPE = 'BASE TABLE'
         and ((c.table_schema = 'dbo' and c.table_name LIKE 'DataSet_3_Periods'))


order by c.table_schema, c.table_name, c.ordinal_position;
2019-08-27T21:29:06.237000+01:00 SQL MSSQL: sending query: -- params: including
--         filter-list-to-where-clause including
--         excluding
--         filter-list-to-where-clause excluding
    select schema_name(schema_id) as SchemaName,
           o.name as TableName,
           REPLACE(i.name, '.', '_') as IndexName,
           co.[name] as ColumnName,
           i.is_unique,
           i.is_primary_key,
           i.filter_definition

    from sys.indexes i
         join sys.objects o on i.object_id = o.object_id
         join sys.index_columns ic on ic.object_id = i.object_id
             and ic.index_id = i.index_id
         join sys.columns co on co.object_id = i.object_id
             and co.column_id = ic.column_id

   where schema_name(schema_id) not in ('dto', 'sys')
         and ((schema_name(schema_id) = 'dbo' and o.name LIKE 'DataSet_3_Periods'))


order by SchemaName,
         o.[name],
         i.[name],
         ic.is_included_column,
         ic.key_ordinal;
2019-08-27T21:29:06.254000+01:00 SQL MSSQL: sending query: -- params: dbname
--         including
--         filter-list-to-where-clause including
--         excluding
--         filter-list-to-where-clause excluding
   SELECT
           REPLACE(KCU1.CONSTRAINT_NAME, '.', '_') AS 'CONSTRAINT_NAME'
         , KCU1.TABLE_SCHEMA AS 'TABLE_SCHEMA'
         , KCU1.TABLE_NAME AS 'TABLE_NAME'
         , KCU1.COLUMN_NAME AS 'COLUMN_NAME'
         , KCU2.TABLE_SCHEMA AS 'UNIQUE_TABLE_SCHEMA'
         , KCU2.TABLE_NAME AS 'UNIQUE_TABLE_NAME'
         , KCU2.COLUMN_NAME AS 'UNIQUE_COLUMN_NAME'
         , RC.UPDATE_RULE AS 'UPDATE_RULE'
         , RC.DELETE_RULE AS 'DELETE_RULE'

    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
         JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU1
              ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG
                 AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA
                 AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
         JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU2
              ON KCU2.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG
                 AND KCU2.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA
                 AND KCU2.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME

   WHERE KCU1.ORDINAL_POSITION = KCU2.ORDINAL_POSITION
         AND KCU1.TABLE_CATALOG = 'iam_storage'
         AND KCU1.CONSTRAINT_CATALOG = 'iam_storage'
         AND KCU1.CONSTRAINT_SCHEMA NOT IN ('dto', 'sys')
         AND KCU1.TABLE_SCHEMA NOT IN ('dto', 'sys')
         AND KCU2.TABLE_SCHEMA NOT IN ('dto', 'sys')

         and ((kcu1.table_schema = 'dbo' and kcu1.table_name LIKE 'DataSet_3_Periods'))


ORDER BY KCU1.CONSTRAINT_NAME, KCU1.ORDINAL_POSITION;
2019-08-27T21:29:06.310000+01:00 INFO Processing source catalogs
2019-08-27T21:29:06.353000+01:00 NOTICE Prepare PostgreSQL database.
2019-08-27T21:29:06.367000+01:00 DEBUG CONNECTED TO #<PGLOADER.PGSQL:PGSQL-CONNECTION pgsql://localhost:5432/mi {1006574573}>
2019-08-27T21:29:06.367000+01:00 DEBUG SET client_encoding TO 'utf8'
2019-08-27T21:29:06.367000+01:00 DEBUG SET work_mem TO '16MB'
2019-08-27T21:29:06.368000+01:00 DEBUG SET maintenance_work_mem TO '512 MB'
2019-08-27T21:29:06.368000+01:00 DEBUG SET application_name TO 'pgloader'
2019-08-27T21:29:06.374000+01:00 DEBUG BEGIN
2019-08-27T21:29:06.431000+01:00 SQL DROP TABLE IF EXISTS _dbo_3.periods CASCADE;
2019-08-27T21:29:06.433000+01:00 SQL CREATE TABLE _dbo_3.periods
(
  periodcode      int not null,
  description     text not null,
  periodtype      int not null,
  periodbeginning timestamptz not null,
  qty             int not null
);
2019-08-27T21:29:06.442000+01:00 SQL -- params: table-names
select n, n::regclass::oid
  from (values ('_dbo_3.periods')) as t(n);

2019-08-27T21:29:06.487000+01:00 NOTICE COPY _dbo_3.periods
2019-08-27T21:29:06.487000+01:00 DEBUG Reader started for _dbo_3.periods
Max connections reached, increase value of TDS_MAX_CONN
2019-08-27T21:29:06.503000+01:00 DEBUG start _dbo_3.periods   497
2019-08-27T21:29:06.503000+01:00 INFO COPY ON ERROR STOP
2019-08-27T21:29:06.503000+01:00 DEBUG SELECT [PeriodCode], [Description], [PeriodType], convert(varchar, [PeriodBeginning], 126), [Qty] FROM [dbo].[DataSet_3_Periods];
2019-08-27T21:29:06.514000+01:00 DEBUG CONNECTED TO #<PGLOADER.PGSQL:PGSQL-CONNECTION pgsql://localhost:5432/mi {1006BEF333}>
2019-08-27T21:29:06.514000+01:00 DEBUG SET client_encoding TO 'utf8'
2019-08-27T21:29:06.514000+01:00 DEBUG SET work_mem TO '16MB'
2019-08-27T21:29:06.515000+01:00 DEBUG SET maintenance_work_mem TO '512 MB'
2019-08-27T21:29:06.515000+01:00 DEBUG SET application_name TO 'pgloader'
2019-08-27T21:29:06.516000+01:00 SQL SET search_path TO _dbo_3;
2019-08-27T21:29:06.516000+01:00 INFO pgsql:copy-rows-from-queue[1]: _dbo_3.periods NIL
2019-08-27T21:29:06.524000+01:00 DEBUG Reader for _dbo_3.periods is done in 0.037000s
2019-08-27T21:29:06.524000+01:00 DEBUG Finished processing READER for "_dbo_3.periods"  0.037000s
2019-08-27T21:29:06.598000+01:00 DEBUG  stop _dbo_3.periods   | 497 .. 608 = 0.111d0
2019-08-27T21:29:06.599000+01:00 DEBUG Writer[1] for _dbo_3.periods is done in 0.033000s
2019-08-27T21:29:06.599000+01:00 DEBUG Finished processing WRITER for "_dbo_3.periods"  0.033000s
2019-08-27T21:29:06.599000+01:00 DEBUG writers-counts[_dbo_3.periods] = 0
2019-08-27T21:29:06.599000+01:00 NOTICE DONE copying _dbo_3.periods
2019-08-27T21:29:06.599000+01:00 INFO Done with COPYing data, waiting for indexes
2019-08-27T21:29:06.616000+01:00 DEBUG CONNECTED TO #<PGLOADER.PGSQL:PGSQL-CONNECTION pgsql://localhost:5432/mi {10096B5B63}>
2019-08-27T21:29:06.616000+01:00 DEBUG SET client_encoding TO 'utf8'
2019-08-27T21:29:06.617000+01:00 DEBUG SET work_mem TO '16MB'
2019-08-27T21:29:06.617000+01:00 DEBUG SET maintenance_work_mem TO '512 MB'
2019-08-27T21:29:06.617000+01:00 DEBUG SET application_name TO 'pgloader'
2019-08-27T21:29:06.619000+01:00 NOTICE CREATE UNIQUE INDEX idx_104867_pk_dataset_3_periods ON _dbo_3.periods (periodcode);
2019-08-27T21:29:06.626000+01:00 INFO Done waiting for indexes
2019-08-27T21:29:06.641000+01:00 NOTICE Completing PostgreSQL database.
2019-08-27T21:29:06.641000+01:00 NOTICE Reset sequences
2019-08-27T21:29:06.654000+01:00 DEBUG CONNECTED TO #<PGLOADER.PGSQL:PGSQL-CONNECTION pgsql://localhost:5432/mi {100A95ADD3}>
2019-08-27T21:29:06.655000+01:00 DEBUG SET client_encoding TO 'utf8'
2019-08-27T21:29:06.655000+01:00 DEBUG SET work_mem TO '16MB'
2019-08-27T21:29:06.655000+01:00 DEBUG SET maintenance_work_mem TO '512 MB'
2019-08-27T21:29:06.655000+01:00 DEBUG SET application_name TO 'pgloader'
2019-08-27T21:29:06.656000+01:00 DEBUG SET client_encoding TO 'utf8'
2019-08-27T21:29:06.656000+01:00 DEBUG SET work_mem TO '16MB'
2019-08-27T21:29:06.657000+01:00 DEBUG SET maintenance_work_mem TO '512 MB'
2019-08-27T21:29:06.657000+01:00 DEBUG SET application_name TO 'pgloader'
2019-08-27T21:29:06.837000+01:00 DEBUG CONNECTED TO #<PGLOADER.PGSQL:PGSQL-CONNECTION pgsql://localhost:5432/mi {100A981E43}>
2019-08-27T21:29:06.837000+01:00 DEBUG SET client_encoding TO 'utf8'
2019-08-27T21:29:06.838000+01:00 DEBUG SET work_mem TO '16MB'
2019-08-27T21:29:06.838000+01:00 DEBUG SET maintenance_work_mem TO '512 MB'
2019-08-27T21:29:06.838000+01:00 DEBUG SET application_name TO 'pgloader'
2019-08-27T21:29:06.840000+01:00 DEBUG BEGIN
2019-08-27T21:29:06.840000+01:00 NOTICE ALTER TABLE _dbo_3.periods ADD PRIMARY KEY USING INDEX idx_104867_pk_dataset_3_periods;
KABOOM!
FATAL error: There is no applicable method for the generic function
               #<STANDARD-GENERIC-FUNCTION PGLOADER.CATALOG:FORMAT-TABLE-NAME (1)>
             when called with arguments
               (NIL).
Date/time: 2019-08-27-23:29An unhandled error condition has been signalled:
                              There is no applicable method for the generic function
                                #<STANDARD-GENERIC-FUNCTION PGLOADER.CATALOG:FORMAT-TABLE-NAME (1)>
                              when called with arguments
                                (NIL).


Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {100557E543}>
0: (TRIVIAL-BACKTRACE:PRINT-BACKTRACE-TO-STREAM #<SB-IMPL::STRING-OUTPUT-STREAM {100A9BC903}>)
1: (TRIVIAL-BACKTRACE:PRINT-BACKTRACE #<SIMPLE-ERROR "~@<There is no applicable method for the generic function ~2I~_~S~
          ~I~_when called with arguments ~2I~_~S.~:>" {100A9BC7A3}> :OUTPUT NIL :IF-EXISTS :APPEND :VERBOSE NIL)
2: ((FLET "H0" :IN PGLOADER::MAIN) #<SIMPLE-ERROR "~@<There is no applicable method for the generic function ~2I~_~S~
          ~I~_when called with arguments ~2I~_~S.~:>" {100A9BC7A3}>)
3: (SB-KERNEL::%SIGNAL #<SIMPLE-ERROR "~@<There is no applicable method for the generic function ~2I~_~S~
          ~I~_when called with arguments ~2I~_~S.~:>" {100A9BC7A3}>)
4: (ERROR #<SIMPLE-BASE-STRING "~@<There is no applicable method for the generic f..." (len=119) {1001CFE89F}> #<STANDARD-GENERIC-FUNCTION PGLOADER.CATALOG:FORMAT-TABLE-NAME (1)> (NIL))
5: ((:METHOD NO-APPLICABLE-METHOD (T)) #<STANDARD-GENERIC-FUNCTION PGLOADER.CATALOG:FORMAT-TABLE-NAME (1)> NIL) [fast-method]
6: (SB-PCL::CALL-NO-APPLICABLE-METHOD #<STANDARD-GENERIC-FUNCTION PGLOADER.CATALOG:FORMAT-TABLE-NAME (1)> (NIL))
7: ((:METHOD PGLOADER.CATALOG:FORMAT-CREATE-SQL (PGLOADER.CATALOG:FKEY)) #1=#S(PGLOADER.CATALOG:FKEY :NAME "FK_DataSet_3_Periods_nsi_PeriodTypes" :OID NIL :TABLE #2=#S(PGLOADER.CATALOG:TABLE :SOURCE-NAME #3="DataSet_3_Periods" :NAME "periods" :SCHEMA #4=#S(PGLOADER.CATALOG:SCHEMA :SOURCE-NAME #5="dbo" :NAME "_dbo_3" :CATALOG #S(PGLOADER.CATALOG:CATALOG :NAME "iam_storage" :SCHEMA-LIST (#4#) :TYPES-WITHOUT-BTREE (("aclitem" . "hash") ("box" . "gist") ("cid" . "hash") ("cidr" . "gist") ("circle" . "gist") ("point" . "gist") ("polygon" . "gist") ("varchar" . "gin") ("xid" . "hash")) :DISTRIBUTION-RULES NIL) :IN-SEARCH-PATH NIL :TABLE-LIST (#2#) :VIEW-LIST NIL :EXTENSION-LIST NIL :SQLTYPE-LIST NIL) :OID 104867 :COMMENT NIL :STORAGE-PARAMETER-LIST NIL :TABLESPACE NIL :FIELD-LIST (#S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA #5# :TABLE-NAME #3# :NAME "PeriodCode" :TYPE #6="int" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION 10 :NUMERIC-PRECISION-RADIX 10 :NUMERIC-SCALE 0 :DATETIME-PRECISION NIL :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL) #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "Description" :TYPE "nvarchar" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH 100 :NUMERIC-PRECISION NIL :NUMERIC-PRECISION-RADIX NIL :NUMERIC-SCALE NIL :DATETIME-PRECISION NIL :CHARACTER-SET-NAME "UNICODE" :COLLATION-NAME "Cyrillic_General_CI_AS") #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "PeriodType" :TYPE #7="int" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION 10 :NUMERIC-PRECISION-RADIX 10 :NUMERIC-SCALE 0 :DATETIME-PRECISION NIL :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL) #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "PeriodBeginning" :TYPE "datetime" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION NIL :NUMERIC-PRECISION-RADIX NIL :NUMERIC-SCALE NIL :DATETIME-PRECISION 3 :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL) #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "Qty" :TYPE #8="int" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION 10 :NUMERIC-PRECISION-RADIX 10 :NUMERIC-SCALE 0 :DATETIME-PRECISION NIL :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL)) :COLUMN-LIST (#S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "periodcode" :TYPE-NAME #6# :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9=#<FUNCTION (LAMBDA (PGLOADER.SOURCE.MSSQL::VAL) :IN PGLOADER.CATALOG:CAST) {23123B6B}> :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "description" :TYPE-NAME "text" :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "periodtype" :TYPE-NAME #7# :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "periodbeginning" :TYPE-NAME "timestamptz" :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "qty" :TYPE-NAME #8# :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T)) :INDEX-LIST (#S(PGLOADER.CATALOG:INDEX :NAME "PK_DataSet_3_Periods" :OID NIL :SCHEMA #4# :TABLE #2# :TYPE NIL :PRIMARY T :UNIQUE T :COLUMNS ("periodcode") :SQL NIL :CONNAME NIL :CONDEF NIL :FILTER NIL :FK-DEPS NIL)) :FKEY-LIST (#1#) :TRIGGER-LIST NIL :CITUS-RULE NIL) :COLUMNS ("PeriodType") :PKEY NIL :FOREIGN-TABLE NIL :FOREIGN-COLUMNS ("PeriodType") :CONDEF NIL :UPDATE-RULE "NO ACTION" :DELETE-RULE "NO ACTION" :MATCH-RULE NIL :DEFERRABLE NIL :INITIALLY-DEFERRED NIL) :STREAM NIL :IF-NOT-EXISTS #<unused argument>) [fast-method]
8: (PGLOADER.PGSQL:CREATE-PGSQL-FKEYS #1=#S(PGLOADER.CATALOG:CATALOG :NAME "iam_storage" :SCHEMA-LIST (#2=#S(PGLOADER.CATALOG:SCHEMA :SOURCE-NAME #3="dbo" :NAME "_dbo_3" :CATALOG #1# :IN-SEARCH-PATH NIL :TABLE-LIST (#4=#S(PGLOADER.CATALOG:TABLE :SOURCE-NAME #5="DataSet_3_Periods" :NAME "periods" :SCHEMA #2# :OID 104867 :COMMENT NIL :STORAGE-PARAMETER-LIST NIL :TABLESPACE NIL :FIELD-LIST (#S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA #3# :TABLE-NAME #5# :NAME "PeriodCode" :TYPE #6="int" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION 10 :NUMERIC-PRECISION-RADIX 10 :NUMERIC-SCALE 0 :DATETIME-PRECISION NIL :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL) #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "Description" :TYPE "nvarchar" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH 100 :NUMERIC-PRECISION NIL :NUMERIC-PRECISION-RADIX NIL :NUMERIC-SCALE NIL :DATETIME-PRECISION NIL :CHARACTER-SET-NAME "UNICODE" :COLLATION-NAME "Cyrillic_General_CI_AS") #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "PeriodType" :TYPE #7="int" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION 10 :NUMERIC-PRECISION-RADIX 10 :NUMERIC-SCALE 0 :DATETIME-PRECISION NIL :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL) #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "PeriodBeginning" :TYPE "datetime" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION NIL :NUMERIC-PRECISION-RADIX NIL :NUMERIC-SCALE NIL :DATETIME-PRECISION 3 :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL) #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "Qty" :TYPE #8="int" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION 10 :NUMERIC-PRECISION-RADIX 10 :NUMERIC-SCALE 0 :DATETIME-PRECISION NIL :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL)) :COLUMN-LIST (#S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "periodcode" :TYPE-NAME #6# :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9=#<FUNCTION (LAMBDA (PGLOADER.SOURCE.MSSQL::VAL) :IN PGLOADER.CATALOG:CAST) {23123B6B}> :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "description" :TYPE-NAME "text" :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "periodtype" :TYPE-NAME #7# :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "periodbeginning" :TYPE-NAME "timestamptz" :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "qty" :TYPE-NAME #8# :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T)) :INDEX-LIST (#S(PGLOADER.CATALOG:INDEX :NAME "PK_DataSet_3_Periods" :OID NIL :SCHEMA #2# :TABLE #4# :TYPE NIL :PRIMARY T :UNIQUE T :COLUMNS ("periodcode") :SQL NIL :CONNAME NIL :CONDEF NIL :FILTER NIL :FK-DEPS NIL)) :FKEY-LIST (#S(PGLOADER.CATALOG:FKEY :NAME "FK_DataSet_3_Periods_nsi_PeriodTypes" :OID NIL :TABLE #4# :COLUMNS ("PeriodType") :PKEY NIL :FOREIGN-TABLE NIL :FOREIGN-COLUMNS ("PeriodType") :CONDEF NIL :UPDATE-RULE "NO ACTION" :DELETE-RULE "NO ACTION" :MATCH-RULE NIL :DEFERRABLE NIL :INITIALLY-DEFERRED NIL)) :TRIGGER-LIST NIL :CITUS-RULE NIL)) :VIEW-LIST NIL :EXTENSION-LIST NIL :SQLTYPE-LIST NIL)) :TYPES-WITHOUT-BTREE (("aclitem" . "hash") ("box" . "gist") ("cid" . "hash") ("cidr" . "gist") ("circle" . "gist") ("point" . "gist") ("polygon" . "gist") ("varchar" . "gin") ("xid" . "hash")) :DISTRIBUTION-RULES NIL) :SECTION :POST :LABEL "Create Foreign Keys" :LOG-LEVEL :NOTICE)
9: ((LAMBDA (#:|anonymous-transaction32|) :IN PGLOADER.LOAD:COMPLETE-PGSQL-DATABASE) #<unused argument>)
10: (POSTMODERN::CALL-WITH-TRANSACTION #<CLOSURE (LAMBDA (#:|anonymous-transaction32|) :IN PGLOADER.LOAD:COMPLETE-PGSQL-DATABASE) {100A9934AB}> NIL)
11: ((:METHOD PGLOADER.LOAD:COMPLETE-PGSQL-DATABASE (PGLOADER.SOURCES:DB-COPY PGLOADER.CATALOG:CATALOG T)) #<PGLOADER.SOURCE.MSSQL:COPY-MSSQL {1006DA2F03}> #1=#S(PGLOADER.CATALOG:CATALOG :NAME "iam_storage" :SCHEMA-LIST (#2=#S(PGLOADER.CATALOG:SCHEMA :SOURCE-NAME #3="dbo" :NAME "_dbo_3" :CATALOG #1# :IN-SEARCH-PATH NIL :TABLE-LIST (#4=#S(PGLOADER.CATALOG:TABLE :SOURCE-NAME #5="DataSet_3_Periods" :NAME "periods" :SCHEMA #2# :OID 104867 :COMMENT NIL :STORAGE-PARAMETER-LIST NIL :TABLESPACE NIL :FIELD-LIST (#S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA #3# :TABLE-NAME #5# :NAME "PeriodCode" :TYPE #6="int" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION 10 :NUMERIC-PRECISION-RADIX 10 :NUMERIC-SCALE 0 :DATETIME-PRECISION NIL :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL) #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "Description" :TYPE "nvarchar" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH 100 :NUMERIC-PRECISION NIL :NUMERIC-PRECISION-RADIX NIL :NUMERIC-SCALE NIL :DATETIME-PRECISION NIL :CHARACTER-SET-NAME "UNICODE" :COLLATION-NAME "Cyrillic_General_CI_AS") #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "PeriodType" :TYPE #7="int" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION 10 :NUMERIC-PRECISION-RADIX 10 :NUMERIC-SCALE 0 :DATETIME-PRECISION NIL :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL) #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "PeriodBeginning" :TYPE "datetime" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION NIL :NUMERIC-PRECISION-RADIX NIL :NUMERIC-SCALE NIL :DATETIME-PRECISION 3 :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL) #S(PGLOADER.SOURCE.MSSQL::MSSQL-COLUMN :SCHEMA "dbo" :TABLE-NAME "DataSet_3_Periods" :NAME "Qty" :TYPE #8="int" :DEFAULT NIL :NULLABLE "NO" :IDENTITY NIL :CHARACTER-MAXIMUM-LENGTH NIL :NUMERIC-PRECISION 10 :NUMERIC-PRECISION-RADIX 10 :NUMERIC-SCALE 0 :DATETIME-PRECISION NIL :CHARACTER-SET-NAME NIL :COLLATION-NAME NIL)) :COLUMN-LIST (#S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "periodcode" :TYPE-NAME #6# :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9=#<FUNCTION (LAMBDA (PGLOADER.SOURCE.MSSQL::VAL) :IN PGLOADER.CATALOG:CAST) {23123B6B}> :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "description" :TYPE-NAME "text" :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "periodtype" :TYPE-NAME #7# :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "periodbeginning" :TYPE-NAME "timestamptz" :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T) #S(PGLOADER.CATALOG:COLUMN :TABLE NIL :NAME "qty" :TYPE-NAME #8# :TYPE-MOD NIL :NULLABLE NIL :DEFAULT NIL :COMMENT NIL :TRANSFORM #9# :EXTRA NIL :TRANSFORM-DEFAULT T)) :INDEX-LIST (#S(PGLOADER.CATALOG:INDEX :NAME "PK_DataSet_3_Periods" :OID NIL :SCHEMA #2# :TABLE #4# :TYPE NIL :PRIMARY T :UNIQUE T :COLUMNS ("periodcode") :SQL NIL :CONNAME NIL :CONDEF NIL :FILTER NIL :FK-DEPS NIL)) :FKEY-LIST (#S(PGLOADER.CATALOG:FKEY :NAME "FK_DataSet_3_Periods_nsi_PeriodTypes" :OID NIL :TABLE #4# :COLUMNS ("PeriodType") :PKEY NIL :FOREIGN-TABLE NIL :FOREIGN-COLUMNS ("PeriodType") :CONDEF NIL :UPDATE-RULE "NO ACTION" :DELETE-RULE "NO ACTION" :MATCH-RULE NIL :DEFERRABLE NIL :INITIALLY-DEFERRED NIL)) :TRIGGER-LIST NIL :CITUS-RULE NIL)) :VIEW-LIST NIL :EXTENSION-LIST NIL :SQLTYPE-LIST NIL)) :TYPES-WITHOUT-BTREE (("aclitem" . "hash") ("box" . "gist") ("cid" . "hash") ("cidr" . "gist") ("circle" . "gist") ("point" . "gist") ("polygon" . "gist") ("varchar" . "gin") ("xid" . "hash")) :DISTRIBUTION-RULES NIL) ("ALTER TABLE _dbo_3.periods ADD PRIMARY KEY USING INDEX idx_104867_pk_dataset_3_periods;") :FOREIGN-KEYS T :CREATE-INDEXES T :CREATE-TRIGGERS T :RESET-SEQUENCES T) [fast-method]
12: ((:METHOD PGLOADER.LOAD:COPY-DATABASE (PGLOADER.SOURCES:DB-COPY)) #<PGLOADER.SOURCE.MSSQL:COPY-MSSQL {1006DA2F03}> :ON-ERROR-STOP T :WORKER-COUNT 4 :CONCURRENCY 1 :MULTIPLE-READERS NIL :MAX-PARALLEL-CREATE-INDEX NIL :TRUNCATE NIL :DISABLE-TRIGGERS NIL :DATA-ONLY NIL :SCHEMA-ONLY NIL :CREATE-SCHEMAS T :CREATE-TABLES T :INCLUDE-DROP T :DROP-SCHEMA NIL :CREATE-INDEXES T :INDEX-NAMES :UNIQUIFY :RESET-SEQUENCES T :FOREIGN-KEYS T :REINDEX NIL :AFTER-SCHEMA NIL :DISTRIBUTE NIL :ONLY-TABLES NIL :INCLUDING (("dbo" "DataSet_3_Periods")) :EXCLUDING NIL :SET-TABLE-OIDS T :ALTER-TABLE ((#S(PGLOADER.CATALOG:MATCH-RULE :RULE #S(PGLOADER.CATALOG:STRING-MATCH-RULE :TARGET "DataSet_3_Periods") :SCHEMA "dbo" :ACTION #<FUNCTION PGLOADER.CATALOG::ALTER-TABLE-RENAME> :ARGS ("periods")))) :ALTER-SCHEMA ((#S(PGLOADER.CATALOG:MATCH-RULE :RULE #S(PGLOADER.CATALOG:STRING-MATCH-RULE :TARGET "dbo") :SCHEMA NIL :ACTION #<FUNCTION PGLOADER.CATALOG::ALTER-SCHEMA-RENAME> :ARGS ("_dbo_3")))) :MATERIALIZE-VIEWS NIL) [fast-method]
13: ((LAMBDA ()))
14: (PGLOADER:RUN-COMMANDS #P"/data/prefect/etl/3.load" :START-LOGGER NIL :FLUSH-SUMMARY T :SUMMARY NIL :LOG-FILENAME NIL :LOG-MIN-MESSAGES NIL :CLIENT-MIN-MESSAGES NIL)
15: (PGLOADER::PROCESS-COMMAND-FILE ("3.load") :FLUSH-SUMMARY T)
16: (PGLOADER.MONITOR::CALL-WITH-MONITOR #<CLOSURE (LAMBDA NIL :IN PGLOADER::MAIN) {10055AC19B}>)
17: (PGLOADER::MAIN ("pgloader" "--debug" "3.load"))
18: ((LAMBDA NIL :IN "/home/pgsql/rpm11/BUILD/pgloader-bundle-3.6.1/dumper-2SKVI5f7.lisp"))
19: ((FLET "WITHOUT-INTERRUPTS-BODY-35" :IN SAVE-LISP-AND-DIE))
20: ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE))



2019-08-27T21:29:06.850000+01:00 INFO Stopping monitor

What I am doing here?

There is no applicable method for the generic function
  #<STANDARD-GENERIC-FUNCTION PGLOADER.CATALOG:FORMAT-TABLE-NAME (1)>
when called with arguments
  (NIL).

Actually, I think it is the same bug as #681
Once I added missed table dir_PeriodTypes mentioned in the debug mess, everything works without any errors.

load database
     from mssql://mssql/iam_storage
     into postgresql://localhost/mi

including only table names like 'dir_PeriodTypes' in schema 'dbo'
including only table names like 'DataSet_3_Periods' in schema 'dbo'

alter schema 'dbo' rename to '_dbo_3'

ALTER TABLE NAMES MATCHING 'DataSet_3_Periods' IN SCHEMA 'dbo' RENAME TO 'periods'

set work_mem to '16MB', maintenance_work_mem to '512 MB'
;
@auspex
Copy link

auspex commented Dec 3, 2019

OK, I don't see where dir_PeriodTypes was mentioned in your DEBUG, but you put me on the right track, thank you! I'd been trying to copy just a single table (that I thought was standalone). Your fix made me check, and realize it was dependent on a second table

@deem0n
Copy link
Author

deem0n commented Dec 4, 2019

My point was that my first run was without dir_PeriodTypes in the config, and it did not work. The DEBUG is for that case. My expectation was that pgloader would detect the FK connected tables and include them automagically.

If I include dir_PeriodTypes into config it worked fine, but not very convenient ;-)

Hope you will do the right thing!

@auspex
Copy link

auspex commented Dec 5, 2019 via email

dimitri added a commit that referenced this issue Feb 12, 2020
… out.

See #1016 where we try to build the DDL for a foreign key that references
tables that are not found in our catalogs. We should probably just ignore
those foreign keys, as we might have a partial load to implement.
@dimitri
Copy link
Owner

dimitri commented Feb 12, 2020

I have attached an attempt at bug fixing this situation, from my understanding of it reading this issue. Thanks for the detailed output and the solution you implemented. If you can try again and validate that the bug has been addressed, that would be nice. Thanks.

@dimitri dimitri closed this as completed Feb 12, 2020
@deem0n
Copy link
Author

deem0n commented Feb 25, 2020

Thanks dimitri!
I am trying to verify your patch, but have trouble building from master:

To load "pgloader":
  Load 1 ASDF system:
    pgloader
; Loading "pgloader"
[package pgloader.params].........................
[package pgloader.transforms].....................
[package pgloader.logs]...........................
[package pgloader.quoting]........................
[package pgloader.catalog]........................
[package pgloader.state]..........................
[package pgloader.monitor]........................
[package pgloader.queries]........................
[package pgloader.citus]..........................
[package pgloader.utils]..........................
[package pgloader.archive]........................
[package pgloader.parse-date].....................
[package pgloader.connection].....................
[package pgloader.pgsql]..........................
[package pgloader.sources]
debugger invoked on a NAME-CONFLICT in thread
#<THREAD "main thread" RUNNING {100194F193}>:
  EXPORT PGLOADER.SOURCES::GET-COLUMN-LIST causes name-conflicts in
  #<PACKAGE "PGLOADER.SOURCE.MSSQL"> between the following symbols:
    PGLOADER.SOURCES::GET-COLUMN-LIST, PGLOADER.SOURCE.MSSQL::GET-COLUMN-LIST
See also:
  The ANSI Standard, Section 11.1.1.2.5

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [KEEP-OLD                     ] Keep PGLOADER.SOURCE.MSSQL::GET-COLUMN-LIST accessible in PGLOADER.SOURCE.MSSQL (shadowing PGLOADER.SOURCES::GET-COLUMN-LIST).
  1: [TAKE-NEW                     ] Make PGLOADER.SOURCES::GET-COLUMN-LIST accessible in PGLOADER.SOURCE.MSSQL (uninterning PGLOADER.SOURCE.MSSQL::GET-COLUMN-LIST).
  2: [RESOLVE-CONFLICT             ] Resolve conflict.
  3: [RETRY                        ] Retry
                                     compiling #<CL-SOURCE-FILE "pgloader" "src" "package">.
  4: [ACCEPT                       ] Continue, treating
                                     compiling #<CL-SOURCE-FILE "pgloader" "src" "package">
                                     as having been successful.
  5:                                 Retry ASDF operation.
  6: [CLEAR-CONFIGURATION-AND-RETRY] Retry ASDF operation after resetting the
                                     configuration.
  7: [ABORT                        ] Give up on "pgloader"
  8: [CONTINUE                     ] Ignore runtime option --eval "(ql:quickload \"pgloader\")".
  9:                                 Skip rest of --eval and --load options.
 10:                                 Skip to toplevel READ/EVAL/PRINT loop.
 11: [EXIT                         ] Exit SBCL (calling #'EXIT, killing the process).

(NAME-CONFLICT #<PACKAGE "PGLOADER.SOURCE.MSSQL"> EXPORT PGLOADER.SOURCES::GET-COLUMN-LIST PGLOADER.SOURCES::GET-COLUMN-LIST PGLOADER.SOURCE.MSSQL::GET-COLUMN-LIST)
0]

Any advise?

@deem0n
Copy link
Author

deem0n commented Feb 25, 2020

Actually I tried to fix the problem giving answers almost randomly and finally got pgloader compiled. I can confirm that your fix is working fine with my config:

including only table names like 'DataSet_3_Periods' in schema 'dbo'

alter schema 'dbo' rename to '_dbo_3'

ALTER TABLE NAMES MATCHING 'DataSet_3_Periods' IN SCHEMA 'dbo' RENAME TO 'periods'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants