@@ -130,16 +130,17 @@ func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt) ([
130130 case node .GetTransactionStmt () != nil :
131131 statements [i ] = NOOP_QUERY_TREE .Stmts [0 ]
132132
133- // CREATE MATERIALIZED VIEW
133+ // CREATE MATERIALIZED VIEW [IF NOT EXISTS] AS ... [WITH NO DATA]
134134 case node .GetCreateTableAsStmt () != nil :
135135 err := remapper .createMaterializedView (node )
136136 if err != nil {
137137 return nil , err
138138 }
139139 statements [i ] = NOOP_QUERY_TREE .Stmts [0 ]
140140
141- // DROP MATERIALIZED VIEW
142- case node .GetDropStmt () != nil && node .GetDropStmt ().RemoveType == pgQuery .ObjectType_OBJECT_MATVIEW :
141+ // DROP MATERIALIZED VIEW [IF EXISTS]
142+ case node .GetDropStmt () != nil &&
143+ (node .GetDropStmt ().RemoveType == pgQuery .ObjectType_OBJECT_TABLE || node .GetDropStmt ().RemoveType == pgQuery .ObjectType_OBJECT_MATVIEW ):
143144 err := remapper .dropMaterializedViewFromNode (node )
144145 if err != nil {
145146 return nil , err
@@ -154,6 +155,15 @@ func (remapper *QueryRemapper) remapStatements(statements []*pgQuery.RawStmt) ([
154155 }
155156 statements [i ] = NOOP_QUERY_TREE .Stmts [0 ]
156157
158+ // ALTER TABLE [IF EXISTS] ... RENAME TO ...
159+ case node .GetRenameStmt () != nil &&
160+ (node .GetRenameStmt ().RenameType == pgQuery .ObjectType_OBJECT_TABLE || node .GetRenameStmt ().RenameType == pgQuery .ObjectType_OBJECT_MATVIEW ):
161+ err := remapper .renameMaterializedViewFromNode (node )
162+ if err != nil {
163+ return nil , err
164+ }
165+ statements [i ] = NOOP_QUERY_TREE .Stmts [0 ]
166+
157167 // Unsupported query
158168 default :
159169 common .LogDebug (remapper .config .CommonConfig , "Query tree:" , stmt , node )
@@ -554,8 +564,10 @@ func (remapper *QueryRemapper) createMaterializedView(node *pgQuery.Node) error
554564 return fmt .Errorf ("couldn't read definition of CREATE MATERIALIZED VIEW: %w" , err )
555565 }
556566
567+ ifNotExists := node .GetCreateTableAsStmt ().IfNotExists
568+
557569 // Store the materialized view in the catalog
558- err = remapper .IcebergWriter .CreateMaterializedView (icebergSchemaTable , definition )
570+ err = remapper .IcebergWriter .CreateMaterializedView (icebergSchemaTable , definition , ifNotExists )
559571 if err != nil {
560572 if strings .HasPrefix (err .Error (), "ERROR: duplicate key value violates unique constraint" ) {
561573 return fmt .Errorf ("relation %s already exists" , icebergSchemaTable .String ())
@@ -568,7 +580,7 @@ func (remapper *QueryRemapper) createMaterializedView(node *pgQuery.Node) error
568580 if ! node .GetCreateTableAsStmt ().Into .SkipData {
569581 queryStatements , _ , err := remapper .ParseAndRemapQuery (definition )
570582 if err != nil {
571- deleteErr := remapper .IcebergWriter .DropMaterializedView (icebergSchemaTable )
583+ deleteErr := remapper .IcebergWriter .DropMaterializedView (icebergSchemaTable , true )
572584 if deleteErr != nil {
573585 return fmt .Errorf ("couldn't remap definition of CREATE MATERIALIZED VIEW: %w (%w)" , err , deleteErr )
574586 }
@@ -577,7 +589,7 @@ func (remapper *QueryRemapper) createMaterializedView(node *pgQuery.Node) error
577589
578590 err = remapper .IcebergWriter .RefreshMaterializedView (icebergSchemaTable , queryStatements [0 ])
579591 if err != nil {
580- deleteErr := remapper .IcebergWriter .DropMaterializedView (icebergSchemaTable )
592+ deleteErr := remapper .IcebergWriter .DropMaterializedView (icebergSchemaTable , true )
581593 if deleteErr != nil {
582594 return fmt .Errorf ("couldn't refresh materialized view: %w (%w)" , err , deleteErr )
583595 }
@@ -590,21 +602,34 @@ func (remapper *QueryRemapper) createMaterializedView(node *pgQuery.Node) error
590602
591603func (remapper * QueryRemapper ) dropMaterializedViewFromNode (node * pgQuery.Node ) error {
592604 var icebergSchemaTable common.IcebergSchemaTable
593- nodeItems := node .GetDropStmt ().Objects [0 ].GetList ().Items
594- if len (nodeItems ) == 2 {
605+ dropStatement := node .GetDropStmt ()
606+ nodeItems := dropStatement .Objects [0 ].GetList ().Items
607+
608+ switch len (nodeItems ) {
609+ case 3 :
610+ if nodeItems [0 ].GetString_ ().Sval != remapper .config .Database {
611+ return fmt .Errorf ("cross-database materialized view drop is not supported: %s" , nodeItems [0 ].GetString_ ().Sval )
612+ }
613+ icebergSchemaTable = common.IcebergSchemaTable {
614+ Schema : nodeItems [1 ].GetString_ ().Sval ,
615+ Table : nodeItems [2 ].GetString_ ().Sval ,
616+ }
617+ case 2 :
595618 icebergSchemaTable = common.IcebergSchemaTable {
596619 Schema : nodeItems [0 ].GetString_ ().Sval ,
597620 Table : nodeItems [1 ].GetString_ ().Sval ,
598621 }
599- } else {
622+ case 1 :
600623 icebergSchemaTable = common.IcebergSchemaTable {
601624 Schema : PG_SCHEMA_PUBLIC ,
602625 Table : nodeItems [0 ].GetString_ ().Sval ,
603626 }
627+ default :
628+ return errors .New ("couldn't read DROP MATERIALIZED VIEW statement" )
604629 }
605630
606- // Delete the materialized view from the catalog
607- err := remapper .IcebergWriter .DropMaterializedView (icebergSchemaTable )
631+ // Drop the materialized view from the catalog
632+ err := remapper .IcebergWriter .DropMaterializedView (icebergSchemaTable , dropStatement . MissingOk )
608633 if err != nil {
609634 return err
610635 }
@@ -648,6 +673,26 @@ func (remapper *QueryRemapper) refreshMaterializedViewFromNode(node *pgQuery.Nod
648673 return nil
649674}
650675
676+ func (remapper * QueryRemapper ) renameMaterializedViewFromNode (node * pgQuery.Node ) error {
677+ icebergSchemaTable := common.IcebergSchemaTable {
678+ Schema : node .GetRenameStmt ().Relation .Schemaname ,
679+ Table : node .GetRenameStmt ().Relation .Relname ,
680+ }
681+ if icebergSchemaTable .Schema == "" {
682+ icebergSchemaTable .Schema = PG_SCHEMA_PUBLIC
683+ }
684+
685+ renameStatement := node .GetRenameStmt ()
686+ newName := renameStatement .Newname
687+
688+ err := remapper .IcebergWriter .RenameMaterializedView (icebergSchemaTable , newName , renameStatement .MissingOk )
689+ if err != nil {
690+ return fmt .Errorf ("couldn't rename table: %w" , err )
691+ }
692+
693+ return nil
694+ }
695+
651696func (remapper * QueryRemapper ) traceTreeTraversal (label string , indentLevel int ) {
652697 common .LogTrace (remapper .config .CommonConfig , strings .Repeat (">" , indentLevel ), label )
653698}
0 commit comments