mirror of
https://github.com/dolthub/dolt.git
synced 2025-12-30 16:12:39 -06:00
[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:
committed by
GitHub
parent
7d1b2a8068
commit
22068f6407
3
.github/workflows/ci-check-repo.yaml
vendored
3
.github/workflows/ci-check-repo.yaml
vendored
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
20
go/go.mod
20
go/go.mod
@@ -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
|
||||
)
|
||||
|
||||
|
||||
42
go/go.sum
42
go/go.sum
@@ -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=
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 := ","
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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},
|
||||
|
||||
@@ -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}},
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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" {
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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" {
|
||||
|
||||
Reference in New Issue
Block a user