mirror of
https://github.com/dolthub/dolt.git
synced 2026-05-02 11:30:13 -05:00
use parser interface in engine (#7819)
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user