[no-release-notes] gms bump for name res (#6490)

* [no-release-notes] gms bump

* comments

* merge main

* del local repo refs

* tidy

* tidy

* eventsapi

* more tests

* fix import

* import/diff fixes

* diff panic

* test changes

* import backtick col names

* sysvar name error

* bump

* more import fixes

* fix test to match mysql

* bump

* more fixes

* more fixes

* no prepared count checking

* bump

* [ga-format-pr] Run go/utils/repofmt/format_repo.sh and go/Godeps/update.sh

* inline type lookup

* [ga-format-pr] Run go/utils/repofmt/format_repo.sh and go/Godeps/update.sh

* no mod replace

* bump

* bump revert

---------

Co-authored-by: max-hoffman <max-hoffman@users.noreply.github.com>
This commit is contained in:
Maximilian Hoffman
2023-08-16 19:24:32 -07:00
committed by GitHub
parent 7d1b2a8068
commit 22068f6407
35 changed files with 341 additions and 262 deletions

View File

@@ -32,8 +32,7 @@ jobs:
go run -mod=readonly ./utils/copyrightshdrs/
./Godeps/verify.sh
./utils/repofmt/check_bats_fmt.sh
./utils/repofmt/check_prepared_tests.sh
if ./utils/repofmt/check_fmt.sh ; then
echo "code is formatted"
else

View File

@@ -22,9 +22,8 @@ import (
"strings"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/parse"
"github.com/dolthub/go-mysql-server/sql/types"
"github.com/dolthub/vitess/go/vt/sqlparser"
ast "github.com/dolthub/vitess/go/vt/sqlparser"
"github.com/go-sql-driver/mysql"
"github.com/gocraft/dbr/v2"
"github.com/gocraft/dbr/v2/dialect"
@@ -857,7 +856,7 @@ func getTableSchemaAtRef(queryist cli.Queryist, sqlCtx *sql.Context, tableName s
createStmt += ";"
}
sch, err = schemaFromCreateTableStmt(sqlCtx, createStmt)
sch, err = schemaFromCreateTableStmt(createStmt)
if err != nil {
return sch, createStmt, err
}
@@ -865,33 +864,50 @@ func getTableSchemaAtRef(queryist cli.Queryist, sqlCtx *sql.Context, tableName s
return sch, createStmt, nil
}
func schemaFromCreateTableStmt(sqlCtx *sql.Context, createTableStmt string) (schema.Schema, error) {
p, err := sqlparser.Parse(createTableStmt)
func schemaFromCreateTableStmt(createTableStmt string) (schema.Schema, error) {
parsed, err := ast.Parse(createTableStmt)
if err != nil {
return nil, err
}
ddl := p.(*sqlparser.DDL)
create, ok := parsed.(*ast.DDL)
if !ok {
return nil, fmt.Errorf("expected create table, found %T", parsed)
}
s, _, err := parse.TableSpecToSchema(sqlCtx, ddl.TableSpec, false)
if err != nil {
return nil, err
primaryCols := make(map[string]bool)
for _, index := range create.TableSpec.Indexes {
if index.Info.Primary {
for _, indexCol := range index.Columns {
primaryCols[indexCol.Column.Lowered()] = true
}
break
}
}
cols := []schema.Column{}
for _, col := range s.Schema {
typeInfo, err := typeinfo.FromSqlType(col.Type)
for _, col := range create.TableSpec.Columns {
internalTyp, err := types.ColumnTypeToType(&col.Type)
typeInfo, err := typeinfo.FromSqlType(internalTyp)
if err != nil {
return nil, err
}
defBuf := ast.NewTrackedBuffer(nil)
if col.Type.Default != nil {
col.Type.Default.Format(defBuf)
}
var comment string
if col.Type.Comment != nil {
comment = col.Type.Comment.String()
}
sCol, err := schema.NewColumnWithTypeInfo(
col.Name,
col.Name.String(),
0,
typeInfo,
col.PrimaryKey,
col.Default.String(),
col.AutoIncrement,
col.Comment,
primaryCols[col.Name.Lowered()],
defBuf.String(),
col.Type.Autoincrement == true,
comment,
)
cols = append(cols, sCol)
}

View File

@@ -23,8 +23,8 @@ import (
"strings"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/parse"
"github.com/dolthub/go-mysql-server/sql/plan"
"github.com/dolthub/go-mysql-server/sql/planbuilder"
"github.com/fatih/color"
"github.com/dolthub/dolt/go/cmd/dolt/cli"
@@ -430,12 +430,12 @@ func dumpViews(ctx *sql.Context, engine *engine.SqlEngine, root *doltdb.RootValu
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 := parse.ParseWithOptions(ctx, row[fragColIdx].(string), sql.NewSqlModeFromString(sqlMode).ParserOptions())
cv, err := planbuilder.ParseWithOptions(ctx, engine.GetUnderlyingEngine().Analyzer.Catalog, row[fragColIdx].(string), opts)
if err != nil {
return err
}
modeChanged, err := changeSqlMode(ctx, writer, sqlMode)
if err != nil {
return err

View File

@@ -470,7 +470,7 @@ func newImportDataReader(ctx context.Context, root *doltdb.RootValue, dEnv *env.
return nil, &mvdata.DataMoverCreationError{ErrType: mvdata.CreateReaderErr, Cause: fmt.Errorf("%s already exists. Use -f to overwrite.", impOpts.DestName())}
}
rd, _, err := impOpts.src.NewReader(ctx, root, dEnv.FS, impOpts.srcOptions)
rd, _, err := impOpts.src.NewReader(ctx, dEnv, impOpts.srcOptions)
if err != nil {
return nil, &mvdata.DataMoverCreationError{ErrType: mvdata.CreateReaderErr, Cause: err}
}
@@ -646,14 +646,11 @@ func moveRows(
}
func getImportSchema(ctx context.Context, dEnv *env.DoltEnv, impOpts *importOptions) (schema.Schema, *mvdata.DataMoverCreationError) {
root, err := dEnv.WorkingRoot(ctx)
if err != nil {
return nil, &mvdata.DataMoverCreationError{ErrType: mvdata.SchemaErr, Cause: err}
}
if impOpts.schFile != "" {
tn, out, err := mvdata.SchAndTableNameFromFile(ctx, impOpts.schFile, dEnv.FS, root)
tn, out, err := mvdata.SchAndTableNameFromFile(ctx, impOpts.schFile, dEnv)
if err != nil {
return nil, &mvdata.DataMoverCreationError{ErrType: mvdata.SchemaErr, Cause: err}
}
if err == nil && tn != impOpts.destTableName {
err = fmt.Errorf("table name '%s' from schema file %s does not match table arg '%s'", tn, impOpts.schFile, impOpts.destTableName)
}
@@ -671,7 +668,7 @@ func getImportSchema(ctx context.Context, dEnv *env.DoltEnv, impOpts *importOpti
return nil, nil
}
rd, _, err := impOpts.src.NewReader(ctx, root, dEnv.FS, impOpts.srcOptions)
rd, _, err := impOpts.src.NewReader(ctx, dEnv, impOpts.srcOptions)
if err != nil {
return nil, &mvdata.DataMoverCreationError{ErrType: mvdata.CreateReaderErr, Cause: err}
}
@@ -681,6 +678,11 @@ func getImportSchema(ctx context.Context, dEnv *env.DoltEnv, impOpts *importOpti
return rd.GetSchema(), nil
}
root, err := dEnv.WorkingRoot(ctx)
if err != nil {
return nil, &mvdata.DataMoverCreationError{ErrType: mvdata.SchemaErr, Cause: err}
}
outSch, err := mvdata.InferSchema(ctx, root, rd, impOpts.destTableName, impOpts.primaryKeys, impOpts)
if err != nil {
return nil, &mvdata.DataMoverCreationError{ErrType: mvdata.SchemaErr, Cause: err}

View File

@@ -15,7 +15,7 @@ require (
github.com/dolthub/fslock v0.0.3
github.com/dolthub/ishell v0.0.0-20221214210346-d7db0b066488
github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81
github.com/dolthub/vitess v0.0.0-20230815183531-5f606d83f408
github.com/dolthub/vitess v0.0.0-20230815195949-02f159e126f9
github.com/dustin/go-humanize v1.0.0
github.com/fatih/color v1.13.0
github.com/flynn-archive/go-shlex v0.0.0-20150515145356-3f9db97f8568
@@ -45,8 +45,8 @@ require (
golang.org/x/sync v0.2.0
golang.org/x/sys v0.10.0
google.golang.org/api v0.126.0
google.golang.org/grpc v1.55.0
google.golang.org/protobuf v1.30.0
google.golang.org/grpc v1.57.0
google.golang.org/protobuf v1.31.0
gopkg.in/square/go-jose.v2 v2.5.1
gopkg.in/src-d/go-errors.v1 v1.0.0
gopkg.in/yaml.v2 v2.4.0
@@ -59,7 +59,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.16.1-0.20230815232241-704a2c0709d3
github.com/dolthub/go-mysql-server v0.16.1-0.20230817011537-fac838d6f846
github.com/dolthub/swiss v0.1.0
github.com/goccy/go-json v0.10.2
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
@@ -90,10 +90,10 @@ require (
)
require (
cloud.google.com/go v0.110.2 // indirect
cloud.google.com/go/compute v1.19.3 // indirect
cloud.google.com/go v0.110.7 // indirect
cloud.google.com/go/compute v1.23.0 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
cloud.google.com/go/iam v1.1.0 // indirect
cloud.google.com/go/iam v1.1.1 // indirect
git.sr.ht/~sbinet/gg v0.3.1 // indirect
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
@@ -151,9 +151,9 @@ require (
golang.org/x/tools v0.6.0 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect
google.golang.org/genproto v0.0.0-20230807174057-1744710a1577 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5 // indirect
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
)

View File

@@ -13,22 +13,22 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA=
cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw=
cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o=
cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/compute v1.19.3 h1:DcTwsFgGev/wV5+q8o2fzgcHOaac+DKGC91ZlvpsQds=
cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI=
cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY=
cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/iam v1.1.0 h1:67gSqaPukx7O8WLLHMa0PNs3EBGd2eE4d+psbO/CO94=
cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk=
cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y=
cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
@@ -180,10 +180,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.16.1-0.20230807211358-5b6031f113ba h1:ImvGNMKqAA+KPH5rXTR1xmOVQYv9XC7p6AjX8RhkWMU=
github.com/dolthub/go-mysql-server v0.16.1-0.20230807211358-5b6031f113ba/go.mod h1:nY1J1sV2kuGJbAZ6bcZARw4dF8TD3KpEfYVVs/HK/JY=
github.com/dolthub/go-mysql-server v0.16.1-0.20230815232241-704a2c0709d3 h1:2puC5sgRHTdWapYMn4WrSH06/qq8Qfw1wW84eWHvC1Q=
github.com/dolthub/go-mysql-server v0.16.1-0.20230815232241-704a2c0709d3/go.mod h1:wK9co8FTJEstDv35ITVgCjYVqqBoN5MlDyVMsNCoWaw=
github.com/dolthub/go-mysql-server v0.16.1-0.20230817011537-fac838d6f846 h1:GcbYtLRUeR0/ckyPu7emb+vYyzR5+lfNgNx4u//w4PI=
github.com/dolthub/go-mysql-server v0.16.1-0.20230817011537-fac838d6f846/go.mod h1:G05kv0oaccoUORzpk7B45EpL2fwhO1WETObKslLmra8=
github.com/dolthub/ishell v0.0.0-20221214210346-d7db0b066488 h1:0HHu0GWJH0N6a6keStrHhUAK5/o9LVfkh44pvsV4514=
github.com/dolthub/ishell v0.0.0-20221214210346-d7db0b066488/go.mod h1:ehexgi1mPxRTk0Mok/pADALuHbvATulTh6gzr7NzZto=
github.com/dolthub/jsonpath v0.0.2-0.20230525180605-8dc13778fd72 h1:NfWmngMi1CYUWU4Ix8wM+USEhjc+mhPlT9JUR/anvbQ=
@@ -194,8 +192,8 @@ github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 h1:7/v8q9X
github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY=
github.com/dolthub/swiss v0.1.0 h1:EaGQct3AqeP/MjASHLiH6i4TAmgbG/c4rA6a1bzCOPc=
github.com/dolthub/swiss v0.1.0/go.mod h1:BeucyB08Vb1G9tumVN3Vp/pyY4AMUnr9p7Rz7wJ7kAQ=
github.com/dolthub/vitess v0.0.0-20230815183531-5f606d83f408 h1:0MhiNzFzHybo3FR3kJBGadx+Z9u30R30YfUOKQ3fyJQ=
github.com/dolthub/vitess v0.0.0-20230815183531-5f606d83f408/go.mod h1:IyoysiiOzrIs7QsEHC+yVF0yRQ6W70GXyCXqtI2vVTs=
github.com/dolthub/vitess v0.0.0-20230815195949-02f159e126f9 h1:5KCy4uBtYu/A5Zgb97gBL5TFnIZwvT77QK4r6EPTk9Y=
github.com/dolthub/vitess v0.0.0-20230815195949-02f159e126f9/go.mod h1:IyoysiiOzrIs7QsEHC+yVF0yRQ6W70GXyCXqtI2vVTs=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
@@ -1082,12 +1080,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao=
google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64=
google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM=
google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
google.golang.org/genproto v0.0.0-20230807174057-1744710a1577 h1:Tyk/35yqszRCvaragTn5NnkY6IiKk/XvHzEWepo71N0=
google.golang.org/genproto v0.0.0-20230807174057-1744710a1577/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 h1:nIgk/EEq3/YlnmVVXVnm14rC2oxgs1o0ong4sD/rd44=
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5 h1:eSaPbMR4T7WfH9FvABk36NBMacoTUKdWCvV0dx+KfOg=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
@@ -1109,8 +1107,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag=
google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw=
google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -1123,8 +1121,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

View File

@@ -21,8 +21,8 @@ import (
"sort"
"strings"
sqle "github.com/dolthub/go-mysql-server"
"github.com/dolthub/go-mysql-server/sql"
ast "github.com/dolthub/vitess/go/vt/sqlparser"
errorkinds "gopkg.in/src-d/go-errors.v1"
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
@@ -1154,7 +1154,7 @@ func mergeChecks(ctx context.Context, ourChks, theirChks, ancChks schema.CheckCo
CheckExpression: chk.Expression(),
Enforced: chk.Enforced(),
}
colNames, err := sqle.ColumnsFromCheckDefinition(sql.NewContext(ctx), &chkDef)
colNames, err := ColumnsFromCheckDefinition(sql.NewContext(ctx), &chkDef)
if err != nil {
return nil, nil, err
}
@@ -1176,7 +1176,7 @@ func mergeChecks(ctx context.Context, ourChks, theirChks, ancChks schema.CheckCo
CheckExpression: ourChk.Expression(),
Enforced: ourChk.Enforced(),
}
colNames, err := sqle.ColumnsFromCheckDefinition(sql.NewContext(ctx), &chkDef)
colNames, err := ColumnsFromCheckDefinition(sql.NewContext(ctx), &chkDef)
if err != nil {
return nil, nil, err
}
@@ -1267,7 +1267,7 @@ func isCheckReferenced(sch schema.Schema, chk schema.Check) (bool, error) {
CheckExpression: chk.Expression(),
Enforced: chk.Enforced(),
}
colNames, err := sqle.ColumnsFromCheckDefinition(sql.NewEmptyContext(), &chkDef)
colNames, err := ColumnsFromCheckDefinition(sql.NewEmptyContext(), &chkDef)
if err != nil {
return false, err
}
@@ -1281,3 +1281,39 @@ func isCheckReferenced(sch schema.Schema, chk schema.Check) (bool, error) {
return true, nil
}
// ColumnsFromCheckDefinition retrieves the Column Names referenced by a CheckDefinition
func ColumnsFromCheckDefinition(ctx *sql.Context, def *sql.CheckDefinition) ([]string, error) {
// Evaluate the CheckDefinition to get evaluated Expression
parseStr := fmt.Sprintf("select %s", def.CheckExpression)
parsed, err := ast.Parse(parseStr)
if err != nil {
return nil, err
}
selectStmt, ok := parsed.(*ast.Select)
if !ok || len(selectStmt.SelectExprs) != 1 {
err := sql.ErrInvalidCheckConstraint.New(def.CheckExpression)
return nil, err
}
expr := selectStmt.SelectExprs[0]
ae, ok := expr.(*ast.AliasedExpr)
if !ok {
err := sql.ErrInvalidCheckConstraint.New(def.CheckExpression)
return nil, err
}
// Look for any column references in the evaluated Expression
var cols []string
ast.Walk(func(n ast.SQLNode) (kontinue bool, err error) {
switch n := n.(type) {
case *ast.ColName:
colName := n.Name.Lowered()
cols = append(cols, colName)
default:
}
return true, nil
}, ae.Expr)
return cols, nil
}

View File

@@ -22,6 +22,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/dolthub/dolt/go/cmd/dolt/commands/engine"
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
"github.com/dolthub/dolt/go/libraries/doltcore/dtestutils"
"github.com/dolthub/dolt/go/libraries/doltcore/merge"
@@ -599,8 +600,11 @@ func sch(definition string) namedSchema {
ns := denv.DoltDB.NodeStore()
ctx := context.Background()
root, _ := doltdb.EmptyRootValue(ctx, vrw, ns)
eng, dbName, _ := engine.NewSqlEngineForEnv(ctx, denv)
sqlCtx, _ := eng.NewDefaultContext(ctx)
sqlCtx.SetCurrentDatabase(dbName)
// TODO: ParseCreateTableStatement silently drops any indexes or check constraints in the definition
name, s, err := sqlutil.ParseCreateTableStatement(ctx, root, definition)
name, s, err := sqlutil.ParseCreateTableStatement(sqlCtx, root, eng.GetUnderlyingEngine(), definition)
if err != nil {
panic(err)
}

View File

@@ -21,12 +21,12 @@ import (
"path/filepath"
"strings"
"github.com/dolthub/dolt/go/libraries/doltcore/table/editor"
"github.com/dolthub/dolt/go/cmd/dolt/cli"
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
"github.com/dolthub/dolt/go/libraries/doltcore/env"
"github.com/dolthub/dolt/go/libraries/doltcore/schema"
"github.com/dolthub/dolt/go/libraries/doltcore/table"
"github.com/dolthub/dolt/go/libraries/doltcore/table/editor"
"github.com/dolthub/dolt/go/libraries/utils/filesys"
)
@@ -89,7 +89,7 @@ type DataLocation interface {
Exists(ctx context.Context, root *doltdb.RootValue, fs filesys.ReadableFS) (bool, error)
// NewReader creates a TableReadCloser for the DataLocation
NewReader(ctx context.Context, root *doltdb.RootValue, fs filesys.ReadableFS, opts interface{}) (rdCl table.SqlRowReader, sorted bool, err error)
NewReader(ctx context.Context, dEnv *env.DoltEnv, opts interface{}) (rdCl table.SqlRowReader, sorted bool, err error)
// NewCreatingWriter will create a TableWriteCloser for a DataLocation that will create a new table, or overwrite
// an existing table.

View File

@@ -240,7 +240,7 @@ func TestCreateRdWr(t *testing.T) {
t.Fatal("Failed to write data. bad:", numBad, err)
}
rd, _, err := loc.NewReader(context.Background(), root, dEnv.FS, JSONOptions{TableName: testTableName, SchFile: testSchemaFileName})
rd, _, err := loc.NewReader(context.Background(), dEnv, JSONOptions{TableName: testTableName, SchFile: testSchemaFileName})
if err != nil {
t.Fatal("Unexpected error creating reader", err)

View File

@@ -19,13 +19,14 @@ import (
"errors"
"fmt"
"github.com/dolthub/dolt/go/cmd/dolt/commands/engine"
"github.com/dolthub/dolt/go/cmd/dolt/errhand"
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
"github.com/dolthub/dolt/go/libraries/doltcore/env"
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
"github.com/dolthub/dolt/go/libraries/doltcore/schema"
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/sqlutil"
"github.com/dolthub/dolt/go/libraries/doltcore/table"
"github.com/dolthub/dolt/go/libraries/utils/filesys"
"github.com/dolthub/dolt/go/libraries/utils/set"
)
@@ -88,15 +89,30 @@ func (dmce *DataMoverCreationError) String() string {
}
// SchAndTableNameFromFile reads a SQL schema file and creates a Dolt schema from it.
func SchAndTableNameFromFile(ctx context.Context, path string, fs filesys.ReadableFS, root *doltdb.RootValue) (string, schema.Schema, error) {
func SchAndTableNameFromFile(ctx context.Context, path string, dEnv *env.DoltEnv) (string, schema.Schema, error) {
root, err := dEnv.WorkingRoot(ctx)
if err != nil {
return "", nil, err
}
fs := dEnv.FS
if path != "" {
data, err := fs.ReadFile(path)
if err != nil {
return "", nil, err
}
tn, sch, err := sqlutil.ParseCreateTableStatement(ctx, root, string(data))
eng, dbName, err := engine.NewSqlEngineForEnv(ctx, dEnv)
if err != nil {
return "", nil, err
}
sqlCtx, err := eng.NewDefaultContext(ctx)
if err != nil {
return "", nil, err
}
sqlCtx.SetCurrentDatabase(dbName)
tn, sch, err := sqlutil.ParseCreateTableStatement(sqlCtx, root, eng.GetUnderlyingEngine(), string(data))
if err != nil {
return "", nil, fmt.Errorf("%s in schema file %s", err.Error(), path)

View File

@@ -20,6 +20,8 @@ import (
sqle "github.com/dolthub/go-mysql-server"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/plan"
"github.com/dolthub/go-mysql-server/sql/planbuilder"
"github.com/dolthub/dolt/go/cmd/dolt/commands/engine"
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
@@ -64,7 +66,17 @@ func NewSqlEngineReader(ctx context.Context, dEnv *env.DoltEnv, tableName string
}
sqlCtx.SetCurrentDatabase(mrEnv.GetFirstDatabase())
sch, iter, err := se.Query(sqlCtx, fmt.Sprintf("SELECT * FROM `%s`", tableName))
ret, err := planbuilder.Parse(sqlCtx, se.GetUnderlyingEngine().Analyzer.Catalog, fmt.Sprintf("show create table `%s`", tableName))
if err != nil {
return nil, err
}
create, ok := ret.(*plan.ShowCreateTable)
if !ok {
return nil, fmt.Errorf("expected *plan.ShowCreate table, found %T", ret)
}
_, iter, err := se.Query(sqlCtx, fmt.Sprintf("SELECT * FROM `%s`", tableName))
if err != nil {
return nil, err
}
@@ -74,7 +86,7 @@ func NewSqlEngineReader(ctx context.Context, dEnv *env.DoltEnv, tableName string
return nil, err
}
doltSchema, err := sqlutil.ToDoltSchema(ctx, root, tableName, sql.NewPrimaryKeySchema(sch), nil, sql.Collation_Default)
doltSchema, err := sqlutil.ToDoltSchema(ctx, root, tableName, create.PrimaryKeySchema, nil, sql.Collation_Default)
if err != nil {
return nil, err
}

View File

@@ -23,8 +23,8 @@ import (
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/analyzer"
"github.com/dolthub/go-mysql-server/sql/analyzer/analyzererrors"
"github.com/dolthub/go-mysql-server/sql/expression"
"github.com/dolthub/go-mysql-server/sql/plan"
"github.com/dolthub/go-mysql-server/sql/planbuilder"
"github.com/dolthub/go-mysql-server/sql/rowexec"
"github.com/dolthub/go-mysql-server/sql/transform"
@@ -173,7 +173,7 @@ func (s *SqlEngineTableWriter) WriteRows(ctx context.Context, inputChannel chan
}
}
insertOrUpdateOperation, err := s.getInsertNode(inputChannel)
insertOrUpdateOperation, err := s.getInsertNode(inputChannel, false)
if err != nil {
return err
}
@@ -265,52 +265,70 @@ func (s *SqlEngineTableWriter) createOrEmptyTableIfNeeded() error {
// createTable creates a table.
func (s *SqlEngineTableWriter) createTable() error {
cr := plan.NewCreateTable(sql.UnresolvedDatabase(s.database), s.tableName, false, false, &plan.TableSpec{Schema: s.tableSchema})
analyzed, err := s.se.Analyze(s.sqlCtx, cr)
// TODO don't use internal interfaces to do this, we had to have a sql.Schema somewhere
// upstream to make the dolt schema
sqlCols := make([]string, len(s.tableSchema.Schema))
for i, c := range s.tableSchema.Schema {
sqlCols[i] = sql.GenerateCreateTableColumnDefinition(c, c.Default.String())
}
var pks string
var sep string
for _, i := range s.tableSchema.PkOrdinals {
pks += sep + s.tableSchema.Schema[i].Name
sep = ", "
}
if len(sep) > 0 {
sqlCols = append(sqlCols, fmt.Sprintf("PRIMARY KEY (%s)", pks))
}
createTable := sql.GenerateCreateTableStatement(s.tableName, sqlCols, sql.CharacterSet_utf8.String(), sql.Collation_Default.String())
sch, iter, err := s.se.Query(s.sqlCtx, createTable)
if err != nil {
return err
}
analyzedQueryProcess := analyzer.StripPassthroughNodes(analyzed.(*plan.QueryProcess))
ri, err := rowexec.DefaultBuilder.Build(s.sqlCtx, analyzedQueryProcess, nil)
if err != nil {
return err
}
for {
_, err = ri.Next(s.sqlCtx)
if err != nil {
return ri.Close(s.sqlCtx)
}
}
}
// getInsertNode returns the sql.Node to be iterated on given the import option.
func (s *SqlEngineTableWriter) getInsertNode(inputChannel chan sql.Row) (sql.Node, error) {
switch s.importOption {
case CreateOp, ReplaceOp, AppendOp:
return s.createInsertImportNode(inputChannel, s.contOnErr, false, nil) // contonerr translates to ignore
case UpdateOp:
return s.createInsertImportNode(inputChannel, s.contOnErr, false, generateOnDuplicateKeyExpressions(s.rowOperationSchema.Schema)) // contonerr translates to ignore
default:
return nil, fmt.Errorf("unsupported import type")
}
_, err = sql.RowIterToRows(s.sqlCtx, sch, iter)
return err
}
// createInsertImportNode creates the relevant/analyzed insert node given the import option. This insert node is wrapped
// with an error handler.
func (s *SqlEngineTableWriter) createInsertImportNode(source chan sql.Row, ignore bool, replace bool, onDuplicateExpression []sql.Expression) (sql.Node, error) {
src := NewChannelRowSource(s.rowOperationSchema.Schema, source)
dest := plan.NewUnresolvedTable(s.tableName, s.database)
colNames := make([]string, 0)
func (s *SqlEngineTableWriter) getInsertNode(inputChannel chan sql.Row, replace bool) (sql.Node, error) {
update := s.importOption == UpdateOp
colNames := ""
values := ""
duplicate := ""
if update {
duplicate += " ON DUPLICATE KEY UPDATE "
}
sep := ""
for _, col := range s.rowOperationSchema.Schema {
colNames = append(colNames, col.Name)
colNames += fmt.Sprintf("%s`%s`", sep, col.Name)
values += fmt.Sprintf("%s1", sep)
if update {
duplicate += fmt.Sprintf("%s`%s` = VALUES(`%s`)", sep, col.Name, col.Name)
}
sep = ", "
}
insert := plan.NewInsertInto(sql.UnresolvedDatabase(s.database), dest, src, replace, colNames, onDuplicateExpression, ignore)
analyzed, err := s.se.Analyze(s.sqlCtx, insert)
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)
if err != nil {
return nil, fmt.Errorf("error constructing import query '%s': %w", insert, err)
}
parsedIns, ok := parsed.(*plan.InsertInto)
if !ok {
return nil, fmt.Errorf("import setup expected *plan.InsertInto root, found %T", parsed)
}
schema := make(sql.Schema, len(s.rowOperationSchema.Schema))
for i, c := range s.rowOperationSchema.Schema {
newC := c.Copy()
newC.Source = planbuilder.OnDupValuesPrefix
schema[i] = newC
}
parsedIns.Source = NewChannelRowSource(schema, inputChannel)
parsedIns.Ignore = s.contOnErr
parsedIns.IsReplace = replace
analyzed, err := s.se.Analyze(s.sqlCtx, parsedIns)
if err != nil {
return nil, err
}
@@ -330,15 +348,3 @@ func (s *SqlEngineTableWriter) createInsertImportNode(source chan sql.Row, ignor
return analyzed, nil
}
// generateOnDuplicateKeyExpressions generates the duplicate key expressions needed for the update import option.
func generateOnDuplicateKeyExpressions(sch sql.Schema) []sql.Expression {
ret := make([]sql.Expression, len(sch))
for i, col := range sch {
columnExpression := expression.NewUnresolvedColumn(col.Name)
functionExpression := expression.NewUnresolvedFunction("values", false, nil, expression.NewUnresolvedColumn(col.Name))
ret[i] = expression.NewSetField(columnExpression, functionExpression)
}
return ret
}

View File

@@ -22,6 +22,8 @@ import (
"os"
"strings"
"github.com/dolthub/dolt/go/libraries/doltcore/env"
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
"github.com/dolthub/dolt/go/libraries/doltcore/schema"
"github.com/dolthub/dolt/go/libraries/doltcore/table"
@@ -75,7 +77,13 @@ func (dl FileDataLocation) Exists(ctx context.Context, root *doltdb.RootValue, f
}
// NewReader creates a TableReadCloser for the DataLocation
func (dl FileDataLocation) NewReader(ctx context.Context, root *doltdb.RootValue, fs filesys.ReadableFS, opts interface{}) (rdCl table.SqlRowReader, sorted bool, err error) {
func (dl FileDataLocation) NewReader(ctx context.Context, dEnv *env.DoltEnv, opts interface{}) (rdCl table.SqlRowReader, sorted bool, err error) {
fs := dEnv.FS
root, err := dEnv.WorkingRoot(ctx)
if err != nil {
return nil, false, err
}
exists, isDir := fs.Exists(dl.Path)
if !exists {
@@ -113,7 +121,7 @@ func (dl FileDataLocation) NewReader(ctx context.Context, root *doltdb.RootValue
var sch schema.Schema
jsonOpts, _ := opts.(JSONOptions)
if jsonOpts.SchFile != "" {
tn, s, err := SchAndTableNameFromFile(ctx, jsonOpts.SchFile, fs, root)
tn, s, err := SchAndTableNameFromFile(ctx, jsonOpts.SchFile, dEnv)
if err != nil {
return nil, false, err
}
@@ -145,7 +153,7 @@ func (dl FileDataLocation) NewReader(ctx context.Context, root *doltdb.RootValue
var tableSch schema.Schema
parquetOpts, _ := opts.(ParquetOptions)
if parquetOpts.SchFile != "" {
tn, s, tnErr := SchAndTableNameFromFile(ctx, parquetOpts.SchFile, fs, root)
tn, s, tnErr := SchAndTableNameFromFile(ctx, parquetOpts.SchFile, dEnv)
if tnErr != nil {
return nil, false, tnErr
}

View File

@@ -19,6 +19,8 @@ import (
"errors"
"io"
"github.com/dolthub/dolt/go/libraries/doltcore/env"
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
"github.com/dolthub/dolt/go/libraries/doltcore/schema"
"github.com/dolthub/dolt/go/libraries/doltcore/table"
@@ -46,7 +48,12 @@ func (dl StreamDataLocation) Exists(ctx context.Context, root *doltdb.RootValue,
}
// NewReader creates a TableReadCloser for the DataLocation
func (dl StreamDataLocation) NewReader(ctx context.Context, root *doltdb.RootValue, fs filesys.ReadableFS, opts interface{}) (rdCl table.SqlRowReader, sorted bool, err error) {
func (dl StreamDataLocation) NewReader(ctx context.Context, dEnv *env.DoltEnv, opts interface{}) (rdCl table.SqlRowReader, sorted bool, err error) {
root, err := dEnv.WorkingRoot(ctx)
if err != nil {
return nil, false, err
}
switch dl.Format {
case CsvFile:
delim := ","

View File

@@ -22,6 +22,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/dolthub/dolt/go/cmd/dolt/commands/engine"
"github.com/dolthub/dolt/go/libraries/doltcore/dtestutils"
"github.com/dolthub/dolt/go/libraries/doltcore/schema"
"github.com/dolthub/dolt/go/libraries/doltcore/schema/encoding"
@@ -57,7 +58,12 @@ func parseSchemaString(t *testing.T, s string) schema.Schema {
defer dEnv.DoltDB.Close()
root, err := dEnv.WorkingRoot(ctx)
require.NoError(t, err)
_, sch, err := sqlutil.ParseCreateTableStatement(ctx, root, s)
eng, db, err := engine.NewSqlEngineForEnv(ctx, dEnv)
require.NoError(t, err)
sqlCtx, err := eng.NewDefaultContext(ctx)
require.NoError(t, err)
sqlCtx.SetCurrentDatabase(db)
_, sch, err := sqlutil.ParseCreateTableStatement(sqlCtx, root, eng.GetUnderlyingEngine(), s)
require.NoError(t, err)
return sch
}

View File

@@ -20,7 +20,7 @@ import (
fb "github.com/dolthub/flatbuffers/v23/go"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/parse"
"github.com/dolthub/go-mysql-server/sql/planbuilder"
"github.com/dolthub/dolt/go/gen/fb/serial"
"github.com/dolthub/dolt/go/libraries/doltcore/schema"
@@ -287,7 +287,7 @@ func deserializeColumns(ctx context.Context, s *serial.TableSchema) ([]schema.Co
c := serial.Column{}
for i := range cols {
s.Columns(&c, i)
sqlType, err := typeinfoFromSqlType(ctx, string(c.SqlType()))
sqlType, err := typeinfoFromSqlType(string(c.SqlType()))
if err != nil {
return nil, err
}
@@ -538,12 +538,12 @@ func sqlTypeString(t typeinfo.TypeInfo) string {
return typ.String()
}
func typeinfoFromSqlType(ctx context.Context, s string) (typeinfo.TypeInfo, error) {
t, err := parse.ParseColumnTypeString(sql.NewContext(ctx), s)
func typeinfoFromSqlType(s string) (typeinfo.TypeInfo, error) {
sqlType, err := planbuilder.ParseColumnTypeString(s)
if err != nil {
return nil, err
}
return typeinfo.FromSqlType(t)
return typeinfo.FromSqlType(sqlType)
}
func encodingFromTypeinfo(t typeinfo.TypeInfo) serial.Encoding {

View File

@@ -21,7 +21,7 @@ import (
"testing"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/parse"
"github.com/dolthub/go-mysql-server/sql/planbuilder"
gmstypes "github.com/dolthub/go-mysql-server/sql/types"
"github.com/dolthub/vitess/go/sqltypes"
"github.com/stretchr/testify/assert"
@@ -292,7 +292,7 @@ func makePeopleTable(ctx context.Context, dEnv *env.DoltEnv) (*env.DoltEnv, erro
}
func mustStringToColumnDefault(defaultString string) *sql.ColumnDefaultValue {
def, err := parse.StringToColumnDefaultValue(sql.NewEmptyContext(), defaultString)
def, err := planbuilder.StringToColumnDefaultValue(sql.NewEmptyContext(), defaultString)
if err != nil {
panic(err)
}

View File

@@ -26,7 +26,7 @@ import (
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/binlogreplication"
"github.com/dolthub/go-mysql-server/sql/mysql_db"
"github.com/dolthub/go-mysql-server/sql/parse"
"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/mysql"
@@ -870,16 +870,16 @@ func convertVitessJsonExpressionString(ctx *sql.Context, value sqltypes.Value) (
strValue = strValue[len("EXPRESSION(") : len(strValue)-1]
}
node, err := parse.Parse(ctx, "SELECT "+strValue)
if err != nil {
return nil, err
}
server, _ := sqlserver.GetRunningServer()
if server == nil {
return nil, fmt.Errorf("unable to access running SQL server")
}
node, err := planbuilder.Parse(ctx, server.Engine.Analyzer.Catalog, "SELECT "+strValue)
if err != nil {
return nil, err
}
analyze, err := server.Engine.Analyzer.Analyze(ctx, node, nil)
if err != nil {
return nil, err

View File

@@ -50,6 +50,8 @@ func executeSelect(t *testing.T, ctx context.Context, dEnv *env.DoltEnv, root *d
return nil, nil, err
}
engine.Analyzer.Verbose = true
engine.Analyzer.Debug = true
sch, iter, err := engine.Query(sqlCtx, query)
if err != nil {
return nil, nil, err

View File

@@ -24,9 +24,8 @@ import (
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/fulltext"
"github.com/dolthub/go-mysql-server/sql/parse"
"github.com/dolthub/go-mysql-server/sql/plan"
"github.com/dolthub/go-mysql-server/sql/types"
"github.com/dolthub/vitess/go/vt/sqlparser"
"gopkg.in/src-d/go-errors.v1"
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
@@ -246,6 +245,9 @@ func (db Database) GetTableInsensitive(ctx *sql.Context, tblName string) (sql.Ta
// GetTableInsensitiveAsOf implements sql.VersionedDatabase
func (db Database) GetTableInsensitiveAsOf(ctx *sql.Context, tableName string, asOf interface{}) (sql.Table, bool, error) {
if asOf == nil {
return db.GetTableInsensitive(ctx, tableName)
}
head, root, err := resolveAsOf(ctx, db, asOf)
if err != nil {
return nil, false, err
@@ -1152,15 +1154,16 @@ 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 := parse.ParseWithOptions(ctx, fragments[i].fragment,
cv, err := sqlparser.ParseWithOptions(fragments[i].fragment,
sql.NewSqlModeFromString(fragment.sqlMode).ParserOptions())
if err != nil {
return nil, sql.ViewDefinition{}, false, err
}
createView, ok := cv.(*plan.CreateView)
createView, ok := cv.(*sqlparser.DDL)
if ok {
views[i] = sql.ViewDefinition{Name: fragments[i].name, TextDefinition: createView.Definition.TextDefinition,
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}
} 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)}

View File

@@ -576,11 +576,6 @@ func TestSpatialIndexPlans(t *testing.T) {
enginetest.TestSpatialIndexPlans(t, newDoltHarness(t))
}
func TestSpatialIndexPlansPrepared(t *testing.T) {
skipOldFormat(t)
enginetest.TestSpatialIndexPlansPrepared(t, newDoltHarness(t))
}
func TestTruncate(t *testing.T) {
h := newDoltHarness(t)
defer h.Close()
@@ -690,15 +685,6 @@ func TestJoinOps(t *testing.T) {
enginetest.TestJoinOps(t, h)
}
func TestJoinPlanningPrepared(t *testing.T) {
if types.IsFormat_LD(types.Format_Default) {
t.Skip("DOLT_LD keyless indexes are not sorted")
}
h := newDoltHarness(t).WithParallelism(1)
defer h.Close()
enginetest.TestJoinPlanningPrepared(t, h)
}
func TestJoinPlanning(t *testing.T) {
if types.IsFormat_LD(types.Format_Default) {
t.Skip("DOLT_LD keyless indexes are not sorted")
@@ -708,16 +694,6 @@ func TestJoinPlanning(t *testing.T) {
enginetest.TestJoinPlanning(t, h)
}
func TestJoinOpsPrepared(t *testing.T) {
if types.IsFormat_LD(types.Format_Default) {
t.Skip("DOLT_LD keyless indexes are not sorted")
}
h := newDoltHarness(t)
defer h.Close()
enginetest.TestJoinOpsPrepared(t, h)
}
func TestJoinQueries(t *testing.T) {
h := newDoltHarness(t)
defer h.Close()
@@ -1557,6 +1533,7 @@ func TestDoltMerge(t *testing.T) {
func() {
h := newDoltHarness(t).WithParallelism(1)
defer h.Close()
h.Setup(setup.MydbData)
enginetest.TestScript(t, h, script)
}()
}
@@ -2337,12 +2314,6 @@ func TestQueriesPrepared(t *testing.T) {
enginetest.TestQueriesPrepared(t, h)
}
func TestPreparedStaticIndexQuery(t *testing.T) {
h := newDoltHarness(t)
defer h.Close()
enginetest.TestPreparedStaticIndexQuery(t, h)
}
func TestStatistics(t *testing.T) {
h := newDoltHarness(t)
defer h.Close()

View File

@@ -278,6 +278,7 @@ func (d *DoltHarness) newSessionWithClient(client sql.Client) *dsess.DoltSession
pro := d.session.Provider()
dSession, err := dsess.NewDoltSession(sql.NewBaseSessionWithClientServer("address", client, 1), pro.(dsess.DoltDatabaseProvider), localConfig, d.branchControl)
dSession.SetCurrentDatabase("mydb")
require.NoError(d.t, err)
return dSession
}

View File

@@ -20,9 +20,10 @@ import (
"github.com/dolthub/go-mysql-server/enginetest/queries"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/expression"
"github.com/dolthub/go-mysql-server/sql/plan"
"github.com/dolthub/go-mysql-server/sql/types"
"github.com/dolthub/vitess/go/sqltypes"
"github.com/dolthub/vitess/go/vt/proto/query"
"github.com/dolthub/dolt/go/libraries/doltcore/sqle"
)
@@ -895,29 +896,29 @@ var DoltScripts = []queries.ScriptTest{
{
Query: "select * from test as of 'HEAD~' where pk=?;",
Expected: []sql.Row{{0, 0}},
Bindings: map[string]sql.Expression{
"v1": expression.NewLiteral(0, types.Int8),
Bindings: map[string]*query.BindVariable{
"v1": sqltypes.Int8BindVariable(int8(0)),
},
},
{
Query: "select * from test as of hashof('HEAD') where pk=?;",
Expected: []sql.Row{{1, 1, nil}},
Bindings: map[string]sql.Expression{
"v1": expression.NewLiteral(1, types.Int8),
Bindings: map[string]*query.BindVariable{
"v1": sqltypes.Int8BindVariable(int8(1)),
},
},
{
Query: "select * from test as of @Commit1 where pk=?;",
Expected: []sql.Row{{0, 0}},
Bindings: map[string]sql.Expression{
"v1": expression.NewLiteral(0, types.Int8),
Bindings: map[string]*query.BindVariable{
"v1": sqltypes.Int8BindVariable(int8(0)),
},
},
{
Query: "select * from test as of @Commit2 where pk=?;",
Expected: []sql.Row{{0, 0, nil}},
Bindings: map[string]sql.Expression{
"v1": expression.NewLiteral(0, types.Int8),
Bindings: map[string]*query.BindVariable{
"v1": sqltypes.Int8BindVariable(int8(0)),
},
},
},
@@ -2123,7 +2124,7 @@ WHERE z IN (
FROM dolt_history_xyz
LEFT JOIN dolt_commits
ON dolt_history_xyz.commit_hash = dolt_commits.commit_hash
);;`,
);`,
Expected: []sql.Row{
{100},
{200},

View File

@@ -521,7 +521,7 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
SkipResultsCheck: true,
},
{
Query: "SELECT COUNT(*) FROM DOLT_DIFF_t;;",
Query: "SELECT COUNT(*) FROM DOLT_DIFF_t;",
Expected: []sql.Row{{1}},
},
{

View File

@@ -22,7 +22,7 @@ import (
"strings"
"testing"
"github.com/dolthub/go-mysql-server/sql/parse"
"github.com/dolthub/go-mysql-server/sql/planbuilder"
"github.com/dolthub/go-mysql-server/enginetest"
"github.com/dolthub/go-mysql-server/enginetest/queries"
@@ -47,7 +47,7 @@ func TestGenNewFormatQueryPlans(t *testing.T) {
for _, tt := range queries.PlanTests {
_, _ = w.WriteString("\t{\n")
ctx := enginetest.NewContextWithEngine(harness, engine)
parsed, err := parse.Parse(ctx, tt.Query)
parsed, err := planbuilder.Parse(ctx, engine.Analyzer.Catalog, tt.Query)
require.NoError(t, err)
node, err := engine.Analyzer.Analyze(ctx, parsed, nil)

View File

@@ -20,8 +20,8 @@ import (
sqle "github.com/dolthub/go-mysql-server"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/parse"
"github.com/dolthub/go-mysql-server/sql/plan"
"github.com/dolthub/go-mysql-server/sql/planbuilder"
"github.com/dolthub/go-mysql-server/sql/transform"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -1564,7 +1564,7 @@ func TestMergeableIndexesNulls(t *testing.T) {
}
func ReadRangesFromQuery(ctx *sql.Context, eng *sqle.Engine, query string) ([]*noms.ReadRange, error) {
parsed, err := parse.Parse(ctx, query)
parsed, err := planbuilder.Parse(ctx, eng.Analyzer.Catalog, query)
if err != nil {
return nil, err
}

View File

@@ -20,7 +20,9 @@ import (
"strings"
"testing"
gms "github.com/dolthub/go-mysql-server"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/analyzer"
gmstypes "github.com/dolthub/go-mysql-server/sql/types"
"github.com/dolthub/vitess/go/sqltypes"
"github.com/stretchr/testify/assert"
@@ -31,6 +33,7 @@ import (
"github.com/dolthub/dolt/go/libraries/doltcore/env"
"github.com/dolthub/dolt/go/libraries/doltcore/row"
"github.com/dolthub/dolt/go/libraries/doltcore/schema"
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dtables"
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/sqlutil"
"github.com/dolthub/dolt/go/store/types"
@@ -892,7 +895,7 @@ func TestParseCreateTableStatement(t *testing.T) {
{
name: "Test create table starting with number",
query: "create table 123table (id int primary key)",
expectedTable: "`123table`",
expectedTable: "123table",
expectedSchema: dtestutils.CreateSchema(
schemaNewColumn(t, "id", 4817, gmstypes.Int32, true, schema.NotNullConstraint{})),
},
@@ -1076,8 +1079,17 @@ func TestParseCreateTableStatement(t *testing.T) {
defer dEnv.DoltDB.Close()
ctx := context.Background()
root, _ := dEnv.WorkingRoot(ctx)
//eng, dbName, _ := engine.NewSqlEngineForEnv(ctx, dEnv)
eng, sqlCtx := newTestEngine(ctx, dEnv)
tblName, sch, err := sqlutil.ParseCreateTableStatement(ctx, root, tt.query)
testSch, iter, err := eng.Query(sqlCtx, "create database test")
if err != nil {
panic(err)
}
_, _ = sql.RowIterToRows(sqlCtx, testSch, iter)
sqlCtx.SetCurrentDatabase("test")
tblName, sch, err := sqlutil.ParseCreateTableStatement(sqlCtx, root, eng, tt.query)
if tt.expectedErr != "" {
require.Error(t, err)
@@ -1091,6 +1103,30 @@ func TestParseCreateTableStatement(t *testing.T) {
}
}
func newTestEngine(ctx context.Context, dEnv *env.DoltEnv) (*gms.Engine, *sql.Context) {
pro, err := NewDoltDatabaseProviderWithDatabases("main", dEnv.FS, nil, nil)
if err != nil {
panic(err)
}
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
if err != nil {
panic(err)
}
doltSession, err := dsess.NewDoltSession(sql.NewBaseSession(), pro, dEnv.Config.WriteableConfig(), nil)
if err != nil {
panic(err)
}
sqlCtx := sql.NewContext(ctx, sql.WithSession(doltSession))
sqlCtx.SetCurrentDatabase(mrEnv.GetFirstDatabase())
return gms.New(analyzer.NewBuilder(pro).WithParallelism(1).Build(), &gms.Config{
IsReadOnly: false,
IsServerLocked: false,
}), sqlCtx
}
func TestIndexOverwrite(t *testing.T) {
ctx := context.Background()
dEnv := dtestutils.CreateTestEnv()

View File

@@ -15,13 +15,13 @@
package sqlutil
import (
"context"
"fmt"
"strings"
sqle "github.com/dolthub/go-mysql-server"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/parse"
"github.com/dolthub/go-mysql-server/sql/plan"
"github.com/dolthub/vitess/go/vt/sqlparser"
"github.com/dolthub/go-mysql-server/sql/planbuilder"
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
"github.com/dolthub/dolt/go/libraries/doltcore/schema"
@@ -29,43 +29,22 @@ 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 context.Context, root *doltdb.RootValue, query string) (string, schema.Schema, error) {
// todo: verify create table statement
p, err := sqlparser.Parse(query)
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)
if err != nil {
return "", nil, err
}
ddl := p.(*sqlparser.DDL)
create, ok := parsed.(*plan.CreateTable)
if !ok {
return "", nil, fmt.Errorf("expected create table, found %T", create)
}
sctx := sql.NewContext(ctx)
s, collation, err := parse.TableSpecToSchema(sctx, ddl.TableSpec, false)
sch, err := ToDoltSchema(ctx, root, create.Name(), create.CreateSchema, nil, create.Collation)
if err != nil {
return "", nil, err
}
for _, col := range s.Schema {
if collatedType, ok := col.Type.(sql.TypeWithCollation); ok {
col.Type, err = collatedType.WithNewCollation(sql.Collation_Default)
if err != nil {
return "", nil, err
}
}
}
buf := sqlparser.NewTrackedBuffer(nil)
ddl.Table.Format(buf)
tableName := buf.String()
sch, err := ToDoltSchema(ctx, root, tableName, s, nil, collation)
if err != nil {
return "", nil, err
}
indexes, err := parse.ConvertIndexDefs(sctx, ddl.TableSpec)
if err != nil {
return "", nil, err
}
for _, idx := range indexes {
for _, idx := range create.IdxDefs {
var prefixes []uint16
for _, c := range idx.Columns {
prefixes = append(prefixes, uint16(c.Length))
@@ -84,18 +63,14 @@ func ParseCreateTableStatement(ctx context.Context, root *doltdb.RootValue, quer
}
// foreign keys are stored on the *doltdb.Table object, ignore them here
_, checks, err := parse.ConvertConstraintsDefs(sctx, ddl.Table, ddl.TableSpec)
if err != nil {
return "", nil, err
}
for _, chk := range checks {
for _, chk := range create.ChDefs {
name := getCheckConstraintName(chk)
_, err = sch.Checks().AddCheck(name, chk.Expr.String(), chk.Enforced)
if err != nil {
return "", nil, err
}
}
return tableName, sch, err
return create.Name(), sch, err
}
func getIndexName(def *plan.IndexDefinition) string {

View File

@@ -1,20 +0,0 @@
#!/bin/bash
set -eo pipefail
script_dir=$(dirname "$0")
cd $script_dir/../..
enginetest_path=libraries/doltcore/sqle/enginetest/dolt_engine_test.go
all_cnt=$(grep "func Test.*" "$enginetest_path" | wc -l | tr -dc '0-9')
prep_cnt=$(grep "func Test.*Prepared" "$enginetest_path" | wc -l | tr -dc '0-9')
test_cnt=$((all_cnt-prep_cnt))
skip_cnt=$(grep "SkipPreparedsCount" "$enginetest_path" | awk '{print $4}' | tr -dc '0-9')
expected="$((test_cnt-skip_cnt))"
if [[ "$expected" != "$prep_cnt" ]]; then
echo "Expected '$expected' enginetests with name 'Test.*Prepared' in dolt_engine_test.go, found: '$prep_cnt'"
echo "Either increment SkipPreparedsCount or add a prepared test for the new test suite"
exit 1
fi

View File

@@ -139,8 +139,8 @@ SQL
@test "blame: returns an error when the table is not found in the given revision" {
run dolt blame HEAD~4 blame_test
[ "$status" -eq 0 ]
[[ "$output" = "" ]] || false
[ "$status" -eq 1 ]
[[ "$output" = "table not found: dolt_diff_blame_test" ]] || false
}
@test "blame: pk ordered output" {

View File

@@ -131,5 +131,5 @@ teardown() {
run dolt sql -q "select AaA from Test order by 1 limit 1"
[ "$status" -eq 0 ]
[[ "$output" =~ "1" ]] || false
[[ "$output" =~ "Aaa" ]] || false
[[ "$output" =~ "AaA" ]] || false
}

View File

@@ -97,7 +97,7 @@ teardown() {
run dolt sql -q "SELECT @@GLOBAL.unknown" -r csv
[ "$status" -eq 1 ]
[[ ! "$output" =~ "panic" ]] || false
[[ "$output" =~ "Unknown system variable 'unknown'" ]] || false
[[ "$output" =~ "Unknown system variable '@@global.unknown'" ]] || false
}
@test "sql-config: invalid persisted system variable type errors on cli sql command" {

View File

@@ -765,7 +765,7 @@ DROP TABLE myTempTABLE;
SELECT * FROM myTempTable;
SQL
[ "$status" -eq 1 ]
[[ "$output" =~ "table not found: myTempTable" ]] || false
[[ "$output" =~ "table not found: mytemptable" ]] || false
}
@test "sql-create-tables: BINARY attributes" {
@@ -790,4 +790,4 @@ SQL
[ "$status" -eq 0 ]
[[ "$output" =~ "2,2" ]] || false
}
}

View File

@@ -1085,7 +1085,7 @@ SQL
@test "sql: ambiguous column name" {
run dolt sql -q "select pk,pk1,pk2 from one_pk,two_pk where c1=0"
[ "$status" -eq 1 ]
[[ "$output" =~ "ambiguous column name \"c1\", it's present in all these tables: one_pk, two_pk" ]] || false
[[ "$output" =~ "ambiguous column name \"c1\", it's present in all these tables: [two_pk one_pk]" ]] || false
}
@test "sql: select with and and or clauses" {