From 3655b40fd0c553357e945b6b71697d23a7550835 Mon Sep 17 00:00:00 2001 From: elianddb Date: Wed, 3 Dec 2025 11:57:28 -0800 Subject: [PATCH 01/12] mv priv check to var --- .../doltcore/sqle/dprocedures/dolt_backup.go | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go b/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go index 2f03f88cec..827073d880 100644 --- a/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go +++ b/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go @@ -70,16 +70,8 @@ func doltBackup(ctx *sql.Context, args ...string) (sql.RowIter, error) { return nil, err } - if sqlserver.RunningInServerMode() { - // TODO(elianddb): DoltgreSQL needs an auth handler for stored procedures, i.e. AuthType_CALL, but for now we use - // this. dolt_backup already requires admin privilege on GMS due to its potentially destructive nature. - privileges, counter := ctx.GetPrivilegeSet() - if counter == 0 || !privileges.Has(sql.PrivilegeType_Super) { - return nil, sql.ErrPrivilegeCheckFailed.New(ctx.Session.Client().User) - } - if apr.ContainsAny(cli.AwsParams...) { - return nil, fmt.Errorf("AWS parameters are unavailable when running in server mode") - } + if sqlserver.RunningInServerMode() && apr.ContainsAny(cli.AwsParams...) { + return nil, fmt.Errorf("AWS parameters are unavailable when running in server mode") } if apr.NArg() == 0 || (apr.NArg() == 1 && apr.Contains(cli.VerboseFlag)) { @@ -397,3 +389,13 @@ func errDoltBackupUsage(funcParam string, requiredParams, optionalParams []strin return errors.New(builder.String()) } + +var UserHasSuperAccess = func(ctx *sql.Context) (bool, error) { + // TODO(elianddb): DoltgreSQL needs an auth handler for stored procedures, i.e. AuthType_CALL, but for now we use + // this. dolt_backup already requires admin privilege on GMS due to its potentially destructive nature. + privileges, counter := ctx.GetPrivilegeSet() + if counter == 0 || !privileges.Has(sql.PrivilegeType_Super) { + return false, sql.ErrPrivilegeCheckFailed.New(ctx.Session.Client().User) + } + return true, nil +} From 73428104fcab33702ca875f1677bcefc1a87e64b Mon Sep 17 00:00:00 2001 From: elianddb Date: Wed, 3 Dec 2025 12:50:40 -0800 Subject: [PATCH 02/12] rm UserHasSuperAccess and move to doltgresql --- go/libraries/doltcore/sqle/dprocedures/dolt_backup.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go b/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go index 827073d880..adb0feef60 100644 --- a/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go +++ b/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go @@ -389,13 +389,3 @@ func errDoltBackupUsage(funcParam string, requiredParams, optionalParams []strin return errors.New(builder.String()) } - -var UserHasSuperAccess = func(ctx *sql.Context) (bool, error) { - // TODO(elianddb): DoltgreSQL needs an auth handler for stored procedures, i.e. AuthType_CALL, but for now we use - // this. dolt_backup already requires admin privilege on GMS due to its potentially destructive nature. - privileges, counter := ctx.GetPrivilegeSet() - if counter == 0 || !privileges.Has(sql.PrivilegeType_Super) { - return false, sql.ErrPrivilegeCheckFailed.New(ctx.Session.Client().User) - } - return true, nil -} From d7cf4b6d3b200de6a8d2d7fea08944684b8f76aa Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 5 Dec 2025 13:24:06 -0800 Subject: [PATCH 03/12] add dolt adapter to standardize table overwrites by integrators --- go/libraries/doltcore/doltdb/system_table.go | 5 --- .../doltcore/sqle/adapters/table_adapter.go | 26 ++++++++++++ go/libraries/doltcore/sqle/database.go | 10 ++++- .../doltcore/sqle/dtables/status_table.go | 42 +++++++++++++------ 4 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 go/libraries/doltcore/sqle/adapters/table_adapter.go diff --git a/go/libraries/doltcore/doltdb/system_table.go b/go/libraries/doltcore/doltdb/system_table.go index 60ac6325c9..53932995ca 100644 --- a/go/libraries/doltcore/doltdb/system_table.go +++ b/go/libraries/doltcore/doltdb/system_table.go @@ -367,11 +367,6 @@ var GetSchemaConflictsTableName = func() string { return SchemaConflictsTableName } -// GetStatusTableName returns the status system table name. -var GetStatusTableName = func() string { - return StatusTableName -} - // GetTagsTableName returns the tags table name var GetTagsTableName = func() string { return TagsTableName diff --git a/go/libraries/doltcore/sqle/adapters/table_adapter.go b/go/libraries/doltcore/sqle/adapters/table_adapter.go new file mode 100644 index 0000000000..3fd999e2c0 --- /dev/null +++ b/go/libraries/doltcore/sqle/adapters/table_adapter.go @@ -0,0 +1,26 @@ +package adapters + +import ( + "github.com/dolthub/go-mysql-server/sql" + + "github.com/dolthub/dolt/go/libraries/doltcore/doltdb" + "github.com/dolthub/dolt/go/libraries/doltcore/env" +) + +// TableAdapter provides a hook for extensions to customize or wrap table implementations. For example, this allows +// libraries like Doltgres to intercept system table creation and apply type conversions, schema modifications, or other +// customizations without modifying the core Dolt implementation for their compatibility. +type TableAdapter interface { + // CreateTable creates or wraps a system table. The function receives all necessary parameters to construct the + // table and can either build it from scratch or call the default Dolt constructor and wrap it. + CreateTable(ctx *sql.Context, tableName string, dDb *doltdb.DoltDB, workingSet *doltdb.WorkingSet, rootsProvider env.RootsProvider[*sql.Context]) sql.Table + + // TableName returns the preferred name for the adapter's table. This allows extensions to rename tables while + // preserving the underlying implementation. For example, Doltgres uses "status" while Dolt uses "dolt_status", + // enabling cleaner Postgres-style naming. + TableName() string +} + +// TableAdapters is a registry for TableAdapter implementations, keyed by table name. It is populated during package +// initialization and intended to be read-only thereafter. +var TableAdapters = make(map[string]TableAdapter) diff --git a/go/libraries/doltcore/sqle/database.go b/go/libraries/doltcore/sqle/database.go index 4196510389..37fd7ee137 100644 --- a/go/libraries/doltcore/sqle/database.go +++ b/go/libraries/doltcore/sqle/database.go @@ -44,6 +44,7 @@ import ( "github.com/dolthub/dolt/go/libraries/doltcore/rebase" "github.com/dolthub/dolt/go/libraries/doltcore/ref" "github.com/dolthub/dolt/go/libraries/doltcore/schema" + "github.com/dolthub/dolt/go/libraries/doltcore/sqle/adapters" "github.com/dolthub/dolt/go/libraries/doltcore/sqle/dprocedures" "github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess" "github.com/dolthub/dolt/go/libraries/doltcore/sqle/dtables" @@ -747,7 +748,7 @@ func (db Database) getTableInsensitiveWithRoot(ctx *sql.Context, head *doltdb.Co if !resolve.UseSearchPath || isDoltgresSystemTable { dt, found = dtables.NewCommitAncestorsTable(ctx, db.Name(), lwrName, db.ddb), true } - case doltdb.GetStatusTableName(), doltdb.StatusTableName: + case doltdb.StatusTableName, adapters.TableAdapters[doltdb.StatusTableName].TableName(): isDoltgresSystemTable, err := resolve.IsDoltgresSystemTable(ctx, tname, root) if err != nil { return nil, false, err @@ -804,7 +805,12 @@ func (db Database) getTableInsensitiveWithRoot(ctx *sql.Context, head *doltdb.Co } } - dt, found = dtables.NewStatusTable(ctx, lwrName, db.ddb, ws, rootsProvider), true + if tableAdapter, ok := adapters.TableAdapters[lwrName]; ok { + dt, found = tableAdapter.CreateTable(ctx, lwrName, db.ddb, ws, rootsProvider), true + } + if !ok { + return nil, false, sql.ErrTableNotFound.New(tblName) + } } case doltdb.MergeStatusTableName, doltdb.GetMergeStatusTableName(): isDoltgresSystemTable, err := resolve.IsDoltgresSystemTable(ctx, tname, root) diff --git a/go/libraries/doltcore/sqle/dtables/status_table.go b/go/libraries/doltcore/sqle/dtables/status_table.go index 2e7673e8c8..c927d4621d 100644 --- a/go/libraries/doltcore/sqle/dtables/status_table.go +++ b/go/libraries/doltcore/sqle/dtables/status_table.go @@ -25,11 +25,35 @@ import ( "github.com/dolthub/dolt/go/libraries/doltcore/doltdb" "github.com/dolthub/dolt/go/libraries/doltcore/env" "github.com/dolthub/dolt/go/libraries/doltcore/schema" + "github.com/dolthub/dolt/go/libraries/doltcore/sqle/adapters" "github.com/dolthub/dolt/go/libraries/doltcore/sqle/index" ) const statusDefaultRowCount = 10 +func init() { + adapters.TableAdapters[doltdb.StatusTableName] = DoltStatusTableAdapter{} +} + +// DoltStatusTableAdapter implements the adapters.TableAdapter interface. It serves as the default dolt_status table +// implementation, applying zero modifications. This exists in case no adapters are initialized by the integrator, i.e. +// Doltgres. +type DoltStatusTableAdapter struct{} + +var _ adapters.TableAdapter = DoltStatusTableAdapter{} + +// CreateTable implements the adapters.TableAdapter interface. It returns the default constructor for the dolt_status +// table, applying zero modifications. +func (d DoltStatusTableAdapter) CreateTable(ctx *sql.Context, tableName string, dDb *doltdb.DoltDB, workingSet *doltdb.WorkingSet, rootsProvider env.RootsProvider[*sql.Context]) sql.Table { + return NewStatusTable(ctx, tableName, dDb, workingSet, rootsProvider) +} + +// TableName implements the adapters.TableAdapter interface. It returns the default name for the dolt_status table, +// applying zero modifications. +func (d DoltStatusTableAdapter) TableName() string { + return doltdb.StatusTableName +} + // StatusTable is a sql.Table implementation that implements a system table which shows the dolt branches type StatusTable struct { rootsProvider env.RootsProvider[*sql.Context] @@ -61,20 +85,12 @@ func (st StatusTable) String() string { return st.tableName } -func getDoltStatusSchema(tableName string) sql.Schema { - return []*sql.Column{ - {Name: "table_name", Type: types.Text, Source: tableName, PrimaryKey: true, Nullable: false}, - {Name: "staged", Type: types.Boolean, Source: tableName, PrimaryKey: true, Nullable: false}, - {Name: "status", Type: types.Text, Source: tableName, PrimaryKey: true, Nullable: false}, - } -} - -// GetDoltStatusSchema returns the schema of the dolt_status system table. This is used -// by Doltgres to update the dolt_status schema using Doltgres types. -var GetDoltStatusSchema = getDoltStatusSchema - func (st StatusTable) Schema() sql.Schema { - return GetDoltStatusSchema(st.tableName) + return []*sql.Column{ + {Name: "table_name", Type: types.Text, Source: doltdb.StatusTableName, PrimaryKey: true, Nullable: false}, + {Name: "staged", Type: types.Boolean, Source: doltdb.StatusTableName, PrimaryKey: true, Nullable: false}, + {Name: "status", Type: types.Text, Source: doltdb.StatusTableName, PrimaryKey: true, Nullable: false}, + } } func (st StatusTable) Collation() sql.CollationID { From 752db82b84c48667bda07817150700faa61369bb Mon Sep 17 00:00:00 2001 From: elianddb Date: Fri, 5 Dec 2025 16:32:41 -0800 Subject: [PATCH 04/12] add dolt table specific adapter registry for integrators --- go/libraries/doltcore/doltdb/system_table.go | 1 - .../doltcore/sqle/adapters/table_adapter.go | 45 +++++++++++++++++-- go/libraries/doltcore/sqle/database.go | 11 ++--- .../doltcore/sqle/dtables/status_table.go | 15 +++---- .../doltcore/sqle/resolve/system_tables.go | 5 +++ 5 files changed, 57 insertions(+), 20 deletions(-) diff --git a/go/libraries/doltcore/doltdb/system_table.go b/go/libraries/doltcore/doltdb/system_table.go index 53932995ca..8dd79b68b5 100644 --- a/go/libraries/doltcore/doltdb/system_table.go +++ b/go/libraries/doltcore/doltdb/system_table.go @@ -155,7 +155,6 @@ func GeneratedSystemTableNames() []string { GetTableOfTablesWithViolationsName(), GetCommitsTableName(), GetCommitAncestorsTableName(), - GetStatusTableName(), GetRemotesTableName(), GetHelpTableName(), GetBackupsTableName(), diff --git a/go/libraries/doltcore/sqle/adapters/table_adapter.go b/go/libraries/doltcore/sqle/adapters/table_adapter.go index 3fd999e2c0..44b8fb9ada 100644 --- a/go/libraries/doltcore/sqle/adapters/table_adapter.go +++ b/go/libraries/doltcore/sqle/adapters/table_adapter.go @@ -21,6 +21,45 @@ type TableAdapter interface { TableName() string } -// TableAdapters is a registry for TableAdapter implementations, keyed by table name. It is populated during package -// initialization and intended to be read-only thereafter. -var TableAdapters = make(map[string]TableAdapter) +var DoltTableAdapterRegistry = newDoltTableAdapterRegistry() + +// doltTableAdapterRegistry is a TableAdapter registry for Dolt tables, keyed by table name. It is populated during +// package initialization (in the Dolt table source) and intended to be read-only thereafter. +type doltTableAdapterRegistry struct { + Adapters map[string]TableAdapter + adapterAliases map[string]string +} + +// newDoltTableAdapterRegistry constructs Dolt table adapter registry with empty alias and adapter maps. +func newDoltTableAdapterRegistry() *doltTableAdapterRegistry { + return &doltTableAdapterRegistry{ + Adapters: make(map[string]TableAdapter), + adapterAliases: make(map[string]string), + } +} + +// AddAdapter adds a TableAdapter to the Dolt table adapter registry with optional |aliases| (alternative table name +// keys). An alias cannot exist as both an adapter and alias, if you provide an alias that is already in the adapter +// map, it will be dropped. This overriding behavior is typically used by integrators, i.e. Doltgres, to replace the +// original Dolt table. +func (as *doltTableAdapterRegistry) AddAdapter(tableName string, adapter TableAdapter, aliases ...string) { + for _, alias := range aliases { + as.adapterAliases[alias] = tableName + if _, ok := as.Adapters[alias]; ok { + delete(as.Adapters, alias) // We don't want this to show up in the catalog. + } + } + as.adapterAliases[tableName] = tableName + as.Adapters[tableName] = adapter +} + +// GetAdapter gets a Dolt TableAdapter mapped to |name|, which can be an alias or the table name. +func (as *doltTableAdapterRegistry) GetAdapter(name string) TableAdapter { + name = as.adapterAliases[name] + return as.Adapters[name] +} + +// GetTableName gets the Dolt table name mapped to |name|, which can be an alias or the table name. +func (as *doltTableAdapterRegistry) GetTableName(name string) string { + return as.adapterAliases[name] +} diff --git a/go/libraries/doltcore/sqle/database.go b/go/libraries/doltcore/sqle/database.go index 37fd7ee137..b5de773700 100644 --- a/go/libraries/doltcore/sqle/database.go +++ b/go/libraries/doltcore/sqle/database.go @@ -748,7 +748,7 @@ func (db Database) getTableInsensitiveWithRoot(ctx *sql.Context, head *doltdb.Co if !resolve.UseSearchPath || isDoltgresSystemTable { dt, found = dtables.NewCommitAncestorsTable(ctx, db.Name(), lwrName, db.ddb), true } - case doltdb.StatusTableName, adapters.TableAdapters[doltdb.StatusTableName].TableName(): + case doltdb.StatusTableName, adapters.DoltTableAdapterRegistry.GetTableName(doltdb.StatusTableName): isDoltgresSystemTable, err := resolve.IsDoltgresSystemTable(ctx, tname, root) if err != nil { return nil, false, err @@ -804,13 +804,8 @@ func (db Database) getTableInsensitiveWithRoot(ctx *sql.Context, head *doltdb.Co rootsProvider = nil } } - - if tableAdapter, ok := adapters.TableAdapters[lwrName]; ok { - dt, found = tableAdapter.CreateTable(ctx, lwrName, db.ddb, ws, rootsProvider), true - } - if !ok { - return nil, false, sql.ErrTableNotFound.New(tblName) - } + adapter := adapters.DoltTableAdapterRegistry.GetAdapter(lwrName) + dt, found = adapter.CreateTable(ctx, lwrName, db.ddb, ws, rootsProvider), true } case doltdb.MergeStatusTableName, doltdb.GetMergeStatusTableName(): isDoltgresSystemTable, err := resolve.IsDoltgresSystemTable(ctx, tname, root) diff --git a/go/libraries/doltcore/sqle/dtables/status_table.go b/go/libraries/doltcore/sqle/dtables/status_table.go index c927d4621d..e787d37618 100644 --- a/go/libraries/doltcore/sqle/dtables/status_table.go +++ b/go/libraries/doltcore/sqle/dtables/status_table.go @@ -32,24 +32,23 @@ import ( const statusDefaultRowCount = 10 func init() { - adapters.TableAdapters[doltdb.StatusTableName] = DoltStatusTableAdapter{} + adapters.DoltTableAdapterRegistry.AddAdapter(doltdb.StatusTableName, DoltStatusTableAdapter{}) } -// DoltStatusTableAdapter implements the adapters.TableAdapter interface. It serves as the default dolt_status table -// implementation, applying zero modifications. This exists in case no adapters are initialized by the integrator, i.e. -// Doltgres. +// DoltStatusTableAdapter serves as the default [dtables.StatusTable] implementation, applying zero modifications. It +// exists in case no adapters are initialized by an integrator for the Dolt status table, i.e. go-mysql-server. +// +// DoltStatusTableAdapter implements the [adapters.TableAdapter] interface. type DoltStatusTableAdapter struct{} var _ adapters.TableAdapter = DoltStatusTableAdapter{} -// CreateTable implements the adapters.TableAdapter interface. It returns the default constructor for the dolt_status -// table, applying zero modifications. +// CreateTable returns the default constructor [NewStatusTable], applying zero modifications. func (d DoltStatusTableAdapter) CreateTable(ctx *sql.Context, tableName string, dDb *doltdb.DoltDB, workingSet *doltdb.WorkingSet, rootsProvider env.RootsProvider[*sql.Context]) sql.Table { return NewStatusTable(ctx, tableName, dDb, workingSet, rootsProvider) } -// TableName implements the adapters.TableAdapter interface. It returns the default name for the dolt_status table, -// applying zero modifications. +// TableName returns the default name for the dolt_status table. func (d DoltStatusTableAdapter) TableName() string { return doltdb.StatusTableName } diff --git a/go/libraries/doltcore/sqle/resolve/system_tables.go b/go/libraries/doltcore/sqle/resolve/system_tables.go index c37ecfc0af..c2c8448c12 100755 --- a/go/libraries/doltcore/sqle/resolve/system_tables.go +++ b/go/libraries/doltcore/sqle/resolve/system_tables.go @@ -19,6 +19,7 @@ import ( "github.com/dolthub/dolt/go/libraries/doltcore/doltdb" "github.com/dolthub/dolt/go/libraries/doltcore/schema" + "github.com/dolthub/dolt/go/libraries/doltcore/sqle/adapters" ) // GetGeneratedSystemTables returns table names of all generated system tables. @@ -37,6 +38,10 @@ func GetGeneratedSystemTables(ctx context.Context, root doltdb.RootValue) ([]dol } } + for _, adapter := range adapters.DoltTableAdapterRegistry.Adapters { + s.Add(doltdb.TableName{Name: adapter.TableName(), Schema: doltdb.DoltNamespace}) + } + schemas, err := root.GetDatabaseSchemas(ctx) if err != nil { return nil, err From cd084b0cf1b2c9d950b1e81f6c494767787eacf6 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 8 Dec 2025 04:45:40 -0800 Subject: [PATCH 05/12] rm extra default adapter and normalize internal alias instead --- .../doltcore/sqle/adapters/table_adapter.go | 63 ++++++++++--------- go/libraries/doltcore/sqle/database.go | 8 +-- .../doltcore/sqle/dtables/status_table.go | 33 +++------- 3 files changed, 48 insertions(+), 56 deletions(-) diff --git a/go/libraries/doltcore/sqle/adapters/table_adapter.go b/go/libraries/doltcore/sqle/adapters/table_adapter.go index 44b8fb9ada..c41e423be0 100644 --- a/go/libraries/doltcore/sqle/adapters/table_adapter.go +++ b/go/libraries/doltcore/sqle/adapters/table_adapter.go @@ -11,9 +11,9 @@ import ( // libraries like Doltgres to intercept system table creation and apply type conversions, schema modifications, or other // customizations without modifying the core Dolt implementation for their compatibility. type TableAdapter interface { - // CreateTable creates or wraps a system table. The function receives all necessary parameters to construct the - // table and can either build it from scratch or call the default Dolt constructor and wrap it. - CreateTable(ctx *sql.Context, tableName string, dDb *doltdb.DoltDB, workingSet *doltdb.WorkingSet, rootsProvider env.RootsProvider[*sql.Context]) sql.Table + // NewTable creates or wraps a system table. The function receives all necessary parameters to construct the table + // and can either build it from scratch or call the default Dolt constructor and wrap it. + NewTable(ctx *sql.Context, tableName string, dDb *doltdb.DoltDB, workingSet *doltdb.WorkingSet, rootsProvider env.RootsProvider[*sql.Context]) sql.Table // TableName returns the preferred name for the adapter's table. This allows extensions to rename tables while // preserving the underlying implementation. For example, Doltgres uses "status" while Dolt uses "dolt_status", @@ -23,43 +23,48 @@ type TableAdapter interface { var DoltTableAdapterRegistry = newDoltTableAdapterRegistry() -// doltTableAdapterRegistry is a TableAdapter registry for Dolt tables, keyed by table name. It is populated during -// package initialization (in the Dolt table source) and intended to be read-only thereafter. +// doltTableAdapterRegistry is a TableAdapter registry for Dolt tables, keyed by the table's original name. It is +// populated during package initialization by integrators and intended to be read-only thereafter. type doltTableAdapterRegistry struct { - Adapters map[string]TableAdapter - adapterAliases map[string]string + Adapters map[string]TableAdapter + internalAliases map[string]string } -// newDoltTableAdapterRegistry constructs Dolt table adapter registry with empty alias and adapter maps. +// newDoltTableAdapterRegistry constructs Dolt table adapter registry with empty internal alias and adapter maps. func newDoltTableAdapterRegistry() *doltTableAdapterRegistry { return &doltTableAdapterRegistry{ - Adapters: make(map[string]TableAdapter), - adapterAliases: make(map[string]string), + Adapters: make(map[string]TableAdapter), + internalAliases: make(map[string]string), } } -// AddAdapter adds a TableAdapter to the Dolt table adapter registry with optional |aliases| (alternative table name -// keys). An alias cannot exist as both an adapter and alias, if you provide an alias that is already in the adapter -// map, it will be dropped. This overriding behavior is typically used by integrators, i.e. Doltgres, to replace the -// original Dolt table. -func (as *doltTableAdapterRegistry) AddAdapter(tableName string, adapter TableAdapter, aliases ...string) { - for _, alias := range aliases { - as.adapterAliases[alias] = tableName - if _, ok := as.Adapters[alias]; ok { - delete(as.Adapters, alias) // We don't want this to show up in the catalog. - } +// AddAdapter adds a TableAdapter to the Dolt table adapter registry with optional |internalAliases| (integrators' +// alternative Dolt table name keys). +func (as *doltTableAdapterRegistry) AddAdapter(doltTable string, adapter TableAdapter, internalAliases ...string) { + for _, alias := range internalAliases { + as.internalAliases[alias] = doltTable } - as.adapterAliases[tableName] = tableName - as.Adapters[tableName] = adapter + as.Adapters[doltTable] = adapter } -// GetAdapter gets a Dolt TableAdapter mapped to |name|, which can be an alias or the table name. -func (as *doltTableAdapterRegistry) GetAdapter(name string) TableAdapter { - name = as.adapterAliases[name] - return as.Adapters[name] +// GetAdapter gets a Dolt TableAdapter mapped to |name|, which can be the dolt table name or internal alias. +func (as *doltTableAdapterRegistry) GetAdapter(name string) (TableAdapter, bool) { + adapter, ok := as.Adapters[name] + if !ok { + name = as.internalAliases[name] + adapter, ok = as.Adapters[name] + } + + return adapter, ok } -// GetTableName gets the Dolt table name mapped to |name|, which can be an alias or the table name. -func (as *doltTableAdapterRegistry) GetTableName(name string) string { - return as.adapterAliases[name] +// NormalizeName normalizes |name| if it's an internal alias to the correct Dolt table name, if not match is found the +// |name| is returned as is. +func (as *doltTableAdapterRegistry) NormalizeName(name string) string { + doltTableName, ok := as.internalAliases[name] + if !ok { + return name + } + + return doltTableName } diff --git a/go/libraries/doltcore/sqle/database.go b/go/libraries/doltcore/sqle/database.go index b5de773700..24597295d5 100644 --- a/go/libraries/doltcore/sqle/database.go +++ b/go/libraries/doltcore/sqle/database.go @@ -619,7 +619,7 @@ func (db Database) getTableInsensitiveWithRoot(ctx *sql.Context, head *doltdb.Co var dt sql.Table found := false tname := doltdb.TableName{Name: lwrName, Schema: db.schemaName} - switch lwrName { + switch adapters.DoltTableAdapterRegistry.NormalizeName(lwrName) { case doltdb.GetLogTableName(), doltdb.LogTableName: isDoltgresSystemTable, err := resolve.IsDoltgresSystemTable(ctx, tname, root) if err != nil { @@ -748,7 +748,7 @@ func (db Database) getTableInsensitiveWithRoot(ctx *sql.Context, head *doltdb.Co if !resolve.UseSearchPath || isDoltgresSystemTable { dt, found = dtables.NewCommitAncestorsTable(ctx, db.Name(), lwrName, db.ddb), true } - case doltdb.StatusTableName, adapters.DoltTableAdapterRegistry.GetTableName(doltdb.StatusTableName): + case doltdb.StatusTableName: isDoltgresSystemTable, err := resolve.IsDoltgresSystemTable(ctx, tname, root) if err != nil { return nil, false, err @@ -804,8 +804,8 @@ func (db Database) getTableInsensitiveWithRoot(ctx *sql.Context, head *doltdb.Co rootsProvider = nil } } - adapter := adapters.DoltTableAdapterRegistry.GetAdapter(lwrName) - dt, found = adapter.CreateTable(ctx, lwrName, db.ddb, ws, rootsProvider), true + + dt, found = dtables.NewStatusTableWithAdapter(ctx, lwrName, db.ddb, ws, rootsProvider), true } case doltdb.MergeStatusTableName, doltdb.GetMergeStatusTableName(): isDoltgresSystemTable, err := resolve.IsDoltgresSystemTable(ctx, tname, root) diff --git a/go/libraries/doltcore/sqle/dtables/status_table.go b/go/libraries/doltcore/sqle/dtables/status_table.go index e787d37618..029b421278 100644 --- a/go/libraries/doltcore/sqle/dtables/status_table.go +++ b/go/libraries/doltcore/sqle/dtables/status_table.go @@ -31,28 +31,6 @@ import ( const statusDefaultRowCount = 10 -func init() { - adapters.DoltTableAdapterRegistry.AddAdapter(doltdb.StatusTableName, DoltStatusTableAdapter{}) -} - -// DoltStatusTableAdapter serves as the default [dtables.StatusTable] implementation, applying zero modifications. It -// exists in case no adapters are initialized by an integrator for the Dolt status table, i.e. go-mysql-server. -// -// DoltStatusTableAdapter implements the [adapters.TableAdapter] interface. -type DoltStatusTableAdapter struct{} - -var _ adapters.TableAdapter = DoltStatusTableAdapter{} - -// CreateTable returns the default constructor [NewStatusTable], applying zero modifications. -func (d DoltStatusTableAdapter) CreateTable(ctx *sql.Context, tableName string, dDb *doltdb.DoltDB, workingSet *doltdb.WorkingSet, rootsProvider env.RootsProvider[*sql.Context]) sql.Table { - return NewStatusTable(ctx, tableName, dDb, workingSet, rootsProvider) -} - -// TableName returns the default name for the dolt_status table. -func (d DoltStatusTableAdapter) TableName() string { - return doltdb.StatusTableName -} - // StatusTable is a sql.Table implementation that implements a system table which shows the dolt branches type StatusTable struct { rootsProvider env.RootsProvider[*sql.Context] @@ -104,7 +82,16 @@ func (st StatusTable) PartitionRows(context *sql.Context, _ sql.Partition) (sql. return newStatusItr(context, &st) } -// NewStatusTable creates a StatusTable +// NewStatusTableWithAdapter creates a StatusTable +func NewStatusTableWithAdapter(ctx *sql.Context, tableName string, ddb *doltdb.DoltDB, ws *doltdb.WorkingSet, rp env.RootsProvider[*sql.Context]) sql.Table { + adapter, ok := adapters.DoltTableAdapterRegistry.GetAdapter(tableName) + if ok { + return adapter.NewTable(ctx, tableName, ddb, ws, rp) + } + + return NewStatusTable(ctx, tableName, ddb, ws, rp) +} + func NewStatusTable(_ *sql.Context, tableName string, ddb *doltdb.DoltDB, ws *doltdb.WorkingSet, rp env.RootsProvider[*sql.Context]) sql.Table { return &StatusTable{ tableName: tableName, From 921d8a8909fe91f66b9f67e3e4cbeb71c0d3f130 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 8 Dec 2025 04:55:10 -0800 Subject: [PATCH 06/12] amend func docs --- go/libraries/doltcore/sqle/adapters/table_adapter.go | 2 +- go/libraries/doltcore/sqle/dtables/status_table.go | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go/libraries/doltcore/sqle/adapters/table_adapter.go b/go/libraries/doltcore/sqle/adapters/table_adapter.go index c41e423be0..0a5b1e069d 100644 --- a/go/libraries/doltcore/sqle/adapters/table_adapter.go +++ b/go/libraries/doltcore/sqle/adapters/table_adapter.go @@ -58,7 +58,7 @@ func (as *doltTableAdapterRegistry) GetAdapter(name string) (TableAdapter, bool) return adapter, ok } -// NormalizeName normalizes |name| if it's an internal alias to the correct Dolt table name, if not match is found the +// NormalizeName normalizes |name| if it's an internal alias to the correct Dolt table name, if no match is found the // |name| is returned as is. func (as *doltTableAdapterRegistry) NormalizeName(name string) string { doltTableName, ok := as.internalAliases[name] diff --git a/go/libraries/doltcore/sqle/dtables/status_table.go b/go/libraries/doltcore/sqle/dtables/status_table.go index 029b421278..c9fff65125 100644 --- a/go/libraries/doltcore/sqle/dtables/status_table.go +++ b/go/libraries/doltcore/sqle/dtables/status_table.go @@ -82,7 +82,8 @@ func (st StatusTable) PartitionRows(context *sql.Context, _ sql.Partition) (sql. return newStatusItr(context, &st) } -// NewStatusTableWithAdapter creates a StatusTable +// NewStatusTableWithAdapter creates a new StatusTable using either an integrators' [adapters.TableAdapter] or the +// default [NewStatusTable] constructor. func NewStatusTableWithAdapter(ctx *sql.Context, tableName string, ddb *doltdb.DoltDB, ws *doltdb.WorkingSet, rp env.RootsProvider[*sql.Context]) sql.Table { adapter, ok := adapters.DoltTableAdapterRegistry.GetAdapter(tableName) if ok { @@ -92,6 +93,7 @@ func NewStatusTableWithAdapter(ctx *sql.Context, tableName string, ddb *doltdb.D return NewStatusTable(ctx, tableName, ddb, ws, rp) } +// NewStatusTable returns a new StatusTable. func NewStatusTable(_ *sql.Context, tableName string, ddb *doltdb.DoltDB, ws *doltdb.WorkingSet, rp env.RootsProvider[*sql.Context]) sql.Table { return &StatusTable{ tableName: tableName, From 6990d48af46a82ca56c8c83d736f0d2613210d05 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 8 Dec 2025 11:46:57 -0800 Subject: [PATCH 07/12] fix generated system table name set to use adapter names conditionally --- go/libraries/doltcore/doltdb/system_table.go | 2 ++ .../doltcore/sqle/adapters/table_adapter.go | 19 ++++++++-------- go/libraries/doltcore/sqle/database.go | 2 +- .../doltcore/sqle/dtables/status_table.go | 12 +++++----- .../doltcore/sqle/resolve/system_tables.go | 22 +++++++++---------- 5 files changed, 30 insertions(+), 27 deletions(-) diff --git a/go/libraries/doltcore/doltdb/system_table.go b/go/libraries/doltcore/doltdb/system_table.go index 8dd79b68b5..9701487a00 100644 --- a/go/libraries/doltcore/doltdb/system_table.go +++ b/go/libraries/doltcore/doltdb/system_table.go @@ -160,6 +160,8 @@ func GeneratedSystemTableNames() []string { GetBackupsTableName(), GetStashesTableName(), GetBranchActivityTableName(), + // [dtables.StatusTable] now uses [adapters.DoltTableAdapterRegistry] in its constructor for Doltgres. + StatusTableName, } } diff --git a/go/libraries/doltcore/sqle/adapters/table_adapter.go b/go/libraries/doltcore/sqle/adapters/table_adapter.go index 0a5b1e069d..12c1db1dad 100644 --- a/go/libraries/doltcore/sqle/adapters/table_adapter.go +++ b/go/libraries/doltcore/sqle/adapters/table_adapter.go @@ -23,8 +23,10 @@ type TableAdapter interface { var DoltTableAdapterRegistry = newDoltTableAdapterRegistry() -// doltTableAdapterRegistry is a TableAdapter registry for Dolt tables, keyed by the table's original name. It is -// populated during package initialization by integrators and intended to be read-only thereafter. +// doltTableAdapterRegistry is a Dolt table name to TableAdapter map. Integrators populate this registry during package +// initialization, and it's intended to be read-only thereafter. The registry links with existing Dolt system tables to +// allow them to be resolved and evaluated to integrator's version and internal aliases (integrators' Dolt table name +// keys). type doltTableAdapterRegistry struct { Adapters map[string]TableAdapter internalAliases map[string]string @@ -38,13 +40,12 @@ func newDoltTableAdapterRegistry() *doltTableAdapterRegistry { } } -// AddAdapter adds a TableAdapter to the Dolt table adapter registry with optional |internalAliases| (integrators' -// alternative Dolt table name keys). -func (as *doltTableAdapterRegistry) AddAdapter(doltTable string, adapter TableAdapter, internalAliases ...string) { +// AddAdapter maps |doltTableName| to an |adapter| in the Dolt table adapter registry, with optional |internalAliases|. +func (as *doltTableAdapterRegistry) AddAdapter(doltTableName string, adapter TableAdapter, internalAliases ...string) { for _, alias := range internalAliases { - as.internalAliases[alias] = doltTable + as.internalAliases[alias] = doltTableName } - as.Adapters[doltTable] = adapter + as.Adapters[doltTableName] = adapter } // GetAdapter gets a Dolt TableAdapter mapped to |name|, which can be the dolt table name or internal alias. @@ -58,8 +59,8 @@ func (as *doltTableAdapterRegistry) GetAdapter(name string) (TableAdapter, bool) return adapter, ok } -// NormalizeName normalizes |name| if it's an internal alias to the correct Dolt table name, if no match is found the -// |name| is returned as is. +// NormalizeName normalizes |name| if it's an internal alias of the underlying Dolt table name. If no match is found, +// |name| is returned as-is. func (as *doltTableAdapterRegistry) NormalizeName(name string) string { doltTableName, ok := as.internalAliases[name] if !ok { diff --git a/go/libraries/doltcore/sqle/database.go b/go/libraries/doltcore/sqle/database.go index 24597295d5..21265602a6 100644 --- a/go/libraries/doltcore/sqle/database.go +++ b/go/libraries/doltcore/sqle/database.go @@ -805,7 +805,7 @@ func (db Database) getTableInsensitiveWithRoot(ctx *sql.Context, head *doltdb.Co } } - dt, found = dtables.NewStatusTableWithAdapter(ctx, lwrName, db.ddb, ws, rootsProvider), true + dt, found = dtables.NewStatusTable(ctx, lwrName, db.ddb, ws, rootsProvider), true } case doltdb.MergeStatusTableName, doltdb.GetMergeStatusTableName(): isDoltgresSystemTable, err := resolve.IsDoltgresSystemTable(ctx, tname, root) diff --git a/go/libraries/doltcore/sqle/dtables/status_table.go b/go/libraries/doltcore/sqle/dtables/status_table.go index c9fff65125..fa39aa32ea 100644 --- a/go/libraries/doltcore/sqle/dtables/status_table.go +++ b/go/libraries/doltcore/sqle/dtables/status_table.go @@ -82,19 +82,19 @@ func (st StatusTable) PartitionRows(context *sql.Context, _ sql.Partition) (sql. return newStatusItr(context, &st) } -// NewStatusTableWithAdapter creates a new StatusTable using either an integrators' [adapters.TableAdapter] or the -// default [NewStatusTable] constructor. -func NewStatusTableWithAdapter(ctx *sql.Context, tableName string, ddb *doltdb.DoltDB, ws *doltdb.WorkingSet, rp env.RootsProvider[*sql.Context]) sql.Table { +// NewStatusTable creates a new StatusTable using either an integrators' [adapters.TableAdapter] or the default +// [NewStatusTableWithNoAdapter] constructor (Dolt table default implementation). +func NewStatusTable(ctx *sql.Context, tableName string, ddb *doltdb.DoltDB, ws *doltdb.WorkingSet, rp env.RootsProvider[*sql.Context]) sql.Table { adapter, ok := adapters.DoltTableAdapterRegistry.GetAdapter(tableName) if ok { return adapter.NewTable(ctx, tableName, ddb, ws, rp) } - return NewStatusTable(ctx, tableName, ddb, ws, rp) + return NewStatusTableWithNoAdapter(ctx, tableName, ddb, ws, rp) } -// NewStatusTable returns a new StatusTable. -func NewStatusTable(_ *sql.Context, tableName string, ddb *doltdb.DoltDB, ws *doltdb.WorkingSet, rp env.RootsProvider[*sql.Context]) sql.Table { +// NewStatusTableWithNoAdapter returns a new StatusTable. +func NewStatusTableWithNoAdapter(_ *sql.Context, tableName string, ddb *doltdb.DoltDB, ws *doltdb.WorkingSet, rp env.RootsProvider[*sql.Context]) sql.Table { return &StatusTable{ tableName: tableName, ddb: ddb, diff --git a/go/libraries/doltcore/sqle/resolve/system_tables.go b/go/libraries/doltcore/sqle/resolve/system_tables.go index c2c8448c12..3d8c777795 100755 --- a/go/libraries/doltcore/sqle/resolve/system_tables.go +++ b/go/libraries/doltcore/sqle/resolve/system_tables.go @@ -27,19 +27,19 @@ func GetGeneratedSystemTables(ctx context.Context, root doltdb.RootValue) ([]dol s := doltdb.NewTableNameSet(nil) // Depending on whether the search path is used, the generated system tables will either be in the dolt namespace - // or the empty (default) namespace - if !UseSearchPath { - for _, t := range doltdb.GeneratedSystemTableNames() { - s.Add(doltdb.TableName{Name: t}) + // or the empty (default) namespace. + for _, tableName := range doltdb.GeneratedSystemTableNames() { + adapter, ok := adapters.DoltTableAdapterRegistry.Adapters[tableName] + if ok { + tableName = adapter.TableName() } - } else { - for _, t := range doltdb.GeneratedSystemTableNames() { - s.Add(doltdb.TableName{Name: t, Schema: doltdb.DoltNamespace}) - } - } - for _, adapter := range adapters.DoltTableAdapterRegistry.Adapters { - s.Add(doltdb.TableName{Name: adapter.TableName(), Schema: doltdb.DoltNamespace}) + tableUnique := doltdb.TableName{Name: tableName} + if UseSearchPath { + tableUnique.Schema = doltdb.DoltNamespace + } + + s.Add(tableUnique) } schemas, err := root.GetDatabaseSchemas(ctx) From f9ff5ed52f081bb825e91d940ccdcb4883444df6 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 8 Dec 2025 12:01:03 -0800 Subject: [PATCH 08/12] add test for Dolt table adapter registry --- .../sqle/adapters/table_adapter_test.go | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 go/libraries/doltcore/sqle/adapters/table_adapter_test.go diff --git a/go/libraries/doltcore/sqle/adapters/table_adapter_test.go b/go/libraries/doltcore/sqle/adapters/table_adapter_test.go new file mode 100644 index 0000000000..1d63792c68 --- /dev/null +++ b/go/libraries/doltcore/sqle/adapters/table_adapter_test.go @@ -0,0 +1,64 @@ +package adapters + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/dolthub/go-mysql-server/sql" + + "github.com/dolthub/dolt/go/libraries/doltcore/doltdb" + "github.com/dolthub/dolt/go/libraries/doltcore/env" +) + +type mockAdapter struct { + name string +} + +func (m mockAdapter) NewTable(_ *sql.Context, _ string, _ *doltdb.DoltDB, _ *doltdb.WorkingSet, _ env.RootsProvider[*sql.Context]) sql.Table { + return nil +} + +func (m mockAdapter) TableName() string { + return m.name +} + +func TestDoltTableAdapterRegistry(t *testing.T) { + registry := newDoltTableAdapterRegistry() + + statusAdapter := mockAdapter{name: "status"} + logAdapter := mockAdapter{name: "log"} + + registry.AddAdapter(doltdb.StatusTableName, statusAdapter, "status") + registry.AddAdapter(doltdb.LogTableName, logAdapter, "log") + + t.Run("GetAdapter", func(t *testing.T) { + adapter, ok := registry.GetAdapter("dolt_status") + require.True(t, ok) + require.Equal(t, "status", adapter.TableName()) + + adapter, ok = registry.GetAdapter("status") + require.True(t, ok) + require.Equal(t, "status", adapter.TableName()) + + _, ok = registry.GetAdapter("unknown_alias") + require.False(t, ok) + + _, ok = registry.GetAdapter("dolt_unknown") + require.False(t, ok) + }) + + t.Run("NormalizeName", func(t *testing.T) { + normalized := registry.NormalizeName("status") + require.Equal(t, "dolt_status", normalized) + + normalized = registry.NormalizeName("log") + require.Equal(t, "dolt_log", normalized) + + normalized = registry.NormalizeName("dolt_status") + require.Equal(t, "dolt_status", normalized) + + normalized = registry.NormalizeName("unknown_table") + require.Equal(t, "unknown_table", normalized) + }) +} From a17a3564b30c61ab75e85e1bbc608940b89179a8 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 8 Dec 2025 12:42:04 -0800 Subject: [PATCH 09/12] fix 'NewStatusTable' func doc --- go/libraries/doltcore/sqle/dtables/status_table.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/libraries/doltcore/sqle/dtables/status_table.go b/go/libraries/doltcore/sqle/dtables/status_table.go index fa39aa32ea..8213544981 100644 --- a/go/libraries/doltcore/sqle/dtables/status_table.go +++ b/go/libraries/doltcore/sqle/dtables/status_table.go @@ -82,8 +82,8 @@ func (st StatusTable) PartitionRows(context *sql.Context, _ sql.Partition) (sql. return newStatusItr(context, &st) } -// NewStatusTable creates a new StatusTable using either an integrators' [adapters.TableAdapter] or the default -// [NewStatusTableWithNoAdapter] constructor (Dolt table default implementation). +// NewStatusTable creates a new StatusTable using either an integrators' [adapters.TableAdapter] or the +// NewStatusTableWithNoAdapter constructor (the default implementation provided by Dolt). func NewStatusTable(ctx *sql.Context, tableName string, ddb *doltdb.DoltDB, ws *doltdb.WorkingSet, rp env.RootsProvider[*sql.Context]) sql.Table { adapter, ok := adapters.DoltTableAdapterRegistry.GetAdapter(tableName) if ok { From 16069d8889d6706d5f4f6329cc81dc63ca00bc13 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 8 Dec 2025 16:22:04 -0800 Subject: [PATCH 10/12] rename table_adapter.go -> table.go --- .../doltcore/sqle/adapters/{table_adapter.go => table.go} | 0 .../sqle/adapters/{table_adapter_test.go => table_test.go} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename go/libraries/doltcore/sqle/adapters/{table_adapter.go => table.go} (100%) rename go/libraries/doltcore/sqle/adapters/{table_adapter_test.go => table_test.go} (100%) diff --git a/go/libraries/doltcore/sqle/adapters/table_adapter.go b/go/libraries/doltcore/sqle/adapters/table.go similarity index 100% rename from go/libraries/doltcore/sqle/adapters/table_adapter.go rename to go/libraries/doltcore/sqle/adapters/table.go diff --git a/go/libraries/doltcore/sqle/adapters/table_adapter_test.go b/go/libraries/doltcore/sqle/adapters/table_test.go similarity index 100% rename from go/libraries/doltcore/sqle/adapters/table_adapter_test.go rename to go/libraries/doltcore/sqle/adapters/table_test.go From d956afb08a95348b0d629feaebd2ae3118175478 Mon Sep 17 00:00:00 2001 From: elianddb Date: Tue, 9 Dec 2025 03:30:19 -0800 Subject: [PATCH 11/12] rm privs check in dolt_purge_dropped_databases as it is already handled --- .../dolt_purge_dropped_databases.go | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/go/libraries/doltcore/sqle/dprocedures/dolt_purge_dropped_databases.go b/go/libraries/doltcore/sqle/dprocedures/dolt_purge_dropped_databases.go index 63919e0941..e899868291 100644 --- a/go/libraries/doltcore/sqle/dprocedures/dolt_purge_dropped_databases.go +++ b/go/libraries/doltcore/sqle/dprocedures/dolt_purge_dropped_databases.go @@ -27,11 +27,6 @@ func doltPurgeDroppedDatabases(ctx *sql.Context, args ...string) (sql.RowIter, e return nil, fmt.Errorf("dolt_purge_dropped_databases does not take any arguments") } - // Only allow admins to purge dropped databases - if err := checkDoltPurgeDroppedDatabasesPrivs(ctx); err != nil { - return nil, err - } - doltSession := dsess.DSessFromSess(ctx.Session) err := doltSession.Provider().PurgeDroppedDatabases(ctx) if err != nil { @@ -40,18 +35,3 @@ func doltPurgeDroppedDatabases(ctx *sql.Context, args ...string) (sql.RowIter, e return rowToIter(int64(cmdSuccess)), nil } - -// checkDoltPurgeDroppedDatabasesPrivs returns an error if the user requesting to purge dropped databases -// does not have SUPER access. Since this is a permanent and destructive operation, we restrict it to admins, -// even though the SUPER privilege has been deprecated, since there isn't another appropriate global privilege. -func checkDoltPurgeDroppedDatabasesPrivs(ctx *sql.Context) error { - privs, counter := ctx.GetPrivilegeSet() - if counter == 0 { - return fmt.Errorf("unable to check user privileges for dolt_purge_dropped_databases procedure") - } - if privs.Has(sql.PrivilegeType_Super) == false { - return sql.ErrPrivilegeCheckFailed.New(ctx.Session.Client().User) - } - - return nil -} From a354d667a05d6eeee2d2be77eb502ff7d644da1a Mon Sep 17 00:00:00 2001 From: elianddb Date: Wed, 10 Dec 2025 10:16:38 -0800 Subject: [PATCH 12/12] add copyright in adapters/table.go --- go/libraries/doltcore/sqle/adapters/table.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/go/libraries/doltcore/sqle/adapters/table.go b/go/libraries/doltcore/sqle/adapters/table.go index 12c1db1dad..de5fa3c209 100644 --- a/go/libraries/doltcore/sqle/adapters/table.go +++ b/go/libraries/doltcore/sqle/adapters/table.go @@ -1,3 +1,17 @@ +// Copyright 2025 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 adapters import (