@@ -535,13 +535,57 @@ func (p *Postgres) Drop() (err error) {
535
535
return & database.Error {OrigErr : err , Query : []byte (query )}
536
536
}
537
537
538
- if len (tableNames ) > 0 {
539
- // delete one by one ...
540
- for _ , t := range tableNames {
541
- query = `DROP TABLE IF EXISTS ` + quoteIdentifier (t ) + ` CASCADE`
542
- if _ , err := p .conn .ExecContext (context .Background (), query ); err != nil {
543
- return & database.Error {OrigErr : err , Query : []byte (query )}
544
- }
538
+ for _ , t := range tableNames {
539
+ query = `DROP TABLE IF EXISTS ` + quoteIdentifier (t ) + ` CASCADE`
540
+ if _ , err := p .conn .ExecContext (context .Background (), query ); err != nil {
541
+ return & database.Error {OrigErr : err , Query : []byte (query )}
542
+ }
543
+ }
544
+
545
+ // select all types
546
+ query = `
547
+ SELECT t.typname as type
548
+ FROM pg_type t
549
+ LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
550
+ WHERE (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid))
551
+ AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid)
552
+ AND n.nspname = current_schema()
553
+ `
554
+ types , err := p .conn .QueryContext (context .Background (), query )
555
+ if err != nil {
556
+ return & database.Error {OrigErr : err , Query : []byte (query )}
557
+ }
558
+ defer func () {
559
+ if errClose := types .Close (); errClose != nil {
560
+ err = multierror .Append (err , errClose )
561
+ }
562
+ }()
563
+
564
+ // delete one table after another
565
+ typeNames := make ([]string , 0 )
566
+ for types .Next () {
567
+ var typeName string
568
+ if err := types .Scan (& typeName ); err != nil {
569
+ return err
570
+ }
571
+
572
+ // do not drop lock table
573
+ if typeName == p .config .LockTable && p .config .LockStrategy == LockStrategyTable {
574
+ continue
575
+ }
576
+
577
+ if len (typeName ) > 0 {
578
+ typeNames = append (typeNames , typeName )
579
+ }
580
+ }
581
+ if err := types .Err (); err != nil {
582
+ return & database.Error {OrigErr : err , Query : []byte (query )}
583
+ }
584
+
585
+ for _ , t := range typeNames {
586
+ query = `DROP TYPE IF EXISTS ` + quoteIdentifier (t ) + ` CASCADE`
587
+ if _ , err := p .conn .ExecContext (context .Background (), query ); err != nil {
588
+ return & database.Error {OrigErr : err , Query : []byte (query )}
545
589
}
546
590
}
547
591
0 commit comments