Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions _example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ func createTestDatabase() *memory.DbProvider {
pro := memory.NewDBProvider(db)
session := memory.NewSession(sql.NewBaseSession(), pro)
ctx := sql.NewContext(context.Background(), sql.WithSession(session))
ctx.Session = session

table := memory.NewTable(db, tableName, sql.NewPrimaryKeySchema(sql.Schema{
{Name: "name", Type: types.Text, Nullable: false, Source: tableName, PrimaryKey: true},
Expand Down
2 changes: 1 addition & 1 deletion driver/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ func (d *Driver) OpenConnector(dsn string) (driver.Connector, error) {
d.mu.Lock()
db, ok := d.dbs[serverName]
if !ok {
anlz := analyzer.NewDefaultWithVersion(pro)
anlz := analyzer.NewDefault(pro)
engine := sqle.New(anlz, nil)
db = &dbConn{engine: engine}
d.dbs[serverName] = db
Expand Down
17 changes: 10 additions & 7 deletions engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,10 @@ func New(a *analyzer.Analyzer, cfg *Config) *Engine {
}

a.Catalog.RegisterFunction(emptyCtx, function.GetLockingFuncs(ls)...)
parser := sql.DefaultMySQLParser
if a.Overrides.Builder.Parser != nil {
parser = a.Overrides.Builder.Parser
}

ret := &Engine{
Analyzer: a,
Expand All @@ -194,7 +198,7 @@ func New(a *analyzer.Analyzer, cfg *Config) *Engine {
PreparedDataCache: NewPreparedDataCache(),
mu: &sync.Mutex{},
EventScheduler: nil,
Parser: sql.GlobalParser,
Parser: parser,
}
ret.ReadOnly.Store(cfg.IsReadOnly)
a.Runner = ret
Expand All @@ -203,16 +207,15 @@ func New(a *analyzer.Analyzer, cfg *Config) *Engine {

// NewDefault creates a new default Engine.
func NewDefault(pro sql.DatabaseProvider) *Engine {
a := analyzer.NewDefaultWithVersion(pro)
return New(a, nil)
return New(analyzer.NewDefault(pro), nil)
}

// AnalyzeQuery analyzes a query and returns its sql.Node
func (e *Engine) AnalyzeQuery(
ctx *sql.Context,
query string,
) (sql.Node, error) {
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler, e.Parser)
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler)
parsed, _, _, qFlags, err := binder.Parse(query, nil, false)
if err != nil {
return nil, err
Expand Down Expand Up @@ -243,7 +246,7 @@ func (e *Engine) PrepareParsedQuery(
// Make sure there is an active transaction if one hasn't been started yet
e.beginTransaction(ctx)

binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler, e.Parser)
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler)
node, _, err := binder.BindOnly(stmt, query, nil)

if err != nil {
Expand Down Expand Up @@ -526,7 +529,7 @@ func (e *Engine) BoundQueryPlan(ctx *sql.Context, query string, parsed sqlparser

query = sql.RemoveSpaceAndDelimiter(query, ';')

binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler, e.Parser)
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler)
binder.SetBindings(bindings)

// Begin a transaction if necessary (no-op if one is in flight)
Expand Down Expand Up @@ -580,7 +583,7 @@ func (e *Engine) preparedStatement(ctx *sql.Context, query string, parsed sqlpar
preparedAst, preparedDataFound = e.PreparedDataCache.GetCachedStmt(ctx.Session.ID(), query)
}

binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler, e.Parser)
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler)
if preparedDataFound {
parsed = preparedAst
binder.SetBindings(bindings)
Expand Down
2 changes: 1 addition & 1 deletion engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ func TestTrackProcess(t *testing.T) {
_, ok = rhs.Table.(*plan.ProcessTable)
require.True(ok)

iter, err := rowexec.DefaultBuilder.Build(ctx, result, nil)
iter, err := rowexec.NewBuilder(nil, sql.EngineOverrides{}).Build(ctx, result, nil)
require.NoError(err)
iter, _, err = rowexec.FinalizeIters(ctx, result, nil, iter)
require.NoError(err)
Expand Down
14 changes: 7 additions & 7 deletions enginetest/engine_only_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ func TestShowProcessList(t *testing.T) {

n := plan.NewShowProcessList()

iter, err := rowexec.DefaultBuilder.Build(ctx, n, nil)
iter, err := rowexec.NewBuilder(nil, sql.EngineOverrides{}).Build(ctx, n, nil)
require.NoError(err)
rows, err := sql.RowIterToRows(ctx, iter)
require.NoError(err)
Expand Down Expand Up @@ -327,9 +327,9 @@ func TestLockTables(t *testing.T) {
{plan.NewResolvedTable(t1, nil, nil), true},
{plan.NewResolvedTable(t2, nil, nil), false},
})
node.Catalog = analyzer.NewCatalog(sql.NewDatabaseProvider())
node.Catalog = analyzer.NewCatalog(sql.NewDatabaseProvider(), sql.EngineOverrides{})

_, err := rowexec.DefaultBuilder.Build(sql.NewEmptyContext(), node, nil)
_, err := rowexec.NewBuilder(nil, sql.EngineOverrides{}).Build(sql.NewEmptyContext(), node, nil)

require.NoError(err)

Expand All @@ -350,9 +350,9 @@ func TestUnlockTables(t *testing.T) {
db.AddTable("bar", t2)
db.AddTable("baz", t3)

catalog := analyzer.NewCatalog(sql.NewDatabaseProvider(db))
catalog := analyzer.NewCatalog(sql.NewDatabaseProvider(db), sql.EngineOverrides{})

ctx := sql.NewContext(context.Background())
ctx := sql.NewEmptyContext()
ctx.SetCurrentDatabase("db")
catalog.LockTable(ctx, "foo")
catalog.LockTable(ctx, "bar")
Expand Down Expand Up @@ -438,7 +438,7 @@ func TestAnalyzer_Exp(t *testing.T) {
require.NoError(t, err)

ctx := enginetest.NewContext(harness)
b := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, e.EngineEventScheduler(), nil)
b := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, e.EngineEventScheduler())
parsed, _, _, _, err := b.Parse(tt.query, nil, false)
require.NoError(t, err)

Expand Down Expand Up @@ -591,7 +591,7 @@ func TestTableFunctions(t *testing.T) {
engine := enginetest.NewEngineWithProvider(t, harness, testDatabaseProvider)
harness = harness.WithProvider(engine.Analyzer.Catalog.DbProvider)

engine.EngineAnalyzer().ExecBuilder = rowexec.DefaultBuilder
engine.EngineAnalyzer().ExecBuilder = rowexec.NewBuilder(nil, sql.EngineOverrides{})

engine, err := enginetest.RunSetupScripts(harness.NewContext(), engine, setup.MydbData, true)
require.NoError(t, err)
Expand Down
28 changes: 16 additions & 12 deletions enginetest/enginetests.go
Original file line number Diff line number Diff line change
Expand Up @@ -741,7 +741,8 @@ func TestQueryPlan(t *testing.T, harness Harness, e QueryEngine, tt queries.Quer
func TestQueryPlanWithName(t *testing.T, name string, harness Harness, e QueryEngine, query, expectedPlan string, options sql.DescribeOptions) {
t.Run(name, func(t *testing.T) {
ctx := NewContext(harness)
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, query)
builder := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, nil)
parsed, _, _, qFlags, err := builder.Parse(query, nil, false)
require.NoError(t, err)

node, err := e.EngineAnalyzer().Analyze(ctx, parsed, nil, qFlags)
Expand All @@ -768,7 +769,8 @@ func TestQueryPlanWithName(t *testing.T, name string, harness Harness, e QueryEn
func TestQueryPlanWithEngine(t *testing.T, harness Harness, e QueryEngine, tt queries.QueryPlanTest, verbose bool) {
t.Run(tt.Query, func(t *testing.T) {
ctx := NewContext(harness)
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, tt.Query)
builder := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, nil)
parsed, _, _, qFlags, err := builder.Parse(tt.Query, nil, false)
require.NoError(t, err)

node, err := e.EngineAnalyzer().Analyze(ctx, parsed, nil, qFlags)
Expand Down Expand Up @@ -1482,6 +1484,7 @@ func TestTruncate(t *testing.T, harness Harness) {
e := mustNewEngine(t, harness)
defer e.Close()
ctx := NewContext(harness)
builder := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, nil)

t.Run("Standard TRUNCATE", func(t *testing.T) {
RunQueryWithContext(t, e, harness, ctx, "CREATE TABLE t1 (pk BIGINT PRIMARY KEY, v1 BIGINT, INDEX(v1))")
Expand Down Expand Up @@ -1530,7 +1533,7 @@ func TestTruncate(t *testing.T, harness Harness) {
TestQueryWithContext(t, ctx, e, harness, "SELECT * FROM t5 ORDER BY 1", []sql.Row{{int64(1), int64(1)}, {int64(2), int64(2)}}, nil, nil, nil)

deleteStr := "DELETE FROM t5"
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, deleteStr)
parsed, _, _, qFlags, err := builder.Parse(deleteStr, nil, false)
require.NoError(t, err)
analyzed, err := e.EngineAnalyzer().Analyze(ctx, parsed, nil, qFlags)
require.NoError(t, err)
Expand Down Expand Up @@ -1559,7 +1562,8 @@ func TestTruncate(t *testing.T, harness Harness) {
RunQueryWithContext(t, e, harness, ctx, "INSERT INTO t6parent VALUES (1,1), (2,2)")
RunQueryWithContext(t, e, harness, ctx, "INSERT INTO t6child VALUES (1,1), (2,2)")

parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, "DELETE FROM t6parent")
deleteStr := "DELETE FROM t6parent"
parsed, _, _, qFlags, err := builder.Parse(deleteStr, nil, false)
require.NoError(t, err)
analyzed, err := e.EngineAnalyzer().Analyze(ctx, parsed, nil, qFlags)
require.NoError(t, err)
Expand Down Expand Up @@ -1587,7 +1591,7 @@ func TestTruncate(t *testing.T, harness Harness) {
TestQueryWithContext(t, ctx, e, harness, "SELECT * FROM t7i ORDER BY 1", []sql.Row{{int64(3), int64(3)}}, nil, nil, nil)

deleteStr := "DELETE FROM t7"
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, deleteStr)
parsed, _, _, qFlags, err := builder.Parse(deleteStr, nil, false)
require.NoError(t, err)
analyzed, err := e.EngineAnalyzer().Analyze(ctx, parsed, nil, qFlags)
require.NoError(t, err)
Expand Down Expand Up @@ -1615,7 +1619,7 @@ func TestTruncate(t *testing.T, harness Harness) {
TestQueryWithContext(t, ctx, e, harness, "SELECT * FROM t8 ORDER BY 1", []sql.Row{{int64(1), int64(4)}, {int64(2), int64(5)}}, nil, nil, nil)

deleteStr := "DELETE FROM t8"
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, deleteStr)
parsed, _, _, qFlags, err := builder.Parse(deleteStr, nil, false)
require.NoError(t, err)
analyzed, err := e.EngineAnalyzer().Analyze(ctx, parsed, nil, qFlags)
require.NoError(t, err)
Expand Down Expand Up @@ -1644,7 +1648,7 @@ func TestTruncate(t *testing.T, harness Harness) {
TestQueryWithContext(t, ctx, e, harness, "SELECT * FROM t9 ORDER BY 1", []sql.Row{{int64(7), int64(7)}, {int64(8), int64(8)}}, nil, nil, nil)

deleteStr := "DELETE FROM t9 WHERE pk > 0"
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, deleteStr)
parsed, _, _, qFlags, err := builder.Parse(deleteStr, nil, false)
require.NoError(t, err)
analyzed, err := e.EngineAnalyzer().Analyze(ctx, parsed, nil, qFlags)
require.NoError(t, err)
Expand All @@ -1671,7 +1675,7 @@ func TestTruncate(t *testing.T, harness Harness) {
TestQueryWithContext(t, ctx, e, harness, "SELECT * FROM t10 ORDER BY 1", []sql.Row{{int64(8), int64(8)}, {int64(9), int64(9)}}, nil, nil, nil)

deleteStr := "DELETE FROM t10 LIMIT 1000"
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, deleteStr)
parsed, _, _, qFlags, err := builder.Parse(deleteStr, nil, false)
require.NoError(t, err)
analyzed, err := e.EngineAnalyzer().Analyze(ctx, parsed, nil, qFlags)
require.NoError(t, err)
Expand All @@ -1698,7 +1702,7 @@ func TestTruncate(t *testing.T, harness Harness) {
TestQueryWithContext(t, ctx, e, harness, "SELECT * FROM t11 ORDER BY 1", []sql.Row{{int64(1), int64(1)}, {int64(9), int64(9)}}, nil, nil, nil)

deleteStr := "DELETE FROM t11 ORDER BY 1"
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, deleteStr)
parsed, _, _, qFlags, err := builder.Parse(deleteStr, nil, false)
require.NoError(t, err)
analyzed, err := e.EngineAnalyzer().Analyze(ctx, parsed, nil, qFlags)
require.NoError(t, err)
Expand Down Expand Up @@ -1729,7 +1733,7 @@ func TestTruncate(t *testing.T, harness Harness) {
TestQueryWithContext(t, ctx, e, harness, "SELECT * FROM t12b ORDER BY 1", []sql.Row{{int64(1), int64(1)}, {int64(2), int64(2)}}, nil, nil, nil)

deleteStr := "DELETE t12a, t12b FROM t12a INNER JOIN t12b WHERE t12a.pk=t12b.pk"
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, deleteStr)
parsed, _, _, qFlags, err := builder.Parse(deleteStr, nil, false)
require.NoError(t, err)
analyzed, err := e.EngineAnalyzer().Analyze(ctx, parsed, nil, qFlags)
require.NoError(t, err)
Expand Down Expand Up @@ -1956,7 +1960,7 @@ func TestUserPrivileges(t *testing.T, harness ClientHarness) {
defer engine.Close()

ctx := NewContext(harness)
ctx.NewCtxWithClient(sql.Client{
ctx.WithClient(sql.Client{
User: "root",
Address: "localhost",
})
Expand Down Expand Up @@ -2055,7 +2059,7 @@ func TestUserPrivileges(t *testing.T, harness ClientHarness) {
t.Skipf("Skipping query %s", lastQuery)
}
}
ctx := rootCtx.NewCtxWithClient(sql.Client{
ctx := rootCtx.WithClient(sql.Client{
User: "tester",
Address: "localhost",
})
Expand Down
2 changes: 1 addition & 1 deletion enginetest/evaluation.go
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,7 @@ func injectBindVarsAndPrepare(
}
}

b := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, e.EngineEventScheduler(), nil)
b := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, e.EngineEventScheduler())
b.SetParserOptions(sql.LoadSqlMode(ctx).ParserOptions())
resPlan, err := e.PrepareQuery(ctx, q)
if err != nil {
Expand Down
4 changes: 2 additions & 2 deletions enginetest/histogram_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ func testHistogram(ctx *sql.Context, table *plan.ResolvedTable, fields []int, bu
return nil, fmt.Errorf("found zero row count for table")
}

i, err := rowexec.DefaultBuilder.Build(ctx, table, nil)
i, err := rowexec.NewBuilder(nil, sql.EngineOverrides{}).Build(ctx, table, nil)
rows, err := sql.RowIterToRows(ctx, i)
if err != nil {
return nil, err
Expand Down Expand Up @@ -416,7 +416,7 @@ func expectedResultSize(ctx *sql.Context, t1, t2 *plan.ResolvedTable, filters []
if debug {
fmt.Println(sql.DebugString(j))
}
i, err := rowexec.DefaultBuilder.Build(ctx, j, nil)
i, err := rowexec.NewBuilder(nil, sql.EngineOverrides{}).Build(ctx, j, nil)
if err != nil {
return 0, err
}
Expand Down
3 changes: 2 additions & 1 deletion enginetest/join_planning_tests.go
Original file line number Diff line number Diff line change
Expand Up @@ -1901,7 +1901,8 @@ func evalJoinTypeTest(t *testing.T, harness Harness, e QueryEngine, query string
}

func analyzeQuery(ctx *sql.Context, e QueryEngine, query string) (sql.Node, error) {
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, query)
builder := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, nil)
parsed, _, _, qFlags, err := builder.Parse(query, nil, false)
if err != nil {
return nil, err
}
Expand Down
27 changes: 17 additions & 10 deletions enginetest/memory_engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,20 +203,27 @@ func TestSingleScript(t *testing.T) {
t.Skip()
var scripts = []queries.ScriptTest{
{
Name: "AS OF propagates to nested CALLs",
SetUpScript: []string{},
Name: "Parse table name as column",
SetUpScript: []string{
`CREATE TABLE test (pk INT PRIMARY KEY, v1 VARCHAR(255));`,
`INSERT INTO test VALUES (1, 'a'), (2, 'b');`,
},
Assertions: []queries.ScriptTestAssertion{
{
Query: "create procedure create_proc() create table t (i int primary key, j int);",
Expected: []sql.Row{
{types.NewOkResult(0)},
},
Query: "SELECT temporarytesting(t) FROM test AS t;",
Expected: []sql.Row{},
},
{
Query: "call create_proc()",
Expected: []sql.Row{
{types.NewOkResult(0)},
},
Query: "SELECT temporarytesting(test) FROM test;",
Expected: []sql.Row{},
},
{
Query: "SELECT temporarytesting(pk, test) FROM test;",
Expected: []sql.Row{},
},
{
Query: "SELECT temporarytesting(v1, test, pk) FROM test;",
Expected: []sql.Row{},
},
},
},
Expand Down
3 changes: 2 additions & 1 deletion enginetest/mysqlshim/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,8 @@ func (t Table) getCreateTable() (*plan.CreateTable, error) {
return nil, sql.ErrTableNotFound.New(t.name)
}
// TODO add catalog
createTableNode, _, err := planbuilder.Parse(sql.NewEmptyContext(), sql.MapCatalog{Tables: map[string]sql.Table{t.name: t}}, rows[0][1].(string))
builder := planbuilder.New(sql.NewEmptyContext(), sql.MapCatalog{Tables: map[string]sql.Table{t.name: t}}, nil)
createTableNode, _, _, _, err := builder.Parse(rows[0][1].(string), nil, false)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion enginetest/plangen/cmd/plangen/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ func writePlanString(w *bytes.Buffer, planString string) {
}

func analyzeQuery(ctx *sql.Context, engine enginetest.QueryEngine, query string) sql.Node {
binder := planbuilder.New(ctx, engine.EngineAnalyzer().Catalog, engine.EngineEventScheduler(), nil)
binder := planbuilder.New(ctx, engine.EngineAnalyzer().Catalog, engine.EngineEventScheduler())
parsed, _, _, qFlags, err := binder.Parse(query, nil, false)
if err != nil {
exit(fmt.Errorf("%w\nfailed to parse query: %s", err, query))
Expand Down
4 changes: 2 additions & 2 deletions enginetest/server_engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -705,8 +705,8 @@ func convertGoSqlType(columnType *gosql.ColumnType) (sql.Type, error) {
// is in random order. The function expects binding variables starting with `:v1` and do not skip number.
// It cannot sort user-defined binding variables (e.g. :var, :foo)
func prepareBindingArgs(ctx *sql.Context, bindings map[string]sqlparser.Expr) ([]any, error) {
// NOTE: using binder with nil catalog and parser since we're only using it to convert SQLVal.
binder := planbuilder.New(ctx, nil, nil, nil)
// NOTE: using binder with nil catalog since we're only using it to convert SQLVal.
binder := planbuilder.New(ctx, nil, nil)
numBindVars := len(bindings)
args := make([]any, numBindVars)
for i := 0; i < numBindVars; i++ {
Expand Down
2 changes: 1 addition & 1 deletion memory/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ func stripTblNames(e sql.Expression) (sql.Expression, transform.TreeIdentity, er
case *expression.GetField:
// strip table names
ne := expression.NewGetField(e.Index(), e.Type(), e.Name(), e.IsNullable())
ne = ne.WithQuotedNames(sql.GlobalSchemaFormatter, e.IsQuotedIdentifier())
ne = ne.WithQuotedNames(sql.DefaultMySQLSchemaFormatter, e.IsQuotedIdentifier())
return ne, transform.NewTree, nil
default:
}
Expand Down
4 changes: 2 additions & 2 deletions server/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ func (s *SessionManager) NewContextWithQuery(ctx context.Context, conn *mysql.Co

ctx, span := s.tracer.Start(ctx, "query")

context := s.ctxFactory(
createdCtx := s.ctxFactory(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably just revert this file

ctx,
sql.WithSession(sess),
sql.WithTracer(s.tracer),
Expand All @@ -294,7 +294,7 @@ func (s *SessionManager) NewContextWithQuery(ctx context.Context, conn *mysql.Co
}),
)

return context, nil
return createdCtx, nil
}

// Exposed through (*sql.Context).Services.KillConnection. Calls Close on the
Expand Down
Loading