Skip to content

Commit f9c77d3

Browse files
authored
Merge pull request #863 from dolthub/daylon/user-db
Added GRANT, REVOKE, Privilege Checking, Ownership, and persisting changes
2 parents 77c0f03 + 97ff62c commit f9c77d3

File tree

199 files changed

+7693
-5400
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

199 files changed

+7693
-5400
lines changed

server/analyzer/drop_table.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright 2024 Dolthub, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package analyzer
16+
17+
import (
18+
"github.com/dolthub/go-mysql-server/sql"
19+
"github.com/dolthub/go-mysql-server/sql/analyzer"
20+
"github.com/dolthub/go-mysql-server/sql/plan"
21+
"github.com/dolthub/go-mysql-server/sql/transform"
22+
23+
pgnodes "github.com/dolthub/doltgresql/server/node"
24+
)
25+
26+
// ReplaceDropTable wraps a DropTable node so that it can handle ownership information.
27+
func ReplaceDropTable(ctx *sql.Context, a *analyzer.Analyzer, node sql.Node, scope *plan.Scope, selector analyzer.RuleSelector, qFlags *sql.QueryFlags) (sql.Node, transform.TreeIdentity, error) {
28+
dropTable, ok := node.(*plan.DropTable)
29+
if !ok {
30+
return node, transform.SameTree, nil
31+
}
32+
return pgnodes.NewDropTable(dropTable), transform.NewTree, nil
33+
}

server/analyzer/handle_disjointed_nodes.go

Lines changed: 0 additions & 47 deletions
This file was deleted.

server/analyzer/init.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,22 @@ import (
2020
"github.com/dolthub/go-mysql-server/sql/analyzer"
2121
)
2222

23+
// IDs are basically arbitrary, we just need to ensure that they do not conflict with existing IDs
2324
const (
2425
ruleId_TypeSanitizer analyzer.RuleId = iota + 1000
2526
ruleId_AddDomainConstraints
2627
ruleId_AssignInsertCasts
2728
ruleId_AssignUpdateCasts
2829
ruleId_ReplaceIndexedTables
2930
ruleId_ReplaceSerial
31+
ruleId_ReplaceDropTable
3032
ruleId_AddImplicitPrefixLengths
3133
ruleId_InsertContextRootFinalizer
3234
ruleId_ResolveType
3335
)
3436

3537
// Init adds additional rules to the analyzer to handle Doltgres-specific functionality.
3638
func Init() {
37-
// IDs are basically arbitrary, we just need to ensure that they do not conflict with existing IDs
3839
analyzer.AlwaysBeforeDefault = append(analyzer.AlwaysBeforeDefault,
3940
analyzer.Rule{Id: ruleId_ResolveType, Apply: ResolveType},
4041
analyzer.Rule{Id: ruleId_TypeSanitizer, Apply: TypeSanitizer},
@@ -57,6 +58,7 @@ func Init() {
5758

5859
analyzer.OnceAfterDefault = append(analyzer.OnceAfterDefault,
5960
analyzer.Rule{Id: ruleId_ReplaceSerial, Apply: ReplaceSerial},
61+
analyzer.Rule{Id: ruleId_ReplaceDropTable, Apply: ReplaceDropTable},
6062
)
6163

6264
// The auto-commit rule writes the contents of the context, so we need to insert our finalizer before that

server/analyzer/serial.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,5 @@ func ReplaceSerial(ctx *sql.Context, a *analyzer.Analyzer, node sql.Node, scope
121121
}
122122
}
123123
}
124-
if len(ctSequences) == 0 {
125-
return node, transform.SameTree, nil
126-
}
127124
return pgnodes.NewCreateTable(createTable, ctSequences), transform.NewTree, nil
128125
}

server/analyzer/type_sanitizer.go

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,15 @@ import (
3030

3131
pgexprs "github.com/dolthub/doltgresql/server/expression"
3232
"github.com/dolthub/doltgresql/server/functions/framework"
33+
pgtransform "github.com/dolthub/doltgresql/server/transform"
3334
pgtypes "github.com/dolthub/doltgresql/server/types"
3435
)
3536

