[MySQL] Optimizer hints
This commit is contained in:
parent
c9967d151e
commit
f772f90336
12 changed files with 207 additions and 27 deletions
|
|
@ -2,6 +2,7 @@ package mysql
|
|||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"github.com/go-jet/jet/v2/internal/testutils"
|
||||
. "github.com/go-jet/jet/v2/mysql"
|
||||
"github.com/go-jet/jet/v2/tests/.gentestdata/mysql/dvds/table"
|
||||
|
|
@ -98,3 +99,22 @@ WHERE (staff.staff_id != ?) AND (rental.rental_id < ?);
|
|||
|
||||
testutils.AssertExecAndRollback(t, stmt, db)
|
||||
}
|
||||
|
||||
func TestDeleteOptimizerHints(t *testing.T) {
|
||||
|
||||
stmt := Link.DELETE().
|
||||
OPTIMIZER_HINTS(QB_NAME("deleteIns"), "MRR(link)").
|
||||
WHERE(
|
||||
Link.Name.IN(String("Gmail"), String("Outlook")),
|
||||
)
|
||||
|
||||
testutils.AssertDebugStatementSql(t, stmt, `
|
||||
DELETE /*+ QB_NAME(deleteIns) MRR(link) */ FROM test_sample.link
|
||||
WHERE link.name IN ('Gmail', 'Outlook');
|
||||
`)
|
||||
|
||||
testutils.ExecuteInTxAndRollback(t, db, func(tx *sql.Tx) {
|
||||
_, err := stmt.Exec(tx)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -370,3 +370,23 @@ func TestInsertWithExecContext(t *testing.T) {
|
|||
|
||||
require.Error(t, err, "context deadline exceeded")
|
||||
}
|
||||
|
||||
func TestInsertOptimizerHints(t *testing.T) {
|
||||
|
||||
stmt := Link.INSERT(Link.MutableColumns).
|
||||
OPTIMIZER_HINTS(QB_NAME("qbIns"), "NO_ICP(link)").
|
||||
MODEL(model.Link{
|
||||
URL: "http://www.google.com",
|
||||
Name: "Google",
|
||||
})
|
||||
|
||||
testutils.AssertDebugStatementSql(t, stmt, `
|
||||
INSERT /*+ QB_NAME(qbIns) NO_ICP(link) */ INTO test_sample.link (url, name, description)
|
||||
VALUES ('http://www.google.com', 'Google', NULL);
|
||||
`)
|
||||
|
||||
testutils.ExecuteInTxAndRollback(t, db, func(tx *sql.Tx) {
|
||||
_, err := stmt.Exec(tx)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1189,3 +1189,25 @@ ORDER BY film.film_id;
|
|||
]
|
||||
`)
|
||||
}
|
||||
|
||||
func TestSelectOptimizerHints(t *testing.T) {
|
||||
|
||||
stmt := SELECT(Actor.AllColumns).
|
||||
OPTIMIZER_HINTS(MAX_EXECUTION_TIME(1), QB_NAME("mainQueryBlock"), "NO_ICP(actor)").
|
||||
DISTINCT().
|
||||
FROM(Actor)
|
||||
|
||||
testutils.AssertDebugStatementSql(t, stmt, `
|
||||
SELECT /*+ MAX_EXECUTION_TIME(1) QB_NAME(mainQueryBlock) NO_ICP(actor) */ DISTINCT actor.actor_id AS "actor.actor_id",
|
||||
actor.first_name AS "actor.first_name",
|
||||
actor.last_name AS "actor.last_name",
|
||||
actor.last_update AS "actor.last_update"
|
||||
FROM dvds.actor;
|
||||
`)
|
||||
|
||||
var actors []model.Actor
|
||||
|
||||
err := stmt.QueryContext(context.Background(), db, &actors)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, actors, 200)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import (
|
|||
"database/sql"
|
||||
"github.com/go-jet/jet/v2/internal/testutils"
|
||||
. "github.com/go-jet/jet/v2/mysql"
|
||||
"github.com/go-jet/jet/v2/tests/.gentestdata/mysql/dvds/table"
|
||||
. "github.com/go-jet/jet/v2/tests/.gentestdata/mysql/dvds/table"
|
||||
"github.com/go-jet/jet/v2/tests/.gentestdata/mysql/test_sample/model"
|
||||
. "github.com/go-jet/jet/v2/tests/.gentestdata/mysql/test_sample/table"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
|
@ -260,10 +260,10 @@ func TestUpdateExecContext(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestUpdateWithJoin(t *testing.T) {
|
||||
statement := table.Staff.INNER_JOIN(table.Address, table.Address.AddressID.EQ(table.Staff.AddressID)).
|
||||
UPDATE(table.Staff.LastName).
|
||||
statement := Staff.INNER_JOIN(Address, Address.AddressID.EQ(Staff.AddressID)).
|
||||
UPDATE(Staff.LastName).
|
||||
SET(String("New staff name")).
|
||||
WHERE(table.Staff.StaffID.EQ(Int(1)))
|
||||
WHERE(Staff.StaffID.EQ(Int(1)))
|
||||
|
||||
testutils.AssertStatementSql(t, statement, `
|
||||
UPDATE dvds.staff
|
||||
|
|
@ -274,3 +274,29 @@ WHERE staff.staff_id = ?;
|
|||
|
||||
testutils.AssertExecAndRollback(t, statement, db)
|
||||
}
|
||||
|
||||
func TestUpdateOptimizerHints(t *testing.T) {
|
||||
|
||||
stmt := Link.UPDATE(Link.AllColumns).
|
||||
OPTIMIZER_HINTS(QB_NAME("qbInsert"), "MRR(link)").
|
||||
MODEL(model.Link{
|
||||
ID: 501,
|
||||
URL: "http://www.duckduckgo.com",
|
||||
Name: "DuckDuckGo",
|
||||
}).
|
||||
WHERE(Link.Name.EQ(String("Bing")))
|
||||
|
||||
testutils.AssertDebugStatementSql(t, stmt, `
|
||||
UPDATE /*+ QB_NAME(qbInsert) MRR(link) */ test_sample.link
|
||||
SET id = 501,
|
||||
url = 'http://www.duckduckgo.com',
|
||||
name = 'DuckDuckGo',
|
||||
description = NULL
|
||||
WHERE link.name = 'Bing';
|
||||
`)
|
||||
|
||||
testutils.ExecuteInTxAndRollback(t, db, func(tx *sql.Tx) {
|
||||
_, err := stmt.Exec(tx)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue