mirror of
https://github.com/chaisql/chai.git
synced 2025-10-03 23:06:36 +08:00
76 lines
2.1 KiB
Go
76 lines
2.1 KiB
Go
package parser_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/chaisql/chai/internal/query"
|
|
"github.com/chaisql/chai/internal/query/statement"
|
|
"github.com/chaisql/chai/internal/sql/parser"
|
|
"github.com/chaisql/chai/internal/stream"
|
|
"github.com/chaisql/chai/internal/stream/path"
|
|
"github.com/chaisql/chai/internal/stream/rows"
|
|
"github.com/chaisql/chai/internal/stream/table"
|
|
"github.com/chaisql/chai/internal/testutil"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestParserUpdate(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
s string
|
|
expected *stream.Stream
|
|
errored bool
|
|
}{
|
|
{"SET/No cond", "UPDATE test SET a = 1",
|
|
stream.New(table.Scan("test")).
|
|
Pipe(path.Set("a", testutil.IntegerValue(1))).
|
|
Pipe(table.Validate("test")).
|
|
Pipe(table.Replace("test")).
|
|
Pipe(stream.Discard()),
|
|
false,
|
|
},
|
|
{"SET/With cond", "UPDATE test SET a = 1, b = 2 WHERE a = 10",
|
|
stream.New(table.Scan("test")).
|
|
Pipe(rows.Filter(parser.MustParseExpr("a = 10"))).
|
|
Pipe(path.Set("a", testutil.IntegerValue(1))).
|
|
Pipe(path.Set("b", parser.MustParseExpr("2"))).
|
|
Pipe(table.Validate("test")).
|
|
Pipe(table.Replace("test")).
|
|
Pipe(stream.Discard()),
|
|
false,
|
|
},
|
|
{"Trailing comma", "UPDATE test SET a = 1, WHERE a = 10", nil, true},
|
|
{"No SET", "UPDATE test WHERE a = 10", nil, true},
|
|
{"No pair", "UPDATE test SET WHERE a = 10", nil, true},
|
|
{"query.Field only", "UPDATE test SET a WHERE a = 10", nil, true},
|
|
{"No value", "UPDATE test SET a = WHERE a = 10", nil, true},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
db, tx, cleanup := testutil.NewTestTx(t)
|
|
defer cleanup()
|
|
|
|
testutil.MustExec(t, db, tx, "CREATE TABLE test(a INT, b TEXT)")
|
|
|
|
q, err := parser.ParseQuery(test.s)
|
|
if test.errored {
|
|
require.Error(t, err)
|
|
return
|
|
}
|
|
require.NoError(t, err)
|
|
|
|
err = q.Prepare(&query.Context{
|
|
Ctx: context.Background(),
|
|
DB: db,
|
|
Conn: tx.Connection(),
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
require.Len(t, q.Statements, 1)
|
|
require.EqualValues(t, &statement.PreparedStreamStmt{Stream: test.expected}, q.Statements[0].(*statement.PreparedStreamStmt))
|
|
})
|
|
}
|
|
}
|