Skip to content

Commit

Permalink
Remove duplicate entries in pg_namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
exAspArk committed Jan 9, 2025
1 parent dce453e commit 8612ba4
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 10 deletions.
1 change: 1 addition & 0 deletions src/duckdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
var DEFAULT_BOOT_QUERIES = []string{
"INSTALL iceberg",
"LOAD iceberg",
"SELECT oid FROM pg_catalog.pg_namespace",
"CREATE SCHEMA public",
"USE public",
}
Expand Down
22 changes: 16 additions & 6 deletions src/parser_where.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,23 @@ func (parser *ParserWhere) FunctionCall(whereNode *pgQuery.Node) *pgQuery.FuncCa
return whereNode.GetFuncCall()
}

// WHERE column != 'value'
func (parser *ParserWhere) MakeExpressionNode(column string, operation string, value string) *pgQuery.Node {
// WHERE column NOT IN (values)
func (parser *ParserWhere) MakeNotInExpressionNode(column string, values []int64, alias string) *pgQuery.Node {
columnRefNodes := []*pgQuery.Node{pgQuery.MakeStrNode(column)}
if alias != "" {
columnRefNodes = []*pgQuery.Node{pgQuery.MakeStrNode(alias), pgQuery.MakeStrNode(column)}
}

valuesNodes := make([]*pgQuery.Node, len(values))
for i, value := range values {
valuesNodes[i] = pgQuery.MakeAConstIntNode(value, 0)
}

return pgQuery.MakeAExprNode(
pgQuery.A_Expr_Kind_AEXPR_OP,
[]*pgQuery.Node{pgQuery.MakeStrNode(operation)},
pgQuery.MakeColumnRefNode([]*pgQuery.Node{pgQuery.MakeStrNode(column)}, 0),
pgQuery.MakeAConstStrNode(value, 0),
pgQuery.A_Expr_Kind_AEXPR_IN,
[]*pgQuery.Node{pgQuery.MakeStrNode("<>")},
pgQuery.MakeColumnRefNode(columnRefNodes, 0),
pgQuery.MakeListNode(valuesNodes),
0,
)
}
Expand Down
4 changes: 4 additions & 0 deletions src/query_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,10 @@ func (queryHandler *QueryHandler) remapQuery(query string) (string, error) {
return "", err
}

if strings.HasSuffix(query, " --INSPECT") {
LogDebug(queryHandler.config, queryTree.Stmts[0].Stmt)
}

queryTree.Stmts, err = queryHandler.queryRemapper.RemapStatements(queryTree.Stmts)
if err != nil {
return "", err
Expand Down
2 changes: 1 addition & 1 deletion src/query_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ func TestHandleQuery(t *testing.T) {
"types": {Uint32ToString(pgtype.TextOID)},
"values": {},
},
"SELECT n.nspname FROM pg_catalog.pg_namespace n LEFT OUTER JOIN pg_catalog.pg_description d ON d.objoid = n.oid ORDER BY n.oid LIMIT 1": {
"SELECT n.nspname FROM pg_catalog.pg_namespace n LEFT OUTER JOIN pg_catalog.pg_description d ON d.objoid = n.oid ORDER BY n.oid DESC LIMIT 1": {
"description": {"nspname"},
"types": {Uint32ToString(pgtype.TextOID)},
"values": {"public"},
Expand Down
8 changes: 5 additions & 3 deletions src/query_remapper_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
pgQuery "github.com/pganalyze/pg_query_go/v5"
)

var REDUNDANT_PG_NAMESPACE_OIDS = []int64{0, 1148, 1253, 1264, 1265, 1266, 1267}

type QueryRemapperTable struct {
parserTable *ParserTable
parserWhere *ParserWhere
Expand Down Expand Up @@ -184,10 +186,10 @@ func (remapper *QueryRemapperTable) RemapWhereClauseForTable(qSchemaTable QueryS
if remapper.isTableFromPgCatalog(qSchemaTable) {
switch qSchemaTable.Table {

// FROM pg_catalog.pg_namespace -> FROM pg_catalog.pg_namespace WHERE nspname != 'main'
// FROM pg_catalog.pg_namespace -> FROM pg_catalog.pg_namespace WHERE oid NOT IN (3 'main' schema oids, 2 'pg_catalog' and 2 'information_schema' duplicate oids)
case PG_TABLE_PG_NAMESPACE:
withoutMainSchemaWhereCondition := remapper.parserWhere.MakeExpressionNode("nspname", "!=", "main")
return remapper.parserWhere.AppendWhereCondition(selectStatement, withoutMainSchemaWhereCondition)
withoutDuckdbOidsWhereCondition := remapper.parserWhere.MakeNotInExpressionNode("oid", REDUNDANT_PG_NAMESPACE_OIDS, qSchemaTable.Alias)
remapper.parserWhere.AppendWhereCondition(selectStatement, withoutDuckdbOidsWhereCondition)

// FROM pg_catalog.pg_statio_user_tables -> FROM pg_catalog.pg_statio_user_tables WHERE false
case PG_TABLE_PG_STATIO_USER_TABLES:
Expand Down

0 comments on commit 8612ba4

Please sign in to comment.