use parser interface in engine (#7819)

This commit is contained in:
jennifersp
2024-05-09 10:21:40 -07:00
committed by GitHub
parent 05c1a9df00
commit 12335605bc
13 changed files with 43 additions and 31 deletions
+4 -3
View File
@@ -436,10 +436,11 @@ func dumpViews(ctx *sql.Context, engine *engine.SqlEngine, root doltdb.RootValue
sqlMode = s
}
}
opts := sql.NewSqlModeFromString(sqlMode).ParserOptions()
// We used to store just the SELECT part of a view, but now we store the entire CREATE VIEW statement
cv, err := planbuilder.ParseWithOptions(ctx, engine.GetUnderlyingEngine().Analyzer.Catalog, row[fragColIdx].(string), opts)
sqlEngine := engine.GetUnderlyingEngine()
binder := planbuilder.New(ctx, sqlEngine.Analyzer.Catalog, sqlEngine.Parser)
binder.SetParserOptions(sql.NewSqlModeFromString(sqlMode).ParserOptions())
cv, _, _, err := binder.Parse(row[fragColIdx].(string), false)
if err != nil {
return err
}
+1 -1
View File
@@ -57,7 +57,7 @@ require (
github.com/cespare/xxhash v1.1.0
github.com/creasty/defaults v1.6.0
github.com/dolthub/flatbuffers/v23 v23.3.3-dh.2
github.com/dolthub/go-mysql-server v0.18.2-0.20240506205942-6f757d28ad30
github.com/dolthub/go-mysql-server v0.18.2-0.20240509164257-3278929b9379
github.com/dolthub/gozstd v0.0.0-20240423170813-23a2903bca63
github.com/dolthub/swiss v0.1.0
github.com/goccy/go-json v0.10.2
+2 -2
View File
@@ -183,8 +183,8 @@ github.com/dolthub/fslock v0.0.3 h1:iLMpUIvJKMKm92+N1fmHVdxJP5NdyDK5bK7z7Ba2s2U=
github.com/dolthub/fslock v0.0.3/go.mod h1:QWql+P17oAAMLnL4HGB5tiovtDuAjdDTPbuqx7bYfa0=
github.com/dolthub/go-icu-regex v0.0.0-20230524105445-af7e7991c97e h1:kPsT4a47cw1+y/N5SSCkma7FhAPw7KeGmD6c9PBZW9Y=
github.com/dolthub/go-icu-regex v0.0.0-20230524105445-af7e7991c97e/go.mod h1:KPUcpx070QOfJK1gNe0zx4pA5sicIK1GMikIGLKC168=
github.com/dolthub/go-mysql-server v0.18.2-0.20240506205942-6f757d28ad30 h1:+xolBXi4KcBkyfKxw/ZSYbeVtpt3q0jArqKxJGVwFt8=
github.com/dolthub/go-mysql-server v0.18.2-0.20240506205942-6f757d28ad30/go.mod h1:T6EEu2iQoasR13Ovtp44yDn+rXQOBgh3BACPZMxSF/8=
github.com/dolthub/go-mysql-server v0.18.2-0.20240509164257-3278929b9379 h1:EEuMBsOD0lVImrWPcw+9SChorHmXMDu9VCsQOnrdFHs=
github.com/dolthub/go-mysql-server v0.18.2-0.20240509164257-3278929b9379/go.mod h1:T6EEu2iQoasR13Ovtp44yDn+rXQOBgh3BACPZMxSF/8=
github.com/dolthub/gozstd v0.0.0-20240423170813-23a2903bca63 h1:OAsXLAPL4du6tfbBgK0xXHZkOlos63RdKYS3Sgw/dfI=
github.com/dolthub/gozstd v0.0.0-20240423170813-23a2903bca63/go.mod h1:lV7lUeuDhH5thVGDCKXbatwKy2KW80L4rMT46n+Y2/Q=
github.com/dolthub/ishell v0.0.0-20221214210346-d7db0b066488 h1:0HHu0GWJH0N6a6keStrHhUAK5/o9LVfkh44pvsV4514=
@@ -66,7 +66,9 @@ func NewSqlEngineReader(ctx context.Context, dEnv *env.DoltEnv, tableName string
}
sqlCtx.SetCurrentDatabase(mrEnv.GetFirstDatabase())
ret, err := planbuilder.Parse(sqlCtx, se.GetUnderlyingEngine().Analyzer.Catalog, fmt.Sprintf("show create table `%s`", tableName))
sqlEngine := se.GetUnderlyingEngine()
binder := planbuilder.New(sqlCtx, sqlEngine.Analyzer.Catalog, sqlEngine.Parser)
ret, _, _, err := binder.Parse(fmt.Sprintf("show create table `%s`", tableName), false)
if err != nil {
return nil, err
}
@@ -311,8 +311,10 @@ func (s *SqlEngineTableWriter) getInsertNode(inputChannel chan sql.Row, replace
sep = ", "
}
sqlEngine := s.se.GetUnderlyingEngine()
binder := planbuilder.New(s.sqlCtx, sqlEngine.Analyzer.Catalog, sqlEngine.Parser)
insert := fmt.Sprintf("insert into `%s` (%s) VALUES (%s)%s", s.tableName, colNames, values, duplicate)
parsed, err := planbuilder.Parse(s.sqlCtx, s.se.GetUnderlyingEngine().Analyzer.Catalog, insert)
parsed, _, _, err := binder.Parse(insert, false)
if err != nil {
return nil, fmt.Errorf("error constructing import query '%s': %w", insert, err)
}
@@ -876,7 +876,8 @@ func convertVitessJsonExpressionString(ctx *sql.Context, value sqltypes.Value) (
return nil, fmt.Errorf("unable to access running SQL server")
}
node, err := planbuilder.Parse(ctx, server.Engine.Analyzer.Catalog, "SELECT "+strValue)
binder := planbuilder.New(ctx, server.Engine.Analyzer.Catalog, server.Engine.Parser)
node, _, _, err := binder.Parse("SELECT "+strValue, false)
if err != nil {
return nil, err
}
+16 -16
View File
@@ -32,7 +32,6 @@ import (
"github.com/dolthub/go-mysql-server/sql/planbuilder"
"github.com/dolthub/go-mysql-server/sql/rowexec"
"github.com/dolthub/go-mysql-server/sql/types"
"github.com/dolthub/vitess/go/vt/sqlparser"
"github.com/shopspring/decimal"
"gopkg.in/src-d/go-errors.v1"
@@ -1330,19 +1329,20 @@ func getViewDefinitionFromSchemaFragmentsOfView(ctx *sql.Context, tbl *WritableD
var viewDef sql.ViewDefinition
var views = make([]sql.ViewDefinition, len(fragments))
for i, fragment := range fragments {
cv, err := sqlparser.ParseWithOptions(fragments[i].fragment,
sql.NewSqlModeFromString(fragment.sqlMode).ParserOptions())
if err != nil {
return nil, sql.ViewDefinition{}, false, err
}
createView, ok := cv.(*sqlparser.DDL)
if ok {
selectStr := fragments[i].fragment[createView.SubStatementPositionStart:createView.SubStatementPositionEnd]
views[i] = sql.ViewDefinition{Name: fragments[i].name, TextDefinition: selectStr,
CreateViewStatement: fragments[i].fragment, SqlMode: fragment.sqlMode}
if strings.HasPrefix(strings.ToLower(fragments[i].fragment), "select") {
// older versions
views[i] = sql.ViewDefinition{
Name: fragments[i].name,
TextDefinition: fragments[i].fragment,
CreateViewStatement: fmt.Sprintf("CREATE VIEW %s AS %s", fragments[i].name, fragments[i].fragment),
}
} else {
views[i] = sql.ViewDefinition{Name: fragments[i].name, TextDefinition: fragments[i].fragment, CreateViewStatement: fmt.Sprintf("CREATE VIEW %s AS %s", fragments[i].name, fragments[i].fragment)}
views[i] = sql.ViewDefinition{
Name: fragments[i].name,
// TODO: need to define TextDefinition
CreateViewStatement: fragments[i].fragment,
SqlMode: fragment.sqlMode,
}
}
if strings.ToLower(fragment.name) == strings.ToLower(viewName) {
@@ -1533,9 +1533,9 @@ func (db Database) doltSchemaTableHash(ctx *sql.Context) (hash.Hash, error) {
// createEventDefinitionFromFragment creates an EventDefinition instance from the schema fragment |frag|.
func (db Database) createEventDefinitionFromFragment(ctx *sql.Context, frag schemaFragment) (*sql.EventDefinition, error) {
catalog := db.getCatalog(ctx)
sqlMode := sql.NewSqlModeFromString(frag.sqlMode)
parsed, err := planbuilder.ParseWithOptions(ctx, catalog, updateEventStatusTemporarilyForNonDefaultBranch(db.revision, frag.fragment), sqlMode.ParserOptions())
b := planbuilder.New(ctx, db.getCatalog(ctx), sql.NewMysqlParser())
b.SetParserOptions(sql.NewSqlModeFromString(frag.sqlMode).ParserOptions())
parsed, _, _, err := b.Parse(updateEventStatusTemporarilyForNonDefaultBranch(db.revision, frag.fragment), false)
if err != nil {
return nil, err
}
@@ -603,7 +603,8 @@ func TestIndexedAccess(t *testing.T, e enginetest.QueryEngine, harness enginetes
}
func analyzeQuery(ctx *sql.Context, e enginetest.QueryEngine, query string) (sql.Node, error) {
parsed, err := planbuilder.Parse(ctx, e.EngineAnalyzer().Catalog, query)
binder := planbuilder.New(ctx, e.EngineAnalyzer().Catalog, sql.NewMysqlParser())
parsed, _, _, err := binder.Parse(query, false)
if err != nil {
return nil, err
}
@@ -22,6 +22,7 @@ import (
"strings"
"testing"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/planbuilder"
"github.com/dolthub/go-mysql-server/enginetest"
@@ -47,7 +48,8 @@ func TestGenNewFormatQueryPlans(t *testing.T) {
for _, tt := range queries.PlanTests {
_, _ = w.WriteString("\t{\n")
ctx := enginetest.NewContextWithEngine(harness, engine)
parsed, err := planbuilder.Parse(ctx, engine.EngineAnalyzer().Catalog, tt.Query)
binder := planbuilder.New(ctx, engine.EngineAnalyzer().Catalog, sql.NewMysqlParser())
parsed, _, _, err := binder.Parse(tt.Query, false)
require.NoError(t, err)
node, err := engine.EngineAnalyzer().Analyze(ctx, parsed, nil)
@@ -157,7 +157,8 @@ func parseCreateTable(ctx *sql.Context, tableName string, sch schema.Schema) (*p
parseCtx := sql.NewEmptyContext()
parseCtx.SetCurrentDatabase("mydb")
pseudoAnalyzedQuery, err := planbuilder.Parse(parseCtx, catalog, query)
b := planbuilder.New(parseCtx, catalog, sql.NewMysqlParser())
pseudoAnalyzedQuery, _, _, err := b.Parse(query, false)
if err != nil {
return nil, err
}
@@ -1564,7 +1564,8 @@ func TestMergeableIndexesNulls(t *testing.T) {
}
func ReadRangesFromQuery(ctx *sql.Context, eng *sqle.Engine, query string) ([]*noms.ReadRange, error) {
parsed, err := planbuilder.Parse(ctx, eng.Analyzer.Catalog, query)
binder := planbuilder.New(ctx, eng.Analyzer.Catalog, eng.Parser)
parsed, _, _, err := binder.Parse(query, false)
if err != nil {
return nil, err
}
+2 -1
View File
@@ -30,7 +30,8 @@ import (
// ParseCreateTableStatement will parse a CREATE TABLE ddl statement and use it to create a Dolt Schema. A RootValue
// is used to generate unique tags for the Schema
func ParseCreateTableStatement(ctx *sql.Context, root doltdb.RootValue, engine *sqle.Engine, query string) (string, schema.Schema, error) {
parsed, err := planbuilder.Parse(ctx, engine.Analyzer.Catalog, query)
binder := planbuilder.New(ctx, engine.Analyzer.Catalog, engine.Parser)
parsed, _, _, err := binder.Parse(query, false)
if err != nil {
return "", nil, err
}
+1 -1
View File
@@ -48,7 +48,7 @@ func NewStatsIter(ctx *sql.Context, m prolly.Map) (*statsIter, error) {
kb: keyBuilder,
vb: valueBuilder,
ns: ns,
planb: planbuilder.New(ctx, nil),
planb: planbuilder.New(ctx, nil, sql.NewMysqlParser()),
}, nil
}