From d411242eddf60ec36d9cbec01c4b929583a99dc7 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 1 Dec 2025 18:27:43 -0800 Subject: [PATCH 1/4] amend dolt_backup doltgresql privs check to server only --- .../doltcore/sqle/dprocedures/dolt_backup.go | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go b/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go index 30d136b722..75c6a40b2e 100644 --- a/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go +++ b/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go @@ -65,11 +65,11 @@ func doltBackup(ctx *sql.Context, args ...string) (sql.RowIter, error) { return nil, err } - // 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 sqlserver.RunningInServerMode() { + privileges, counter := ctx.GetPrivilegeSet() + if counter == 0 || !privileges.Has(sql.PrivilegeType_Super) { + return nil, sql.ErrPrivilegeCheckFailed.New(ctx.Session.Client().User) + } } apr, err := cli.CreateBackupArgParser().Parse(args) @@ -77,8 +77,16 @@ func doltBackup(ctx *sql.Context, args ...string) (sql.RowIter, error) { return nil, err } - if sqlserver.RunningInServerMode() && apr.ContainsAny(cli.AwsParams...) { - return nil, fmt.Errorf("AWS parameters are unavailable when running in server mode") + 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 apr.NArg() == 0 || (apr.NArg() == 1 && apr.Contains(cli.VerboseFlag)) { From 802f48c80aacb78446dcc73072cb49b46aef7249 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 1 Dec 2025 19:10:44 -0800 Subject: [PATCH 2/4] add driver like env test --- .../sqle/enginetest/dolt_engine_test.go | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go b/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go index 2351b198bb..1c6657c8bc 100644 --- a/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go @@ -2201,3 +2201,35 @@ func TestBranchActivity(t *testing.T) { defer h.Close() RunBranchActivityTests(t, h) } + +// TestDriverExecution verifies that queries work in dolt driver, where the MySQLDb is not initialized. +func TestDriverExecution(t *testing.T) { + h := newDoltHarness(t) + defer h.Close() + + engine, err := h.NewEngine(t) + if err != nil { + t.Fatal(err) + } + defer engine.Close() + + // Simulate driver environment. The MySQLDb is initialized but with no users (not even root). The context user is + // "root" still though. This mimics the dolthub/driver initialization of the engine (no PrivFilePath provided). + engine.EngineAnalyzer().Catalog.MySQLDb = mysql_db.CreateEmptyMySQLDb() + ctx := enginetest.NewContextWithClient(h, sql.Client{ + User: "root", + Address: "localhost", + }) + + q := "call dolt_backup('add', 'backup1', 'file:///tmp/backup1');" + enginetest.TestQueryWithContext(t, ctx, engine, h, q, []sql.Row{{0}}, nil, nil, nil) + + q = "select name from dolt_backups where name = 'backup1'" + enginetest.TestQueryWithContext(t, ctx, engine, h, q, []sql.Row{{"backup1"}}, nil, nil, nil) + + q = "call dolt_backup('sync-url', 'file:///tmp/backup_sync_url');" + enginetest.TestQueryWithContext(t, ctx, engine, h, q, []sql.Row{{0}}, nil, nil, nil) + + q = "call dolt_backup('remove', 'backup1');" + enginetest.TestQueryWithContext(t, ctx, engine, h, q, []sql.Row{{0}}, nil, nil, nil) +} From aceb329a056babf5d2891beb7d69f63ea28fe10a Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 1 Dec 2025 19:49:38 -0800 Subject: [PATCH 3/4] amend elixir docker image to locked ver. 1.18.3 --- integration-tests/mysql-client-tests/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-tests/mysql-client-tests/Dockerfile b/integration-tests/mysql-client-tests/Dockerfile index f615aa9afe..8e47ae4f43 100644 --- a/integration-tests/mysql-client-tests/Dockerfile +++ b/integration-tests/mysql-client-tests/Dockerfile @@ -80,7 +80,7 @@ RUN pyinstaller --onefile --collect-all mysql.connector sqlalchemy-test.py RUN pyinstaller --onefile --collect-all mysql.connector mysql-connector-test.py RUN pyinstaller --onefile mariadb-connector-test.py -FROM elixir:1.18-slim AS elixir_clients_build +FROM elixir:1.18.3-slim AS elixir_clients_build RUN apt-get update && apt-get install -y ca-certificates xz-utils curl && rm -rf /var/lib/apt/lists/* RUN curl -sSL https://ziglang.org/download/0.14.1/zig-x86_64-linux-0.14.1.tar.xz | tar -xJ ENV PATH="/zig-x86_64-linux-0.14.1:${PATH}" From 52e5598b76bb17eb7dee52d02f6720d42b5e2250 Mon Sep 17 00:00:00 2001 From: elianddb Date: Mon, 1 Dec 2025 20:00:36 -0800 Subject: [PATCH 4/4] rm extra func and add local file sys flag --- go/libraries/doltcore/sqle/dprocedures/dolt_backup.go | 7 ------- go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go | 1 + 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go b/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go index 75c6a40b2e..d0d48abf74 100644 --- a/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go +++ b/go/libraries/doltcore/sqle/dprocedures/dolt_backup.go @@ -65,13 +65,6 @@ func doltBackup(ctx *sql.Context, args ...string) (sql.RowIter, error) { return nil, err } - if sqlserver.RunningInServerMode() { - privileges, counter := ctx.GetPrivilegeSet() - if counter == 0 || !privileges.Has(sql.PrivilegeType_Super) { - return nil, sql.ErrPrivilegeCheckFailed.New(ctx.Session.Client().User) - } - } - apr, err := cli.CreateBackupArgParser().Parse(args) if err != nil { return nil, err diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go b/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go index 1c6657c8bc..ccacb340ae 100644 --- a/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go @@ -2205,6 +2205,7 @@ func TestBranchActivity(t *testing.T) { // TestDriverExecution verifies that queries work in dolt driver, where the MySQLDb is not initialized. func TestDriverExecution(t *testing.T) { h := newDoltHarness(t) + h.UseLocalFileSystem() defer h.Close() engine, err := h.NewEngine(t)