3637
// TypeSanitizer converts all GMS types into Doltgres types. Some places, such as parameter binding, will always default
3738
// to GMS types, so by taking care of all conversions here, we can ensure that Doltgres only needs to worry about its
3839
// own types.
3940
func TypeSanitizer(ctx *sql.Context, a *analyzer.Analyzer, node sql.Node, scope *plan.Scope, selector analyzer.RuleSelector, qFlags *sql.QueryFlags) (sql.Node, transform.TreeIdentity, error) {
40-
node, nodeSame, err := transform.NodeWithOpaque(node, func(node sql.Node) (sql.Node, transform.TreeIdentity, error) {
41-
if disjointedNode, ok := node.(plan.DisjointedChildrenNode); ok {
42-
return handleDisjointedNodes(ctx, a, disjointedNode, scope, selector, TypeSanitizer, qFlags)
43-
}
44-
return node, transform.SameTree, nil
45-
})
46-
if err != nil {
47-
return nil, transform.NewTree, err
48-
}
49-
node, exprsSame, err := transform.NodeExprsWithOpaque(node, func(expr sql.Expression) (sql.Expression, transform.TreeIdentity, error) {
41+
return pgtransform.NodeExprsWithOpaque(node, func(expr sql.Expression) (sql.Expression, transform.TreeIdentity, error) {
5042
// This can be updated if we find more expressions that return GMS types.
5143
// These should eventually be replaced with Doltgres-equivalents over time, rendering this function unnecessary.
5244
switch expr := expr.(type) {
@@ -88,10 +80,6 @@ func TypeSanitizer(ctx *sql.Context, a *analyzer.Analyzer, node sql.Node, scope
8880
}
8981
return expr, transform.SameTree, nil
9082
})
91-
if err != nil {
92-
return nil, transform.NewTree, err
93-
}
94-
return node, nodeSame && exprsSame, nil
9583
}
9684

9785
// typeSanitizerLiterals handles literal expressions for TypeSanitizer.

server/ast/aliased_table_expr.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,34 @@ import (
2020
vitess "github.com/dolthub/vitess/go/vt/sqlparser"
2121

2222
"github.com/dolthub/doltgresql/postgres/parser/sem/tree"
23+
"github.com/dolthub/doltgresql/server/auth"
2324
)
2425

2526
// nodeAliasedTableExpr handles *tree.AliasedTableExpr nodes.
26-
func nodeAliasedTableExpr(node *tree.AliasedTableExpr) (*vitess.AliasedTableExpr, error) {
27+
func nodeAliasedTableExpr(ctx *Context, node *tree.AliasedTableExpr) (*vitess.AliasedTableExpr, error) {
2728
if node.Ordinality {
2829
return nil, fmt.Errorf("ordinality is not yet supported")
2930
}
3031
if node.IndexFlags != nil {
3132
return nil, fmt.Errorf("index flags are not yet supported")
3233
}
3334
var aliasExpr vitess.SimpleTableExpr
35+
var authInfo vitess.AuthInformation
3436

3537
switch expr := node.Expr.(type) {
3638
case *tree.TableName:
37-
var err error
38-
aliasExpr, err = nodeTableName(expr)
39+
tableName, err := nodeTableName(ctx, expr)
3940
if err != nil {
4041
return nil, err
4142
}
43+
aliasExpr = tableName
44+
authInfo = vitess.AuthInformation{
45+
AuthType: ctx.Auth().PeekAuthType(),
46+
TargetType: auth.AuthTargetType_SingleTableIdentifier,
47+
TargetNames: []string{tableName.SchemaQualifier.String(), tableName.Name.String()},
48+
}
4249
case *tree.Subquery:
43-
tableExpr, err := nodeTableExpr(expr)
50+
tableExpr, err := nodeTableExpr(ctx, expr)
4451
if err != nil {
4552
return nil, err
4653
}
@@ -92,7 +99,7 @@ func nodeAliasedTableExpr(node *tree.AliasedTableExpr) (*vitess.AliasedTableExpr
9299
}
93100
aliasExpr = subquery
94101
case *tree.RowsFromExpr:
95-
tableExpr, err := nodeTableExpr(expr)
102+
tableExpr, err := nodeTableExpr(ctx, expr)
96103
if err != nil {
97104
return nil, err
98105
}
@@ -119,7 +126,7 @@ func nodeAliasedTableExpr(node *tree.AliasedTableExpr) (*vitess.AliasedTableExpr
119126

120127
var asOf *vitess.AsOf
121128
if node.AsOf != nil {
122-
asOfExpr, err := nodeExpr(node.AsOf.Expr)
129+
asOfExpr, err := nodeExpr(ctx, node.AsOf.Expr)
123130
if err != nil {
124131
return nil, err
125132
}
@@ -134,5 +141,6 @@ func nodeAliasedTableExpr(node *tree.AliasedTableExpr) (*vitess.AliasedTableExpr
134141
As: vitess.NewTableIdent(alias),
135142
AsOf: asOf,
136143
Lateral: node.Lateral,
144+
Auth: authInfo,
137145
}, nil
138146
}

server/ast/alter_aggregate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ import (
2323
)
2424

2525
// nodeAlterAggregate handles *tree.AlterAggregate nodes.
26-
func nodeAlterAggregate(node *tree.AlterAggregate) (vitess.Statement, error) {
26+
func nodeAlterAggregate(ctx *Context, node *tree.AlterAggregate) (vitess.Statement, error) {
2727
if node == nil {
2828
return nil, nil
2929
}
30-
if err := validateAggArgMode(node.AggSig.Args, node.AggSig.OrderByArgs); err != nil {
30+
if err := validateAggArgMode(ctx, node.AggSig.Args, node.AggSig.OrderByArgs); err != nil {
3131
return nil, err
3232
}
3333
return nil, fmt.Errorf("ALTER AGGREGATE is not yet supported")

server/ast/alter_database.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
)
2424

2525
// nodeAlterDatabase handles *tree.AlterDatabase nodes.
26-
func nodeAlterDatabase(node *tree.AlterDatabase) (vitess.Statement, error) {
26+
func nodeAlterDatabase(ctx *Context, node *tree.AlterDatabase) (vitess.Statement, error) {
2727
if node == nil {
2828
return nil, nil
2929
}

server/ast/alter_function.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ import (
2323
)
2424

2525
// nodeAlterFunction handles *tree.AlterFunction nodes.
26-
func nodeAlterFunction(node *tree.AlterFunction) (vitess.Statement, error) {
27-
err := verifyRedundantRoutineOption(node.Options)
26+
func nodeAlterFunction(ctx *Context, node *tree.AlterFunction) (vitess.Statement, error) {
27+
err := verifyRedundantRoutineOption(ctx, node.Options)
2828
if err != nil {
2929
return nil, err
3030
}

server/ast/alter_index.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
)
2424

2525
// nodeAlterIndex handles *tree.AlterIndex nodes.
26-
func nodeAlterIndex(node *tree.AlterIndex) (vitess.Statement, error) {
26+
func nodeAlterIndex(ctx *Context, node *tree.AlterIndex) (vitess.Statement, error) {
2727
if node == nil {
2828
return nil, nil
2929
}

server/ast/alter_procedure.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ import (
2323
)
2424

2525
// nodeAlterProcedure handles *tree.AlterProcedure nodes.
26-
func nodeAlterProcedure(node *tree.AlterProcedure) (vitess.Statement, error) {
27-
err := verifyRedundantRoutineOption(node.Options)
26+
func nodeAlterProcedure(ctx *Context, node *tree.AlterProcedure) (vitess.Statement, error) {
27+
err := verifyRedundantRoutineOption(ctx, node.Options)
2828
if err != nil {
2929
return nil, err
3030
}

server/ast/alter_role.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
)
2727

2828
// nodeAlterRole handles *tree.AlterRole nodes.
29-
func nodeAlterRole(node *tree.AlterRole) (vitess.Statement, error) {
29+
func nodeAlterRole(ctx *Context, node *tree.AlterRole) (vitess.Statement, error) {
3030
if node == nil {
3131
return nil, nil
3232
}

server/ast/alter_schema.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
)
2424

2525
// nodeAlterSchema handles *tree.AlterSchema nodes.
26-
func nodeAlterSchema(node *tree.AlterSchema) (vitess.Statement, error) {
26+
func nodeAlterSchema(ctx *Context, node *tree.AlterSchema) (vitess.Statement, error) {
2727
if node == nil {
2828
return nil, nil
2929
}

server/ast/alter_sequence.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
)
2424

2525
// nodeAlterSequence handles *tree.AlterSequence nodes.
26-
func nodeAlterSequence(node *tree.AlterSequence) (vitess.Statement, error) {
26+
func nodeAlterSequence(ctx *Context, node *tree.AlterSequence) (vitess.Statement, error) {
2727
if node == nil {
2828
return nil, nil
2929
}

0 commit comments

Comments
 (0)