Files
2026-07-13 12:32:25 +08:00

80 lines
3.3 KiB
Go

// Copyright 2026 Dolthub, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package server
import (
"github.com/dolthub/dolt/go/libraries/doltcore/sqle"
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
"github.com/dolthub/dolt/go/libraries/utils/filesys"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/doltgresql/server/tables"
)
// DoltgresDatabaseProvider wraps DoltDatabaseProvider to enforce PostgreSQL specific
// requirements, such as requiring all relation names (e.g. tables, indexes, sequences, views)
// are unique within a schema.
type DoltgresDatabaseProvider struct {
*sqle.DoltDatabaseProvider
}
var _ sql.DatabaseProvider = (*DoltgresDatabaseProvider)(nil)
// Database overrides DoltDatabaseProvider.Database to wrap the returned sql.Database
// with PgDatabase, enabling relation-name uniqueness enforcement.
func (p *DoltgresDatabaseProvider) Database(ctx *sql.Context, name string) (sql.Database, error) {
db, err := p.DoltDatabaseProvider.Database(ctx, name)
if err != nil {
return nil, err
}
return tables.WrapSqlDatabase(db), nil
}
// AllDatabases overrides DoltDatabaseProvider.AllDatabases to wrap each returned database
// with PgDatabase so that AllSchemas returns properly wrapped schemas (including pg_catalog
// virtual-table schemas) regardless of which code path iterates the catalog.
func (p *DoltgresDatabaseProvider) AllDatabases(ctx *sql.Context) []sql.Database {
all := p.DoltDatabaseProvider.AllDatabases(ctx)
for i, db := range all {
all[i] = tables.WrapSqlDatabase(db)
}
return all
}
// UnderlyingDoltProvider implements sqle.DoltProviderUnwrapper so that NewSqlEngine can
// access the wrapped *DoltDatabaseProvider for Dolt-specific configuration.
func (p *DoltgresDatabaseProvider) UnderlyingDoltProvider() *sqle.DoltDatabaseProvider {
return p.DoltDatabaseProvider
}
// DoltgresProviderFactory is the ProviderFactory for Doltgres. It embeds DoltProviderFactory
// and overrides NewProvider to wrap the result in DoltgresDatabaseProvider, so that
// Database() returns PgDatabase-wrapped databases enforcing PostgreSQL relation-name uniqueness.
type DoltgresProviderFactory struct {
sqle.DoltProviderFactory
}
var _ sqle.ProviderFactory = DoltgresProviderFactory{}
// NewProvider overrides DoltProviderFactory.NewProvider to wrap the created provider in
// DoltgresDatabaseProvider before returning it.
func (f DoltgresProviderFactory) NewProvider(defaultBranch string, fs filesys.Filesys, databases []dsess.SqlDatabase, locations []filesys.Filesys, overrides sql.EngineOverrides) (sql.DatabaseProvider, error) {
inner, err := f.DoltProviderFactory.NewProvider(defaultBranch, fs, databases, locations, overrides)
if err != nil {
return nil, err
}
return &DoltgresDatabaseProvider{inner.(*sqle.DoltDatabaseProvider)}, nil
}