Skip to content

Commit 843c878

Browse files
committed
Tables and types with hooks/overrides
1 parent d4cc0da commit 843c878

Some content is hidden

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

61 files changed

+625
-226
lines changed

_example/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ func createTestDatabase() *memory.DbProvider {
8989
pro := memory.NewDBProvider(db)
9090
session := memory.NewSession(sql.NewBaseSession(), pro)
9191
ctx := sql.NewContext(context.Background(), sql.WithSession(session))
92+
ctx.Session = session
9293

9394
table := memory.NewTable(db, tableName, sql.NewPrimaryKeySchema(sql.Schema{
9495
{Name: "name", Type: types.Text, Nullable: false, Source: tableName, PrimaryKey: true},

driver/driver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ func (d *Driver) OpenConnector(dsn string) (driver.Connector, error) {
162162
d.mu.Lock()
163163
db, ok := d.dbs[serverName]
164164
if !ok {
165-
anlz := analyzer.NewDefaultWithVersion(pro)
165+
anlz := analyzer.NewDefault(pro)
166166
engine := sqle.New(anlz, nil)
167167
db = &dbConn{engine: engine}
168168
d.dbs[serverName] = db

engine.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,10 @@ func New(a *analyzer.Analyzer, cfg *Config) *Engine {
183183
}
184184

185185
a.Catalog.RegisterFunction(emptyCtx, function.GetLockingFuncs(ls)...)
186+
parser := sql.DefaultMySQLParser
187+
if a.Overrides.Builder.Parser != nil {
188+
parser = a.Overrides.Builder.Parser
189+
}
186190

187191
ret := &Engine{
188192
Analyzer: a,
@@ -194,7 +198,7 @@ func New(a *analyzer.Analyzer, cfg *Config) *Engine {
194198
PreparedDataCache: NewPreparedDataCache(),
195199
mu: &sync.Mutex{},
196200
EventScheduler: nil,
197-
Parser: sql.GlobalParser,
201+
Parser: parser,
198202
}
199203
ret.ReadOnly.Store(cfg.IsReadOnly)
200204
a.Runner = ret
@@ -203,16 +207,15 @@ func New(a *analyzer.Analyzer, cfg *Config) *Engine {
203207

204208
// NewDefault creates a new default Engine.
205209
func NewDefault(pro sql.DatabaseProvider) *Engine {
206-
a := analyzer.NewDefaultWithVersion(pro)
207-
return New(a, nil)
210+
return New(analyzer.NewDefault(pro), nil)
208211
}
209212

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

246-
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler, e.Parser)
249+
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler)
247250
node, _, err := binder.BindOnly(stmt, query, nil)
248251

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

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

529-
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler, e.Parser)
532+
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler)
530533
binder.SetBindings(bindings)
531534

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

583-
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler, e.Parser)
586+
binder := planbuilder.New(ctx, e.Analyzer.Catalog, e.EventScheduler)
584587
if preparedDataFound {
585588
parsed = preparedAst
586589
binder.SetBindings(bindings)

engine_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ func TestTrackProcess(t *testing.T) {
231231
_, ok = rhs.Table.(*plan.ProcessTable)
232232
require.True(ok)
233233

234-
iter, err := rowexec.DefaultBuilder.Build(ctx, result, nil)
234+
iter, err := rowexec.NewBuilder(nil, sql.EngineOverrides{}).Build(ctx, result, nil)
235235
require.NoError(err)
236236
iter, _, err = rowexec.FinalizeIters(ctx, result, nil, iter)
237237
require.NoError(err)

enginetest/engine_only_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ func TestShowProcessList(t *testing.T) {
272272

273273
n := plan.NewShowProcessList()
274274

275-
iter, err := rowexec.DefaultBuilder.Build(ctx, n, nil)
275+
iter, err := rowexec.NewBuilder(nil, sql.EngineOverrides{}).Build(ctx, n, nil)
276276
require.NoError(err)
277277
rows, err := sql.RowIterToRows(ctx, iter)
278278
require.NoError(err)
@@ -327,9 +327,9 @@ func TestLockTables(t *testing.T) {
327327
{plan.NewResolvedTable(t1, nil, nil), true},
328328
{plan.NewResolvedTable(t2, nil, nil), false},
329329
})
330-
node.Catalog = analyzer.NewCatalog(sql.NewDatabaseProvider())
330+
node.Catalog = analyzer.NewCatalog(sql.NewDatabaseProvider(), sql.EngineOverrides{})
331331

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

334334
require.NoError(err)
335335

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

353-
catalog := analyzer.NewCatalog(sql.NewDatabaseProvider(db))
353+
catalog := analyzer.NewCatalog(sql.NewDatabaseProvider(db), sql.EngineOverrides{})
354354

355-
ctx := sql.NewContext(context.Background())
355+
ctx := sql.NewEmptyContext()
356356
ctx.SetCurrentDatabase("db")
357357
catalog.LockTable(ctx, "foo")
358358
catalog.LockTable(ctx, "bar")
@@ -438,7 +438,7 @@ func TestAnalyzer_Exp(t *testing.T) {
438438
require.NoError(t, err)
439439

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

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

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

596596
engine, err := enginetest.RunSetupScripts(harness.NewContext(), engine, setup.MydbData, true)
597597
require.NoError(t, err)

enginetest/enginetests.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,8 @@ func TestQueryPlan(t *testing.T, harness Harness, e QueryEngine, tt queries.Quer
741741
func TestQueryPlanWithName(t *testing.T, name string, harness Harness, e QueryEngine, query, expectedPlan string, options sql.DescribeOptions) {
742742
t.Run(name, func(t *testing.T) {
743743
ctx := NewContext(harness)
744-
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, query)
744+
builder := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, nil)
745+
parsed, _, _, qFlags, err := builder.Parse(query, nil, false)
745746
require.NoError(t, err)
746747

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

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

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

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

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

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

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

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

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

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

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

19581962
ctx := NewContext(harness)
1959-
ctx.NewCtxWithClient(sql.Client{
1963+
ctx.WithClient(sql.Client{
19601964
User: "root",
19611965
Address: "localhost",
19621966
})
@@ -2055,7 +2059,7 @@ func TestUserPrivileges(t *testing.T, harness ClientHarness) {
20552059
t.Skipf("Skipping query %s", lastQuery)
20562060
}
20572061
}
2058-
ctx := rootCtx.NewCtxWithClient(sql.Client{
2062+
ctx := rootCtx.WithClient(sql.Client{
20592063
User: "tester",
20602064
Address: "localhost",
20612065
})

enginetest/evaluation.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ func injectBindVarsAndPrepare(
627627
}
628628
}
629629

630-
b := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, e.EngineEventScheduler(), nil)
630+
b := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, e.EngineEventScheduler())
631631
b.SetParserOptions(sql.LoadSqlMode(ctx).ParserOptions())
632632
resPlan, err := e.PrepareQuery(ctx, q)
633633
if err != nil {

enginetest/histogram_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ func testHistogram(ctx *sql.Context, table *plan.ResolvedTable, fields []int, bu
315315
return nil, fmt.Errorf("found zero row count for table")
316316
}
317317

318-
i, err := rowexec.DefaultBuilder.Build(ctx, table, nil)
318+
i, err := rowexec.NewBuilder(nil, sql.EngineOverrides{}).Build(ctx, table, nil)
319319
rows, err := sql.RowIterToRows(ctx, i)
320320
if err != nil {
321321
return nil, err
@@ -416,7 +416,7 @@ func expectedResultSize(ctx *sql.Context, t1, t2 *plan.ResolvedTable, filters []
416416
if debug {
417417
fmt.Println(sql.DebugString(j))
418418
}
419-
i, err := rowexec.DefaultBuilder.Build(ctx, j, nil)
419+
i, err := rowexec.NewBuilder(nil, sql.EngineOverrides{}).Build(ctx, j, nil)
420420
if err != nil {
421421
return 0, err
422422
}

enginetest/join_planning_tests.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1901,7 +1901,8 @@ func evalJoinTypeTest(t *testing.T, harness Harness, e QueryEngine, query string
19011901
}
19021902

19031903
func analyzeQuery(ctx *sql.Context, e QueryEngine, query string) (sql.Node, error) {
1904-
parsed, qFlags, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, query)
1904+
builder := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, nil)
1905+
parsed, _, _, qFlags, err := builder.Parse(query, nil, false)
19051906
if err != nil {
19061907
return nil, err
19071908
}

enginetest/memory_engine_test.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -203,20 +203,27 @@ func TestSingleScript(t *testing.T) {
203203
t.Skip()
204204
var scripts = []queries.ScriptTest{
205205
{
206-
Name: "AS OF propagates to nested CALLs",
207-
SetUpScript: []string{},
206+
Name: "Parse table name as column",
207+
SetUpScript: []string{
208+
`CREATE TABLE test (pk INT PRIMARY KEY, v1 VARCHAR(255));`,
209+
`INSERT INTO test VALUES (1, 'a'), (2, 'b');`,
210+
},
208211
Assertions: []queries.ScriptTestAssertion{
209212
{
210-
Query: "create procedure create_proc() create table t (i int primary key, j int);",
211-
Expected: []sql.Row{
212-
{types.NewOkResult(0)},
213-
},
213+
Query: "SELECT temporarytesting(t) FROM test AS t;",
214+
Expected: []sql.Row{},
214215
},
215216
{
216-
Query: "call create_proc()",
217-
Expected: []sql.Row{
218-
{types.NewOkResult(0)},
219-
},
217+
Query: "SELECT temporarytesting(test) FROM test;",
218+
Expected: []sql.Row{},
219+
},
220+
{
221+
Query: "SELECT temporarytesting(pk, test) FROM test;",
222+
Expected: []sql.Row{},
223+
},
224+
{
225+
Query: "SELECT temporarytesting(v1, test, pk) FROM test;",
226+
Expected: []sql.Row{},
220227
},
221228
},
222229
},

0 commit comments

Comments
 (0)