Merge remote-tracking branch 'upstream/master' into stmt-cache2
# Conflicts: # tests/postgres/alltypes_test.go # tests/postgres/northwind_test.go # tests/postgres/sample_test.go # tests/postgres/update_test.go # tests/sqlite/insert_test.go # tests/sqlite/main_test.go # tests/sqlite/sample_test.go # tests/sqlite/update_test.go
This commit is contained in:
commit
4bb9775134
97 changed files with 2306 additions and 537 deletions
|
|
@ -2,6 +2,7 @@ package sqlite
|
|||
|
||||
import (
|
||||
"github.com/go-jet/jet/v2/internal/testutils"
|
||||
"github.com/go-jet/jet/v2/internal/utils/ptr"
|
||||
. "github.com/go-jet/jet/v2/sqlite"
|
||||
"github.com/go-jet/jet/v2/tests/.gentestdata/sqlite/test_sample/model"
|
||||
. "github.com/go-jet/jet/v2/tests/.gentestdata/sqlite/test_sample/table"
|
||||
|
|
@ -153,43 +154,43 @@ func TestAllTypesInsert(t *testing.T) {
|
|||
|
||||
var toInsert = model.AllTypes{
|
||||
Boolean: false,
|
||||
BooleanPtr: testutils.BoolPtr(true),
|
||||
BooleanPtr: ptr.Of(true),
|
||||
TinyInt: 1,
|
||||
SmallInt: 3,
|
||||
MediumInt: 5,
|
||||
Integer: 7,
|
||||
BigInt: 9,
|
||||
TinyIntPtr: testutils.Int8Ptr(11),
|
||||
SmallIntPtr: testutils.Int16Ptr(33),
|
||||
MediumIntPtr: testutils.Int32Ptr(55),
|
||||
IntegerPtr: testutils.Int32Ptr(77),
|
||||
BigIntPtr: testutils.Int64Ptr(99),
|
||||
TinyIntPtr: ptr.Of(int8(11)),
|
||||
SmallIntPtr: ptr.Of(int16(33)),
|
||||
MediumIntPtr: ptr.Of(int32(55)),
|
||||
IntegerPtr: ptr.Of(int32(77)),
|
||||
BigIntPtr: ptr.Of(int64(99)),
|
||||
Decimal: 11.22,
|
||||
DecimalPtr: testutils.Float64Ptr(33.44),
|
||||
DecimalPtr: ptr.Of(33.44),
|
||||
Numeric: 55.66,
|
||||
NumericPtr: testutils.Float64Ptr(77.88),
|
||||
NumericPtr: ptr.Of(77.88),
|
||||
Float: 99.00,
|
||||
FloatPtr: testutils.Float64Ptr(11.22),
|
||||
FloatPtr: ptr.Of(11.22),
|
||||
Double: 33.44,
|
||||
DoublePtr: testutils.Float64Ptr(55.66),
|
||||
DoublePtr: ptr.Of(55.66),
|
||||
Real: 77.88,
|
||||
RealPtr: testutils.Float32Ptr(99.00),
|
||||
RealPtr: ptr.Of(float32(99.00)),
|
||||
Time: time.Date(1, 1, 1, 1, 1, 1, 10, time.UTC),
|
||||
TimePtr: testutils.TimePtr(time.Date(2, 2, 2, 2, 2, 2, 200, time.UTC)),
|
||||
TimePtr: ptr.Of(time.Date(2, 2, 2, 2, 2, 2, 200, time.UTC)),
|
||||
Date: time.Now(),
|
||||
DatePtr: testutils.TimePtr(time.Now()),
|
||||
DatePtr: ptr.Of(time.Now()),
|
||||
DateTime: time.Now(),
|
||||
DateTimePtr: testutils.TimePtr(time.Now()),
|
||||
DateTimePtr: ptr.Of(time.Now()),
|
||||
Timestamp: time.Now(),
|
||||
TimestampPtr: testutils.TimePtr(time.Now()),
|
||||
TimestampPtr: ptr.Of(time.Now()),
|
||||
Char: "abcd",
|
||||
CharPtr: testutils.StringPtr("absd"),
|
||||
CharPtr: ptr.Of("absd"),
|
||||
VarChar: "abcd",
|
||||
VarCharPtr: testutils.StringPtr("absd"),
|
||||
VarCharPtr: ptr.Of("absd"),
|
||||
Blob: []byte("large file"),
|
||||
BlobPtr: testutils.ByteArrayPtr([]byte("very large file")),
|
||||
BlobPtr: ptr.Of([]byte("very large file")),
|
||||
Text: "some text",
|
||||
TextPtr: testutils.StringPtr("text"),
|
||||
TextPtr: ptr.Of("text"),
|
||||
}
|
||||
|
||||
func TestUUID(t *testing.T) {
|
||||
|
|
@ -233,18 +234,18 @@ func TestExpressionOperators(t *testing.T) {
|
|||
SELECT all_types.integer IS NULL AS "result.is_null",
|
||||
all_types.date_ptr IS NOT NULL AS "result.is_not_null",
|
||||
(all_types.small_int_ptr IN (?, ?)) AS "result.in",
|
||||
(all_types.small_int_ptr IN (
|
||||
(all_types.small_int_ptr IN ((
|
||||
SELECT all_types.integer AS "all_types.integer"
|
||||
FROM all_types
|
||||
)) AS "result.in_select",
|
||||
))) AS "result.in_select",
|
||||
(length(121232459)) AS "result.raw",
|
||||
(? + COALESCE(all_types.small_int_ptr, 0) + ?) AS "result.raw_arg",
|
||||
(? + all_types.integer + ? + ? + ? + ?) AS "result.raw_arg2",
|
||||
(all_types.small_int_ptr NOT IN (?, ?, NULL)) AS "result.not_in",
|
||||
(all_types.small_int_ptr NOT IN (
|
||||
(all_types.small_int_ptr NOT IN ((
|
||||
SELECT all_types.integer AS "all_types.integer"
|
||||
FROM all_types
|
||||
)) AS "result.not_in_select"
|
||||
))) AS "result.not_in_select"
|
||||
FROM all_types
|
||||
LIMIT ?;
|
||||
`, "'", "`", -1), int64(11), int64(22), 78, 56, 11, 22, 11, 33, 44, int64(11), int64(22), int64(2))
|
||||
|
|
@ -659,7 +660,7 @@ func TestExactDecimals(t *testing.T) {
|
|||
|
||||
// not overwritten
|
||||
Numeric: "6.7",
|
||||
NumericPtr: testutils.StringPtr("7.7"),
|
||||
NumericPtr: ptr.Of("7.7"),
|
||||
},
|
||||
Decimal: decimal.RequireFromString("91.23"),
|
||||
DecimalPtr: decimal.RequireFromString("45.67"),
|
||||
|
|
@ -899,3 +900,36 @@ func TestDateTimeExpressions(t *testing.T) {
|
|||
require.Equal(t, dest.JulianDay, 2.4551543576232754e+06)
|
||||
require.Equal(t, dest.StrfTime, "20:34")
|
||||
}
|
||||
|
||||
func TestRowExpression(t *testing.T) {
|
||||
date := Date(2000, 9, 9)
|
||||
time := Time(11, 22, 11)
|
||||
dateTime := DateTime(2008, 11, 22, 10, 12, 40)
|
||||
dateTime2 := DateTime(2011, 1, 2, 5, 12, 40)
|
||||
|
||||
stmt := SELECT(
|
||||
ROW(Bool(false), date).EQ(ROW(Bool(true), date)),
|
||||
ROW(Bool(false), time).NOT_EQ(ROW(Bool(true), time)),
|
||||
ROW(time).IS_DISTINCT_FROM(RowExp(Raw("(time('now'))"))),
|
||||
ROW(dateTime, dateTime2).GT(ROW(dateTime, dateTime2)),
|
||||
ROW(dateTime2).GT_EQ(ROW(dateTime)),
|
||||
ROW(dateTime, dateTime2).LT(ROW(dateTime, dateTime2)),
|
||||
ROW(dateTime2).LT_EQ(ROW(dateTime2)),
|
||||
)
|
||||
|
||||
//fmt.Println(stmt.Sql())
|
||||
//fmt.Println(stmt.DebugSql())
|
||||
|
||||
testutils.AssertDebugStatementSql(t, stmt, `
|
||||
SELECT (FALSE, DATE('2000-09-09')) = (TRUE, DATE('2000-09-09')),
|
||||
(FALSE, TIME('11:22:11')) != (TRUE, TIME('11:22:11')),
|
||||
(TIME('11:22:11')) IS NOT ((time('now'))),
|
||||
(DATETIME('2008-11-22 10:12:40'), DATETIME('2011-01-02 05:12:40')) > (DATETIME('2008-11-22 10:12:40'), DATETIME('2011-01-02 05:12:40')),
|
||||
(DATETIME('2011-01-02 05:12:40')) >= (DATETIME('2008-11-22 10:12:40')),
|
||||
(DATETIME('2008-11-22 10:12:40'), DATETIME('2011-01-02 05:12:40')) < (DATETIME('2008-11-22 10:12:40'), DATETIME('2011-01-02 05:12:40')),
|
||||
(DATETIME('2011-01-02 05:12:40')) <= (DATETIME('2011-01-02 05:12:40'));
|
||||
`)
|
||||
|
||||
err := stmt.Query(db, &struct{}{})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,8 +8,11 @@ import (
|
|||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/go-jet/jet/v2/generator/metadata"
|
||||
"github.com/go-jet/jet/v2/generator/sqlite"
|
||||
"github.com/go-jet/jet/v2/generator/template"
|
||||
"github.com/go-jet/jet/v2/internal/testutils"
|
||||
sqlite2 "github.com/go-jet/jet/v2/sqlite"
|
||||
"github.com/go-jet/jet/v2/tests/.gentestdata/sqlite/sakila/model"
|
||||
"github.com/go-jet/jet/v2/tests/internal/utils/repo"
|
||||
)
|
||||
|
|
@ -58,6 +61,36 @@ func TestGenerator(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestGenerator_TableMetadata(t *testing.T) {
|
||||
var schema metadata.Schema
|
||||
err := sqlite.GenerateDSN(testDatabaseFilePath, genDestDir,
|
||||
template.Default(sqlite2.Dialect).UseSchema(func(m metadata.Schema) template.Schema {
|
||||
schema = m
|
||||
return template.DefaultSchema(m)
|
||||
}))
|
||||
require.NoError(t, err)
|
||||
|
||||
// Spot check the actor table and assert that the emitted
|
||||
// properties are as expected.
|
||||
var got metadata.Table
|
||||
for _, table := range schema.TablesMetaData {
|
||||
if table.Name == "actor" {
|
||||
got = table
|
||||
}
|
||||
}
|
||||
|
||||
want := metadata.Table{
|
||||
Name: "actor",
|
||||
Columns: []metadata.Column{
|
||||
{Name: "actor_id", IsPrimaryKey: true, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "INTEGER", Kind: "base", IsUnsigned: false}, Comment: ""},
|
||||
{Name: "first_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "VARCHAR", Kind: "base", IsUnsigned: false}, Comment: ""},
|
||||
{Name: "last_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "VARCHAR", Kind: "base", IsUnsigned: false}, Comment: ""},
|
||||
{Name: "last_update", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: true, DataType: metadata.DataType{Name: "TIMESTAMP", Kind: "base", IsUnsigned: false}, Comment: ""},
|
||||
},
|
||||
}
|
||||
require.Equal(t, want, got)
|
||||
}
|
||||
|
||||
func TestCmdGenerator(t *testing.T) {
|
||||
cmd := exec.Command("jet", "-source=SQLite", "-dsn=file://"+testDatabaseFilePath, "-path="+genDestDir)
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ package sqlite
|
|||
import (
|
||||
"context"
|
||||
"github.com/go-jet/jet/v2/qrm"
|
||||
"database/sql"
|
||||
"github.com/go-jet/jet/v2/internal/utils/ptr"
|
||||
"math/rand"
|
||||
|
||||
"testing"
|
||||
|
|
@ -49,7 +51,7 @@ VALUES (?, ?, ?, ?),
|
|||
ID: 101,
|
||||
URL: "http://www.google.com",
|
||||
Name: "Google",
|
||||
Description: testutils.StringPtr("Search engine"),
|
||||
Description: ptr.Of("Search engine"),
|
||||
})
|
||||
testutils.AssertDeepEqual(t, insertedLinks[2], model.Link{
|
||||
ID: 102,
|
||||
|
|
|
|||
|
|
@ -8,16 +8,11 @@ import (
|
|||
"github.com/go-jet/jet/v2/postgres"
|
||||
"github.com/go-jet/jet/v2/sqlite"
|
||||
"github.com/go-jet/jet/v2/tests/dbconfig"
|
||||
"github.com/stretchr/testify/require"
|
||||
"math/rand"
|
||||
"os"
|
||||
"os/exec"
|
||||
"runtime"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/profile"
|
||||
"github.com/stretchr/testify/require"
|
||||
"os"
|
||||
"runtime"
|
||||
"testing"
|
||||
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
)
|
||||
|
|
@ -27,11 +22,8 @@ var sampleDB *sqlite.DB
|
|||
var testRoot string
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
rand.Seed(time.Now().Unix())
|
||||
defer profile.Start().Stop()
|
||||
|
||||
setTestRoot()
|
||||
|
||||
sqlDB, err := sql.Open("sqlite3", "file:"+dbconfig.SakilaDBPath)
|
||||
throw.OnError(err)
|
||||
db = sqlite.NewDB(sqlDB).WithStatementsCaching(true)
|
||||
|
|
@ -59,16 +51,6 @@ func TestMain(m *testing.M) {
|
|||
}
|
||||
}
|
||||
|
||||
func setTestRoot() {
|
||||
cmd := exec.Command("git", "rev-parse", "--show-toplevel")
|
||||
byteArr, err := cmd.Output()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
testRoot = strings.TrimSpace(string(byteArr)) + "/tests/"
|
||||
}
|
||||
|
||||
var loggedSQL string
|
||||
var loggedSQLArgs []interface{}
|
||||
var loggedDebugSQL string
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package sqlite
|
|||
import (
|
||||
"github.com/go-jet/jet/v2/internal/testutils"
|
||||
"github.com/go-jet/jet/v2/qrm"
|
||||
"github.com/go-jet/jet/v2/internal/utils/ptr"
|
||||
"github.com/stretchr/testify/require"
|
||||
"testing"
|
||||
|
||||
|
|
@ -54,7 +55,7 @@ WHERE people.people_id = ?;
|
|||
).MODEL(
|
||||
model.People{
|
||||
PeopleName: "Dario",
|
||||
PeopleHeightCm: testutils.Float64Ptr(190),
|
||||
PeopleHeightCm: ptr.Of(190.0),
|
||||
},
|
||||
).RETURNING(
|
||||
People.AllColumns,
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package sqlite
|
|||
|
||||
import (
|
||||
"context"
|
||||
"github.com/go-jet/jet/v2/internal/utils/ptr"
|
||||
model2 "github.com/go-jet/jet/v2/tests/.gentestdata/sqlite/chinook/model"
|
||||
"github.com/go-jet/jet/v2/tests/.gentestdata/sqlite/chinook/table"
|
||||
"strings"
|
||||
|
|
@ -846,15 +847,15 @@ func TestSimpleView(t *testing.T) {
|
|||
|
||||
require.Equal(t, len(dest), 10)
|
||||
require.Equal(t, dest[2], model.CustomerList{
|
||||
ID: testutils.Int32Ptr(3),
|
||||
Name: testutils.StringPtr("LINDA WILLIAMS"),
|
||||
Address: testutils.StringPtr("692 Joliet Street"),
|
||||
ZipCode: testutils.StringPtr("83579"),
|
||||
Phone: testutils.StringPtr(" "),
|
||||
City: testutils.StringPtr("Athenai"),
|
||||
Country: testutils.StringPtr("Greece"),
|
||||
Notes: testutils.StringPtr("active"),
|
||||
Sid: testutils.Int32Ptr(1),
|
||||
ID: ptr.Of(int32(3)),
|
||||
Name: ptr.Of("LINDA WILLIAMS"),
|
||||
Address: ptr.Of("692 Joliet Street"),
|
||||
ZipCode: ptr.Of("83579"),
|
||||
Phone: ptr.Of(" "),
|
||||
City: ptr.Of("Athenai"),
|
||||
Country: ptr.Of("Greece"),
|
||||
Notes: ptr.Of("active"),
|
||||
Sid: ptr.Of(int32(1)),
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
344
tests/sqlite/values_test.go
Normal file
344
tests/sqlite/values_test.go
Normal file
|
|
@ -0,0 +1,344 @@
|
|||
package sqlite
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"github.com/go-jet/jet/v2/internal/testutils"
|
||||
"github.com/stretchr/testify/require"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
. "github.com/go-jet/jet/v2/sqlite"
|
||||
"github.com/go-jet/jet/v2/tests/.gentestdata/sqlite/sakila/model"
|
||||
. "github.com/go-jet/jet/v2/tests/.gentestdata/sqlite/sakila/table"
|
||||
)
|
||||
|
||||
func TestVALUES(t *testing.T) {
|
||||
|
||||
values := VALUES(
|
||||
ROW(Int32(1), Int32(2), Float(4.666), Bool(false), String("txt")),
|
||||
ROW(Int32(11).ADD(Int32(2)), Int32(22), Float(33.222), Bool(true), String("png")),
|
||||
ROW(Int32(11), Int32(22), Float(33.222), Bool(true), NULL),
|
||||
).AS("values_table")
|
||||
|
||||
stmt := SELECT(
|
||||
values.AllColumns(),
|
||||
).FROM(
|
||||
values,
|
||||
)
|
||||
|
||||
testutils.AssertStatementSql(t, stmt, `
|
||||
SELECT values_table.column1 AS "column1",
|
||||
values_table.column2 AS "column2",
|
||||
values_table.column3 AS "column3",
|
||||
values_table.column4 AS "column4",
|
||||
values_table.column5 AS "column5"
|
||||
FROM (
|
||||
VALUES (?, ?, ?, ?, ?),
|
||||
(? + ?, ?, ?, ?, ?),
|
||||
(?, ?, ?, ?, NULL)
|
||||
) AS values_table;
|
||||
`)
|
||||
|
||||
var dest []struct {
|
||||
Column1 int
|
||||
Column2 int
|
||||
Column3 float32
|
||||
Column4 bool
|
||||
Column5 *string
|
||||
}
|
||||
|
||||
err := stmt.Query(db, &dest)
|
||||
|
||||
require.NoError(t, err)
|
||||
testutils.AssertJSON(t, dest, `
|
||||
[
|
||||
{
|
||||
"Column1": 1,
|
||||
"Column2": 2,
|
||||
"Column3": 4.666,
|
||||
"Column4": false,
|
||||
"Column5": "txt"
|
||||
},
|
||||
{
|
||||
"Column1": 13,
|
||||
"Column2": 22,
|
||||
"Column3": 33.222,
|
||||
"Column4": true,
|
||||
"Column5": "png"
|
||||
},
|
||||
{
|
||||
"Column1": 11,
|
||||
"Column2": 22,
|
||||
"Column3": 33.222,
|
||||
"Column4": true,
|
||||
"Column5": null
|
||||
}
|
||||
]
|
||||
`)
|
||||
}
|
||||
|
||||
func TestVALUES_Join(t *testing.T) {
|
||||
|
||||
lastUpdate := DateTime(2007, time.February, 11, 12, 0, 0)
|
||||
|
||||
films := VALUES(
|
||||
ROW(String("Chamber Italian"), Int64(117), Int32(2005), Float(5.82), lastUpdate),
|
||||
ROW(String("Grosse Wonderful"), Int64(49), Int32(2004), Float(6.242), lastUpdate),
|
||||
ROW(String("Airport Pollock"), Int64(54), Int32(2001), Float(7.22), NULL),
|
||||
ROW(String("Bright Encounters"), Int64(73), Int32(2002), Float(8.25), NULL),
|
||||
ROW(String("Academy Dinosaur"), Int64(83), Int32(2010), Float(9.22), DATETIME(lastUpdate, YEARS(2))),
|
||||
).AS("film_values")
|
||||
|
||||
title := StringColumn("column1").From(films)
|
||||
releaseYear := IntegerColumn("column3").From(films)
|
||||
rentalRate := FloatColumn("column4").From(films)
|
||||
|
||||
stmt := SELECT(
|
||||
Film.AllColumns,
|
||||
films.AllColumns(),
|
||||
).FROM(
|
||||
Film.
|
||||
INNER_JOIN(films, LOWER(title).EQ(LOWER(Film.Title))),
|
||||
).WHERE(AND(
|
||||
CAST(Film.ReleaseYear).AS_INTEGER().GT(releaseYear),
|
||||
Film.RentalRate.LT(rentalRate),
|
||||
)).ORDER_BY(
|
||||
title,
|
||||
)
|
||||
|
||||
testutils.AssertDebugStatementSql(t, stmt, `
|
||||
SELECT film.film_id AS "film.film_id",
|
||||
film.title AS "film.title",
|
||||
film.description AS "film.description",
|
||||
film.release_year AS "film.release_year",
|
||||
film.language_id AS "film.language_id",
|
||||
film.original_language_id AS "film.original_language_id",
|
||||
film.rental_duration AS "film.rental_duration",
|
||||
film.rental_rate AS "film.rental_rate",
|
||||
film.length AS "film.length",
|
||||
film.replacement_cost AS "film.replacement_cost",
|
||||
film.rating AS "film.rating",
|
||||
film.special_features AS "film.special_features",
|
||||
film.last_update AS "film.last_update",
|
||||
film_values.column1 AS "column1",
|
||||
film_values.column2 AS "column2",
|
||||
film_values.column3 AS "column3",
|
||||
film_values.column4 AS "column4",
|
||||
film_values.column5 AS "column5"
|
||||
FROM film
|
||||
INNER JOIN (
|
||||
VALUES ('Chamber Italian', 117, 2005, 5.82, DATETIME('2007-02-11 12:00:00')),
|
||||
('Grosse Wonderful', 49, 2004, 6.242, DATETIME('2007-02-11 12:00:00')),
|
||||
('Airport Pollock', 54, 2001, 7.22, NULL),
|
||||
('Bright Encounters', 73, 2002, 8.25, NULL),
|
||||
('Academy Dinosaur', 83, 2010, 9.22, DATETIME(DATETIME('2007-02-11 12:00:00'), '2 YEARS'))
|
||||
) AS film_values ON (LOWER(film_values.column1) = LOWER(film.title))
|
||||
WHERE (
|
||||
(CAST(film.release_year AS INTEGER) > film_values.column3)
|
||||
AND (film.rental_rate < film_values.column4)
|
||||
)
|
||||
ORDER BY film_values.column1;
|
||||
`)
|
||||
|
||||
var dest []struct {
|
||||
Film model.Film
|
||||
|
||||
Column1 string
|
||||
Column2 int
|
||||
Column3 int
|
||||
Column4 float32
|
||||
Column5 *time.Time
|
||||
}
|
||||
|
||||
err := stmt.Query(db, &dest)
|
||||
|
||||
require.NoError(t, err)
|
||||
testutils.AssertJSON(t, dest, `
|
||||
[
|
||||
{
|
||||
"Film": {
|
||||
"FilmID": 8,
|
||||
"Title": "AIRPORT POLLOCK",
|
||||
"Description": "A Epic Tale of a Moose And a Girl who must Confront a Monkey in Ancient India",
|
||||
"ReleaseYear": "2006",
|
||||
"LanguageID": 1,
|
||||
"OriginalLanguageID": null,
|
||||
"RentalDuration": 6,
|
||||
"RentalRate": 4.99,
|
||||
"Length": 54,
|
||||
"ReplacementCost": 15.99,
|
||||
"Rating": "R",
|
||||
"SpecialFeatures": "Trailers",
|
||||
"LastUpdate": "2019-04-11T18:11:48Z"
|
||||
},
|
||||
"Column1": "Airport Pollock",
|
||||
"Column2": 54,
|
||||
"Column3": 2001,
|
||||
"Column4": 7.22,
|
||||
"Column5": null
|
||||
},
|
||||
{
|
||||
"Film": {
|
||||
"FilmID": 98,
|
||||
"Title": "BRIGHT ENCOUNTERS",
|
||||
"Description": "A Fateful Yarn of a Lumberjack And a Feminist who must Conquer a Student in A Jet Boat",
|
||||
"ReleaseYear": "2006",
|
||||
"LanguageID": 1,
|
||||
"OriginalLanguageID": null,
|
||||
"RentalDuration": 4,
|
||||
"RentalRate": 4.99,
|
||||
"Length": 73,
|
||||
"ReplacementCost": 12.99,
|
||||
"Rating": "PG-13",
|
||||
"SpecialFeatures": "Trailers",
|
||||
"LastUpdate": "2019-04-11T18:11:48Z"
|
||||
},
|
||||
"Column1": "Bright Encounters",
|
||||
"Column2": 73,
|
||||
"Column3": 2002,
|
||||
"Column4": 8.25,
|
||||
"Column5": null
|
||||
},
|
||||
{
|
||||
"Film": {
|
||||
"FilmID": 133,
|
||||
"Title": "CHAMBER ITALIAN",
|
||||
"Description": "A Fateful Reflection of a Moose And a Husband who must Overcome a Monkey in Nigeria",
|
||||
"ReleaseYear": "2006",
|
||||
"LanguageID": 1,
|
||||
"OriginalLanguageID": null,
|
||||
"RentalDuration": 7,
|
||||
"RentalRate": 4.99,
|
||||
"Length": 117,
|
||||
"ReplacementCost": 14.99,
|
||||
"Rating": "NC-17",
|
||||
"SpecialFeatures": "Trailers",
|
||||
"LastUpdate": "2019-04-11T18:11:48Z"
|
||||
},
|
||||
"Column1": "Chamber Italian",
|
||||
"Column2": 117,
|
||||
"Column3": 2005,
|
||||
"Column4": 5.82,
|
||||
"Column5": "2007-02-11T12:00:00Z"
|
||||
},
|
||||
{
|
||||
"Film": {
|
||||
"FilmID": 384,
|
||||
"Title": "GROSSE WONDERFUL",
|
||||
"Description": "A Epic Drama of a Cat And a Explorer who must Redeem a Moose in Australia",
|
||||
"ReleaseYear": "2006",
|
||||
"LanguageID": 1,
|
||||
"OriginalLanguageID": null,
|
||||
"RentalDuration": 5,
|
||||
"RentalRate": 4.99,
|
||||
"Length": 49,
|
||||
"ReplacementCost": 19.99,
|
||||
"Rating": "R",
|
||||
"SpecialFeatures": "Behind the Scenes",
|
||||
"LastUpdate": "2019-04-11T18:11:48Z"
|
||||
},
|
||||
"Column1": "Grosse Wonderful",
|
||||
"Column2": 49,
|
||||
"Column3": 2004,
|
||||
"Column4": 6.242,
|
||||
"Column5": "2007-02-11T12:00:00Z"
|
||||
}
|
||||
]
|
||||
`)
|
||||
}
|
||||
|
||||
func TestVALUES_CTE_Update(t *testing.T) {
|
||||
|
||||
paymentID := IntegerColumn("payment_ID")
|
||||
increase := FloatColumn("increase")
|
||||
paymentsToUpdate := CTE("values_cte", paymentID, increase)
|
||||
|
||||
stmt := WITH(
|
||||
paymentsToUpdate.AS(
|
||||
VALUES(
|
||||
ROW(Int32(204), Float(1.21)),
|
||||
ROW(Int32(207), Float(1.02)),
|
||||
ROW(Int32(200), Float(1.34)),
|
||||
ROW(Int32(203), Float(1.72)),
|
||||
),
|
||||
),
|
||||
)(
|
||||
Payment.UPDATE().
|
||||
SET(
|
||||
Payment.Amount.SET(Payment.Amount.MUL(increase)),
|
||||
).
|
||||
FROM(paymentsToUpdate).
|
||||
WHERE(Payment.PaymentID.EQ(paymentID)).
|
||||
RETURNING(Payment.AllColumns),
|
||||
)
|
||||
|
||||
testutils.AssertStatementSql(t, stmt, strings.ReplaceAll(`
|
||||
WITH values_cte (''payment_ID'', increase) AS (
|
||||
VALUES (?, ?),
|
||||
(?, ?),
|
||||
(?, ?),
|
||||
(?, ?)
|
||||
)
|
||||
UPDATE payment
|
||||
SET amount = (payment.amount * values_cte.increase)
|
||||
FROM values_cte
|
||||
WHERE payment.payment_id = values_cte.''payment_ID''
|
||||
RETURNING payment.payment_id AS "payment.payment_id",
|
||||
payment.customer_id AS "payment.customer_id",
|
||||
payment.staff_id AS "payment.staff_id",
|
||||
payment.rental_id AS "payment.rental_id",
|
||||
payment.amount AS "payment.amount",
|
||||
payment.payment_date AS "payment.payment_date",
|
||||
payment.last_update AS "payment.last_update";
|
||||
`, "''", "`"))
|
||||
|
||||
testutils.ExecuteInTxAndRollback(t, db, func(tx *sql.Tx) {
|
||||
var payments []model.Payment
|
||||
|
||||
err := stmt.Query(tx, &payments)
|
||||
|
||||
require.NoError(t, err)
|
||||
testutils.AssertJSON(t, payments, `
|
||||
[
|
||||
{
|
||||
"PaymentID": 200,
|
||||
"CustomerID": 7,
|
||||
"StaffID": 2,
|
||||
"RentalID": 11542,
|
||||
"Amount": 10.706600000000002,
|
||||
"PaymentDate": "2005-08-17T00:51:32Z",
|
||||
"LastUpdate": "2019-04-11T18:11:50Z"
|
||||
},
|
||||
{
|
||||
"PaymentID": 203,
|
||||
"CustomerID": 7,
|
||||
"StaffID": 2,
|
||||
"RentalID": 13373,
|
||||
"Amount": 5.1428,
|
||||
"PaymentDate": "2005-08-19T21:23:31Z",
|
||||
"LastUpdate": "2019-04-11T18:11:50Z"
|
||||
},
|
||||
{
|
||||
"PaymentID": 204,
|
||||
"CustomerID": 7,
|
||||
"StaffID": 1,
|
||||
"RentalID": 13476,
|
||||
"Amount": 3.6179,
|
||||
"PaymentDate": "2005-08-20T01:06:04Z",
|
||||
"LastUpdate": "2019-04-11T18:11:50Z"
|
||||
},
|
||||
{
|
||||
"PaymentID": 207,
|
||||
"CustomerID": 8,
|
||||
"StaffID": 2,
|
||||
"RentalID": 866,
|
||||
"Amount": 7.1298,
|
||||
"PaymentDate": "2005-05-30T03:43:54Z",
|
||||
"LastUpdate": "2019-04-11T18:11:50Z"
|
||||
}
|
||||
]
|
||||
`)
|
||||
})
|
||||
|
||||
}
|
||||
|
|
@ -153,10 +153,10 @@ WITH payments_to_update AS (
|
|||
)
|
||||
UPDATE payment
|
||||
SET amount = 0
|
||||
WHERE payment.payment_id IN (
|
||||
WHERE payment.payment_id IN ((
|
||||
SELECT payments_to_update.''payment.payment_id'' AS "payment.payment_id"
|
||||
FROM payments_to_update
|
||||
);
|
||||
));
|
||||
`, "''", "`", -1))
|
||||
|
||||
tx := beginDBTx(t)
|
||||
|
|
@ -205,10 +205,10 @@ WITH payments_to_delete AS (
|
|||
WHERE payment.amount < 0.5
|
||||
)
|
||||
DELETE FROM payment
|
||||
WHERE payment.payment_id IN (
|
||||
WHERE payment.payment_id IN ((
|
||||
SELECT payments_to_delete.''payment.payment_id'' AS "payment.payment_id"
|
||||
FROM payments_to_delete
|
||||
);
|
||||
));
|
||||
`, "''", "`", -1))
|
||||
|
||||
tx := beginDBTx(t)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue