From e7db36cc215f702fe76ae34c5898ee5f7381d1a5 Mon Sep 17 00:00:00 2001 From: Ricardo Borges Date: Tue, 12 May 2026 13:42:58 -0300 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=9A=80=20add=20constraints=20in=20.pg?= =?UTF-8?q?schemaignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/util/ignoreloader.go | 8 ++++++++ ir/ignore.go | 9 +++++++++ ir/inspector.go | 5 +++++ 3 files changed, 22 insertions(+) diff --git a/cmd/util/ignoreloader.go b/cmd/util/ignoreloader.go index 59c133b4..67c295b6 100644 --- a/cmd/util/ignoreloader.go +++ b/cmd/util/ignoreloader.go @@ -36,6 +36,7 @@ type TomlConfig struct { Sequences SequenceIgnoreConfig `toml:"sequences,omitempty"` Privileges PrivilegeIgnoreConfig `toml:"privileges,omitempty"` DefaultPrivileges DefaultPrivilegeIgnoreConfig `toml:"default_privileges,omitempty"` + Constraints ConstraintsIgnoreConfig `toml:"constraints,omitempty"` } // TableIgnoreConfig represents table-specific ignore configuration @@ -80,6 +81,12 @@ type DefaultPrivilegeIgnoreConfig struct { Patterns []string `toml:"patterns,omitempty"` } +// ConstraintsIgnoreConfig represents default privilege-specific ignore configuration +// Patterns match on grantee role names +type ConstraintsIgnoreConfig struct { + Patterns []string `toml:"patterns,omitempty"` +} + // LoadIgnoreFileWithStructure loads the .pgschemaignore file using the structured TOML format // and converts it to the simple IgnoreConfig structure func LoadIgnoreFileWithStructure() (*ir.IgnoreConfig, error) { @@ -113,6 +120,7 @@ func LoadIgnoreFileWithStructureFromPath(filePath string) (*ir.IgnoreConfig, err Sequences: tomlConfig.Sequences.Patterns, Privileges: tomlConfig.Privileges.Patterns, DefaultPrivileges: tomlConfig.DefaultPrivileges.Patterns, + Constraints: tomlConfig.Constraints.Patterns, } return config, nil diff --git a/ir/ignore.go b/ir/ignore.go index a4f6d638..a3f878e6 100644 --- a/ir/ignore.go +++ b/ir/ignore.go @@ -24,6 +24,7 @@ type IgnoreConfig struct { Sequences []string `toml:"sequences,omitempty"` Privileges []string `toml:"privileges,omitempty"` DefaultPrivileges []string `toml:"default_privileges,omitempty"` + Constraints []string `toml:"constraints,omitempty"` } // ShouldIgnoreTable checks if a table should be ignored based on the patterns @@ -114,6 +115,14 @@ func (c *IgnoreConfig) ShouldIgnoreDefaultPrivilege(grantee string) bool { return c.shouldIgnore(grantee, c.DefaultPrivileges) } +// ShouldIgnoreConstraints checks if constraints should be ignored based on the patterns +func (c *IgnoreConfig) ShouldIgnoreConstraints(constraintName string) bool { + if c == nil { + return false + } + return c.shouldIgnore(constraintName, c.Constraints) +} + // shouldIgnore checks if a name should be ignored based on the patterns // Patterns support wildcards (*) and negation (!) // Negation patterns (starting with !) take precedence over inclusion patterns diff --git a/ir/inspector.go b/ir/inspector.go index 23a0a5c4..17812f75 100644 --- a/ir/inspector.go +++ b/ir/inspector.go @@ -447,6 +447,11 @@ func (i *Inspector) buildConstraints(ctx context.Context, schema *IR, targetSche constraintType = constraint.ConstraintType.String } + // Check if constraint should be ignored + if i.ignoreConfig != nil && i.ignoreConfig.ShouldIgnoreConstraints(constraintName) { + continue + } + // Extract column name from sql.NullString columnName := "" if constraint.ColumnName.Valid { From ba2186c54f411d0705ac9c1b92a8f229de36a11e Mon Sep 17 00:00:00 2001 From: Ricardo Borges Date: Tue, 12 May 2026 13:59:51 -0300 Subject: [PATCH 2/5] Update ir/ignore.go rename func ShouldIgnoreConstraints Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- ir/ignore.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ir/ignore.go b/ir/ignore.go index a3f878e6..c7a73590 100644 --- a/ir/ignore.go +++ b/ir/ignore.go @@ -115,8 +115,8 @@ func (c *IgnoreConfig) ShouldIgnoreDefaultPrivilege(grantee string) bool { return c.shouldIgnore(grantee, c.DefaultPrivileges) } -// ShouldIgnoreConstraints checks if constraints should be ignored based on the patterns -func (c *IgnoreConfig) ShouldIgnoreConstraints(constraintName string) bool { +// ShouldIgnoreConstraint checks if a constraint should be ignored based on the patterns +func (c *IgnoreConfig) ShouldIgnoreConstraint(constraintName string) bool { if c == nil { return false } From 1ffc0ba1e3c80a208bd7b88ecbad9858f8cb1f3a Mon Sep 17 00:00:00 2001 From: Ricardo Borges Date: Tue, 12 May 2026 14:00:07 -0300 Subject: [PATCH 3/5] Update ir/inspector.go rename ShouldIgnoreConstraints Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- ir/inspector.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ir/inspector.go b/ir/inspector.go index 17812f75..47f5b1e8 100644 --- a/ir/inspector.go +++ b/ir/inspector.go @@ -448,7 +448,7 @@ func (i *Inspector) buildConstraints(ctx context.Context, schema *IR, targetSche } // Check if constraint should be ignored - if i.ignoreConfig != nil && i.ignoreConfig.ShouldIgnoreConstraints(constraintName) { + if i.ignoreConfig != nil && i.ignoreConfig.ShouldIgnoreConstraint(constraintName) { continue } From 492c1033de5ac72530342ae05d5a1cf1c6f9f9e3 Mon Sep 17 00:00:00 2001 From: Ricardo Borges Date: Wed, 13 May 2026 09:26:56 -0300 Subject: [PATCH 4/5] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- cmd/util/ignoreloader.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/util/ignoreloader.go b/cmd/util/ignoreloader.go index 67c295b6..e7fd2d5b 100644 --- a/cmd/util/ignoreloader.go +++ b/cmd/util/ignoreloader.go @@ -81,8 +81,8 @@ type DefaultPrivilegeIgnoreConfig struct { Patterns []string `toml:"patterns,omitempty"` } -// ConstraintsIgnoreConfig represents default privilege-specific ignore configuration -// Patterns match on grantee role names +// ConstraintsIgnoreConfig represents constraint-specific ignore configuration +// Patterns match constraint names, including optionally qualified names type ConstraintsIgnoreConfig struct { Patterns []string `toml:"patterns,omitempty"` } From 1e70f27d033908826ac23427b5657baef7df4147 Mon Sep 17 00:00:00 2001 From: Ricardo Borges Date: Wed, 13 May 2026 10:19:51 -0300 Subject: [PATCH 5/5] ajustes no ignoreloader --- cmd/util/ignoreloader.go | 6 +++--- ir/inspector.go | 13 ++++++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/cmd/util/ignoreloader.go b/cmd/util/ignoreloader.go index e7fd2d5b..d845569d 100644 --- a/cmd/util/ignoreloader.go +++ b/cmd/util/ignoreloader.go @@ -36,7 +36,7 @@ type TomlConfig struct { Sequences SequenceIgnoreConfig `toml:"sequences,omitempty"` Privileges PrivilegeIgnoreConfig `toml:"privileges,omitempty"` DefaultPrivileges DefaultPrivilegeIgnoreConfig `toml:"default_privileges,omitempty"` - Constraints ConstraintsIgnoreConfig `toml:"constraints,omitempty"` + Constraints ConstraintIgnoreConfig `toml:"constraints,omitempty"` } // TableIgnoreConfig represents table-specific ignore configuration @@ -81,9 +81,9 @@ type DefaultPrivilegeIgnoreConfig struct { Patterns []string `toml:"patterns,omitempty"` } -// ConstraintsIgnoreConfig represents constraint-specific ignore configuration +// ConstraintIgnoreConfig represents constraint-specific ignore configuration // Patterns match constraint names, including optionally qualified names -type ConstraintsIgnoreConfig struct { +type ConstraintIgnoreConfig struct { Patterns []string `toml:"patterns,omitempty"` } diff --git a/ir/inspector.go b/ir/inspector.go index 47f5b1e8..574f5a51 100644 --- a/ir/inspector.go +++ b/ir/inspector.go @@ -447,9 +447,16 @@ func (i *Inspector) buildConstraints(ctx context.Context, schema *IR, targetSche constraintType = constraint.ConstraintType.String } - // Check if constraint should be ignored - if i.ignoreConfig != nil && i.ignoreConfig.ShouldIgnoreConstraint(constraintName) { - continue + // Check if constraint should be ignored. Prefer a fully qualified + // identifier to avoid unintentionally ignoring same-named constraints + // on unrelated tables, while still supporting bare constraint-name + // matching for backwards compatibility. + if i.ignoreConfig != nil { + qualifiedConstraintName := fmt.Sprintf("%s.%s.%s", schemaName, tableName, constraintName) + if i.ignoreConfig.ShouldIgnoreConstraint(qualifiedConstraintName) || + i.ignoreConfig.ShouldIgnoreConstraint(constraintName) { + continue + } } // Extract column name from sql.NullString