Add support for blob expressions.
This commit is contained in:
parent
26e478dc7e
commit
c94216ab0e
37 changed files with 1296 additions and 81 deletions
|
|
@ -511,7 +511,8 @@ func TestStringOperators(t *testing.T) {
|
|||
RTRIM(AllTypes.VarCharPtr),
|
||||
CONCAT(String("string1"), Int(1), Float(11.12)),
|
||||
CONCAT_WS(String("string1"), Int(1), Float(11.12)),
|
||||
FORMAT(String("Hello %s, %1$s"), String("World")),
|
||||
FORMAT(Int(11), Int(2)),
|
||||
FORMAT(Int(11), Int(2), String("de_DE")),
|
||||
LEFT(String("abcde"), Int(2)),
|
||||
RIGHT(String("abcde"), Int(2)),
|
||||
LENGTH(String("jose")),
|
||||
|
|
@ -523,6 +524,12 @@ func TestStringOperators(t *testing.T) {
|
|||
REVERSE(AllTypes.VarCharPtr),
|
||||
SUBSTR(AllTypes.CharPtr, Int(3)),
|
||||
SUBSTR(AllTypes.CharPtr, Int(3), Int(2)),
|
||||
ELT(Int(2), AllTypes.CharPtr, AllTypes.Char, AllTypes.Text),
|
||||
FIELD(AllTypes.Char, AllTypes.VarChar, AllTypes.Text),
|
||||
FROM_BASE64(String("SGVsbG8gV29ybGQ=")),
|
||||
TO_BASE64(String("Hello World")),
|
||||
CHARSET(AllTypes.Char),
|
||||
COLLATION(AllTypes.Text),
|
||||
}
|
||||
|
||||
if !sourceIsMariaDB() {
|
||||
|
|
@ -544,6 +551,71 @@ func TestStringOperators(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestBlob(t *testing.T) {
|
||||
|
||||
var sampleBlob = Blob([]byte{11, 0, 22, 33, 44})
|
||||
var textBlob = Blob([]byte("text blob"))
|
||||
|
||||
stmt := SELECT(
|
||||
AllTypes.BlobPtr.EQ(sampleBlob),
|
||||
AllTypes.BlobPtr.EQ(AllTypes.BlobPtr),
|
||||
AllTypes.BlobPtr.NOT_EQ(sampleBlob),
|
||||
AllTypes.BlobPtr.GT(textBlob),
|
||||
AllTypes.BlobPtr.GT_EQ(AllTypes.BlobPtr),
|
||||
AllTypes.BlobPtr.LT(AllTypes.BlobPtr),
|
||||
AllTypes.BlobPtr.LT_EQ(sampleBlob),
|
||||
AllTypes.BlobPtr.BETWEEN(Blob([]byte("min")), Blob([]byte("max"))),
|
||||
AllTypes.BlobPtr.NOT_BETWEEN(AllTypes.BlobPtr, AllTypes.BlobPtr),
|
||||
AllTypes.BlobPtr.CONCAT(textBlob),
|
||||
AllTypes.BlobPtr.LIKE(AllTypes.BlobPtr),
|
||||
AllTypes.BlobPtr.NOT_LIKE(sampleBlob),
|
||||
|
||||
BIT_LENGTH(textBlob),
|
||||
LENGTH(sampleBlob),
|
||||
CHAR_LENGTH(AllTypes.BlobPtr),
|
||||
OCTET_LENGTH(textBlob),
|
||||
CONCAT(sampleBlob, Int(1), Float(11.12)),
|
||||
TO_BASE64(sampleBlob),
|
||||
HEX(sampleBlob),
|
||||
UNHEX(String("616B263A")),
|
||||
SUBSTR(AllTypes.BlobPtr, Int(3)),
|
||||
SUBSTR(AllTypes.BlobPtr, Int(3), Int(2)),
|
||||
).FROM(
|
||||
AllTypes,
|
||||
)
|
||||
|
||||
testutils.AssertDebugStatementSql(t, stmt, `
|
||||
SELECT all_types.blob_ptr = X'0b0016212c',
|
||||
all_types.blob_ptr = all_types.blob_ptr,
|
||||
all_types.blob_ptr != X'0b0016212c',
|
||||
all_types.blob_ptr > X'7465787420626c6f62',
|
||||
all_types.blob_ptr >= all_types.blob_ptr,
|
||||
all_types.blob_ptr < all_types.blob_ptr,
|
||||
all_types.blob_ptr <= X'0b0016212c',
|
||||
all_types.blob_ptr BETWEEN X'6d696e' AND X'6d6178',
|
||||
all_types.blob_ptr NOT BETWEEN all_types.blob_ptr AND all_types.blob_ptr,
|
||||
CONCAT(all_types.blob_ptr, X'7465787420626c6f62'),
|
||||
all_types.blob_ptr LIKE all_types.blob_ptr,
|
||||
all_types.blob_ptr NOT LIKE X'0b0016212c',
|
||||
BIT_LENGTH(X'7465787420626c6f62'),
|
||||
LENGTH(X'0b0016212c'),
|
||||
CHAR_LENGTH(all_types.blob_ptr),
|
||||
OCTET_LENGTH(X'7465787420626c6f62'),
|
||||
CONCAT(X'0b0016212c', 1, 11.12),
|
||||
TO_BASE64(X'0b0016212c'),
|
||||
HEX(X'0b0016212c'),
|
||||
UNHEX('616B263A'),
|
||||
SUBSTR(all_types.blob_ptr, 3),
|
||||
SUBSTR(all_types.blob_ptr, 3, 2)
|
||||
FROM test_sample.all_types;
|
||||
`)
|
||||
|
||||
var dest []struct{}
|
||||
err := stmt.Query(db, &dest)
|
||||
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
var timeT = time.Date(2009, 11, 17, 20, 34, 58, 651387237, time.UTC)
|
||||
|
||||
func TestTimeExpressions(t *testing.T) {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package mysql
|
|||
import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"testing"
|
||||
|
||||
|
|
@ -606,3 +607,394 @@ func UseSchema(schema string) {
|
|||
StaffList = StaffList.FromSchema(schema)
|
||||
}
|
||||
`
|
||||
|
||||
func TestGeneratedTestSampleDatabase(t *testing.T) {
|
||||
|
||||
enumDir := filepath.Join(testRoot, "/.gentestdata/mysql/test_sample/enum/")
|
||||
modelDir := filepath.Join(testRoot, "/.gentestdata/mysql/test_sample/model/")
|
||||
tableDir := filepath.Join(testRoot, "/.gentestdata/mysql/test_sample/table/")
|
||||
viewDir := filepath.Join(testRoot, "/.gentestdata/mysql/test_sample/view/")
|
||||
|
||||
testutils.AssertFileNamesEqual(t, enumDir, "all_types_enum.go", "all_types_enum_ptr.go",
|
||||
"all_types_view_enum.go", "all_types_view_enum_ptr.go")
|
||||
testutils.AssertFileContent(t, enumDir+"/all_types_enum.go", allTypesEnum)
|
||||
|
||||
testutils.AssertFileNamesEqual(t, modelDir, "all_types.go", "all_types_enum.go", "all_types_enum_ptr.go",
|
||||
"all_types_view.go", "all_types_view_enum.go", "all_types_view_enum_ptr.go", "link.go", "link2.go",
|
||||
"floats.go", "user.go")
|
||||
|
||||
testutils.AssertFileContent(t, modelDir+"/all_types.go", allTypesModelContent)
|
||||
|
||||
testutils.AssertFileNamesEqual(t, tableDir, "all_types.go",
|
||||
"link.go", "link2.go", "user.go", "floats.go", "table_use_schema.go")
|
||||
testutils.AssertFileContent(t, tableDir+"/all_types.go", allTypesTableContent)
|
||||
|
||||
testutils.AssertFileNamesEqual(t, viewDir, "all_types_view.go", "view_use_schema.go")
|
||||
}
|
||||
|
||||
var allTypesEnum = `
|
||||
//
|
||||
// Code generated by go-jet DO NOT EDIT.
|
||||
//
|
||||
// WARNING: Changes to this file may cause incorrect behavior
|
||||
// and will be lost if the code is regenerated
|
||||
//
|
||||
|
||||
package enum
|
||||
|
||||
import "github.com/go-jet/jet/v2/mysql"
|
||||
|
||||
var AllTypesEnum = &struct {
|
||||
Value1 mysql.StringExpression
|
||||
Value2 mysql.StringExpression
|
||||
Value3 mysql.StringExpression
|
||||
}{
|
||||
Value1: mysql.NewEnumValue("value1"),
|
||||
Value2: mysql.NewEnumValue("value2"),
|
||||
Value3: mysql.NewEnumValue("value3"),
|
||||
}
|
||||
`
|
||||
|
||||
var allTypesModelContent = `
|
||||
//
|
||||
// Code generated by go-jet DO NOT EDIT.
|
||||
//
|
||||
// WARNING: Changes to this file may cause incorrect behavior
|
||||
// and will be lost if the code is regenerated
|
||||
//
|
||||
|
||||
package model
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
type AllTypes struct {
|
||||
Boolean bool
|
||||
BooleanPtr *bool
|
||||
TinyInt int8
|
||||
UTinyInt uint8
|
||||
SmallInt int16
|
||||
USmallInt uint16
|
||||
MediumInt int32
|
||||
UMediumInt uint32
|
||||
Integer int32
|
||||
UInteger uint32
|
||||
BigInt int64
|
||||
UBigInt uint64
|
||||
TinyIntPtr *int8
|
||||
UTinyIntPtr *uint8
|
||||
SmallIntPtr *int16
|
||||
USmallIntPtr *uint16
|
||||
MediumIntPtr *int32
|
||||
UMediumIntPtr *uint32
|
||||
IntegerPtr *int32
|
||||
UIntegerPtr *uint32
|
||||
BigIntPtr *int64
|
||||
UBigIntPtr *uint64
|
||||
Decimal float64
|
||||
DecimalPtr *float64
|
||||
Numeric float64
|
||||
NumericPtr *float64
|
||||
Float float64
|
||||
FloatPtr *float64
|
||||
Double float64
|
||||
DoublePtr *float64
|
||||
Real float64
|
||||
RealPtr *float64
|
||||
Bit string
|
||||
BitPtr *string
|
||||
Time time.Time
|
||||
TimePtr *time.Time
|
||||
Date time.Time
|
||||
DatePtr *time.Time
|
||||
DateTime time.Time
|
||||
DateTimePtr *time.Time
|
||||
Timestamp time.Time
|
||||
TimestampPtr *time.Time
|
||||
Year int16
|
||||
YearPtr *int16
|
||||
Char string
|
||||
CharPtr *string
|
||||
VarChar string
|
||||
VarCharPtr *string
|
||||
Binary []byte
|
||||
BinaryPtr *[]byte
|
||||
VarBinary []byte
|
||||
VarBinaryPtr *[]byte
|
||||
Blob []byte
|
||||
BlobPtr *[]byte
|
||||
Text string
|
||||
TextPtr *string
|
||||
Enum AllTypesEnum
|
||||
EnumPtr *AllTypesEnumPtr
|
||||
Set string
|
||||
SetPtr *string
|
||||
JSON string
|
||||
JSONPtr *string
|
||||
}
|
||||
`
|
||||
|
||||
var allTypesTableContent = `
|
||||
//
|
||||
// Code generated by go-jet DO NOT EDIT.
|
||||
//
|
||||
// WARNING: Changes to this file may cause incorrect behavior
|
||||
// and will be lost if the code is regenerated
|
||||
//
|
||||
|
||||
package table
|
||||
|
||||
import (
|
||||
"github.com/go-jet/jet/v2/mysql"
|
||||
)
|
||||
|
||||
var AllTypes = newAllTypesTable("test_sample", "all_types", "")
|
||||
|
||||
type allTypesTable struct {
|
||||
mysql.Table
|
||||
|
||||
// Columns
|
||||
Boolean mysql.ColumnBool
|
||||
BooleanPtr mysql.ColumnBool
|
||||
TinyInt mysql.ColumnInteger
|
||||
UTinyInt mysql.ColumnInteger
|
||||
SmallInt mysql.ColumnInteger
|
||||
USmallInt mysql.ColumnInteger
|
||||
MediumInt mysql.ColumnInteger
|
||||
UMediumInt mysql.ColumnInteger
|
||||
Integer mysql.ColumnInteger
|
||||
UInteger mysql.ColumnInteger
|
||||
BigInt mysql.ColumnInteger
|
||||
UBigInt mysql.ColumnInteger
|
||||
TinyIntPtr mysql.ColumnInteger
|
||||
UTinyIntPtr mysql.ColumnInteger
|
||||
SmallIntPtr mysql.ColumnInteger
|
||||
USmallIntPtr mysql.ColumnInteger
|
||||
MediumIntPtr mysql.ColumnInteger
|
||||
UMediumIntPtr mysql.ColumnInteger
|
||||
IntegerPtr mysql.ColumnInteger
|
||||
UIntegerPtr mysql.ColumnInteger
|
||||
BigIntPtr mysql.ColumnInteger
|
||||
UBigIntPtr mysql.ColumnInteger
|
||||
Decimal mysql.ColumnFloat
|
||||
DecimalPtr mysql.ColumnFloat
|
||||
Numeric mysql.ColumnFloat
|
||||
NumericPtr mysql.ColumnFloat
|
||||
Float mysql.ColumnFloat
|
||||
FloatPtr mysql.ColumnFloat
|
||||
Double mysql.ColumnFloat
|
||||
DoublePtr mysql.ColumnFloat
|
||||
Real mysql.ColumnFloat
|
||||
RealPtr mysql.ColumnFloat
|
||||
Bit mysql.ColumnString
|
||||
BitPtr mysql.ColumnString
|
||||
Time mysql.ColumnTime
|
||||
TimePtr mysql.ColumnTime
|
||||
Date mysql.ColumnDate
|
||||
DatePtr mysql.ColumnDate
|
||||
DateTime mysql.ColumnTimestamp
|
||||
DateTimePtr mysql.ColumnTimestamp
|
||||
Timestamp mysql.ColumnTimestamp
|
||||
TimestampPtr mysql.ColumnTimestamp
|
||||
Year mysql.ColumnInteger
|
||||
YearPtr mysql.ColumnInteger
|
||||
Char mysql.ColumnString
|
||||
CharPtr mysql.ColumnString
|
||||
VarChar mysql.ColumnString
|
||||
VarCharPtr mysql.ColumnString
|
||||
Binary mysql.ColumnBlob
|
||||
BinaryPtr mysql.ColumnBlob
|
||||
VarBinary mysql.ColumnBlob
|
||||
VarBinaryPtr mysql.ColumnBlob
|
||||
Blob mysql.ColumnBlob
|
||||
BlobPtr mysql.ColumnBlob
|
||||
Text mysql.ColumnString
|
||||
TextPtr mysql.ColumnString
|
||||
Enum mysql.ColumnString
|
||||
EnumPtr mysql.ColumnString
|
||||
Set mysql.ColumnString
|
||||
SetPtr mysql.ColumnString
|
||||
JSON mysql.ColumnString
|
||||
JSONPtr mysql.ColumnString
|
||||
|
||||
AllColumns mysql.ColumnList
|
||||
MutableColumns mysql.ColumnList
|
||||
DefaultColumns mysql.ColumnList
|
||||
}
|
||||
|
||||
type AllTypesTable struct {
|
||||
allTypesTable
|
||||
|
||||
NEW allTypesTable
|
||||
}
|
||||
|
||||
// AS creates new AllTypesTable with assigned alias
|
||||
func (a AllTypesTable) AS(alias string) *AllTypesTable {
|
||||
return newAllTypesTable(a.SchemaName(), a.TableName(), alias)
|
||||
}
|
||||
|
||||
// Schema creates new AllTypesTable with assigned schema name
|
||||
func (a AllTypesTable) FromSchema(schemaName string) *AllTypesTable {
|
||||
return newAllTypesTable(schemaName, a.TableName(), a.Alias())
|
||||
}
|
||||
|
||||
// WithPrefix creates new AllTypesTable with assigned table prefix
|
||||
func (a AllTypesTable) WithPrefix(prefix string) *AllTypesTable {
|
||||
return newAllTypesTable(a.SchemaName(), prefix+a.TableName(), a.TableName())
|
||||
}
|
||||
|
||||
// WithSuffix creates new AllTypesTable with assigned table suffix
|
||||
func (a AllTypesTable) WithSuffix(suffix string) *AllTypesTable {
|
||||
return newAllTypesTable(a.SchemaName(), a.TableName()+suffix, a.TableName())
|
||||
}
|
||||
|
||||
func newAllTypesTable(schemaName, tableName, alias string) *AllTypesTable {
|
||||
return &AllTypesTable{
|
||||
allTypesTable: newAllTypesTableImpl(schemaName, tableName, alias),
|
||||
NEW: newAllTypesTableImpl("", "new", ""),
|
||||
}
|
||||
}
|
||||
|
||||
func newAllTypesTableImpl(schemaName, tableName, alias string) allTypesTable {
|
||||
var (
|
||||
BooleanColumn = mysql.BoolColumn("boolean")
|
||||
BooleanPtrColumn = mysql.BoolColumn("boolean_ptr")
|
||||
TinyIntColumn = mysql.IntegerColumn("tiny_int")
|
||||
UTinyIntColumn = mysql.IntegerColumn("u_tiny_int")
|
||||
SmallIntColumn = mysql.IntegerColumn("small_int")
|
||||
USmallIntColumn = mysql.IntegerColumn("u_small_int")
|
||||
MediumIntColumn = mysql.IntegerColumn("medium_int")
|
||||
UMediumIntColumn = mysql.IntegerColumn("u_medium_int")
|
||||
IntegerColumn = mysql.IntegerColumn("integer")
|
||||
UIntegerColumn = mysql.IntegerColumn("u_integer")
|
||||
BigIntColumn = mysql.IntegerColumn("big_int")
|
||||
UBigIntColumn = mysql.IntegerColumn("u_big_int")
|
||||
TinyIntPtrColumn = mysql.IntegerColumn("tiny_int_ptr")
|
||||
UTinyIntPtrColumn = mysql.IntegerColumn("u_tiny_int_ptr")
|
||||
SmallIntPtrColumn = mysql.IntegerColumn("small_int_ptr")
|
||||
USmallIntPtrColumn = mysql.IntegerColumn("u_small_int_ptr")
|
||||
MediumIntPtrColumn = mysql.IntegerColumn("medium_int_ptr")
|
||||
UMediumIntPtrColumn = mysql.IntegerColumn("u_medium_int_ptr")
|
||||
IntegerPtrColumn = mysql.IntegerColumn("integer_ptr")
|
||||
UIntegerPtrColumn = mysql.IntegerColumn("u_integer_ptr")
|
||||
BigIntPtrColumn = mysql.IntegerColumn("big_int_ptr")
|
||||
UBigIntPtrColumn = mysql.IntegerColumn("u_big_int_ptr")
|
||||
DecimalColumn = mysql.FloatColumn("decimal")
|
||||
DecimalPtrColumn = mysql.FloatColumn("decimal_ptr")
|
||||
NumericColumn = mysql.FloatColumn("numeric")
|
||||
NumericPtrColumn = mysql.FloatColumn("numeric_ptr")
|
||||
FloatColumn = mysql.FloatColumn("float")
|
||||
FloatPtrColumn = mysql.FloatColumn("float_ptr")
|
||||
DoubleColumn = mysql.FloatColumn("double")
|
||||
DoublePtrColumn = mysql.FloatColumn("double_ptr")
|
||||
RealColumn = mysql.FloatColumn("real")
|
||||
RealPtrColumn = mysql.FloatColumn("real_ptr")
|
||||
BitColumn = mysql.StringColumn("bit")
|
||||
BitPtrColumn = mysql.StringColumn("bit_ptr")
|
||||
TimeColumn = mysql.TimeColumn("time")
|
||||
TimePtrColumn = mysql.TimeColumn("time_ptr")
|
||||
DateColumn = mysql.DateColumn("date")
|
||||
DatePtrColumn = mysql.DateColumn("date_ptr")
|
||||
DateTimeColumn = mysql.TimestampColumn("date_time")
|
||||
DateTimePtrColumn = mysql.TimestampColumn("date_time_ptr")
|
||||
TimestampColumn = mysql.TimestampColumn("timestamp")
|
||||
TimestampPtrColumn = mysql.TimestampColumn("timestamp_ptr")
|
||||
YearColumn = mysql.IntegerColumn("year")
|
||||
YearPtrColumn = mysql.IntegerColumn("year_ptr")
|
||||
CharColumn = mysql.StringColumn("char")
|
||||
CharPtrColumn = mysql.StringColumn("char_ptr")
|
||||
VarCharColumn = mysql.StringColumn("var_char")
|
||||
VarCharPtrColumn = mysql.StringColumn("var_char_ptr")
|
||||
BinaryColumn = mysql.BlobColumn("binary")
|
||||
BinaryPtrColumn = mysql.BlobColumn("binary_ptr")
|
||||
VarBinaryColumn = mysql.BlobColumn("var_binary")
|
||||
VarBinaryPtrColumn = mysql.BlobColumn("var_binary_ptr")
|
||||
BlobColumn = mysql.BlobColumn("blob")
|
||||
BlobPtrColumn = mysql.BlobColumn("blob_ptr")
|
||||
TextColumn = mysql.StringColumn("text")
|
||||
TextPtrColumn = mysql.StringColumn("text_ptr")
|
||||
EnumColumn = mysql.StringColumn("enum")
|
||||
EnumPtrColumn = mysql.StringColumn("enum_ptr")
|
||||
SetColumn = mysql.StringColumn("set")
|
||||
SetPtrColumn = mysql.StringColumn("set_ptr")
|
||||
JSONColumn = mysql.StringColumn("json")
|
||||
JSONPtrColumn = mysql.StringColumn("json_ptr")
|
||||
allColumns = mysql.ColumnList{BooleanColumn, BooleanPtrColumn, TinyIntColumn, UTinyIntColumn, SmallIntColumn, USmallIntColumn, MediumIntColumn, UMediumIntColumn, IntegerColumn, UIntegerColumn, BigIntColumn, UBigIntColumn, TinyIntPtrColumn, UTinyIntPtrColumn, SmallIntPtrColumn, USmallIntPtrColumn, MediumIntPtrColumn, UMediumIntPtrColumn, IntegerPtrColumn, UIntegerPtrColumn, BigIntPtrColumn, UBigIntPtrColumn, DecimalColumn, DecimalPtrColumn, NumericColumn, NumericPtrColumn, FloatColumn, FloatPtrColumn, DoubleColumn, DoublePtrColumn, RealColumn, RealPtrColumn, BitColumn, BitPtrColumn, TimeColumn, TimePtrColumn, DateColumn, DatePtrColumn, DateTimeColumn, DateTimePtrColumn, TimestampColumn, TimestampPtrColumn, YearColumn, YearPtrColumn, CharColumn, CharPtrColumn, VarCharColumn, VarCharPtrColumn, BinaryColumn, BinaryPtrColumn, VarBinaryColumn, VarBinaryPtrColumn, BlobColumn, BlobPtrColumn, TextColumn, TextPtrColumn, EnumColumn, EnumPtrColumn, SetColumn, SetPtrColumn, JSONColumn, JSONPtrColumn}
|
||||
mutableColumns = mysql.ColumnList{BooleanColumn, BooleanPtrColumn, TinyIntColumn, UTinyIntColumn, SmallIntColumn, USmallIntColumn, MediumIntColumn, UMediumIntColumn, IntegerColumn, UIntegerColumn, BigIntColumn, UBigIntColumn, TinyIntPtrColumn, UTinyIntPtrColumn, SmallIntPtrColumn, USmallIntPtrColumn, MediumIntPtrColumn, UMediumIntPtrColumn, IntegerPtrColumn, UIntegerPtrColumn, BigIntPtrColumn, UBigIntPtrColumn, DecimalColumn, DecimalPtrColumn, NumericColumn, NumericPtrColumn, FloatColumn, FloatPtrColumn, DoubleColumn, DoublePtrColumn, RealColumn, RealPtrColumn, BitColumn, BitPtrColumn, TimeColumn, TimePtrColumn, DateColumn, DatePtrColumn, DateTimeColumn, DateTimePtrColumn, TimestampColumn, TimestampPtrColumn, YearColumn, YearPtrColumn, CharColumn, CharPtrColumn, VarCharColumn, VarCharPtrColumn, BinaryColumn, BinaryPtrColumn, VarBinaryColumn, VarBinaryPtrColumn, BlobColumn, BlobPtrColumn, TextColumn, TextPtrColumn, EnumColumn, EnumPtrColumn, SetColumn, SetPtrColumn, JSONColumn, JSONPtrColumn}
|
||||
defaultColumns = mysql.ColumnList{BooleanColumn, TinyIntColumn, UTinyIntColumn, SmallIntColumn, USmallIntColumn, MediumIntColumn, UMediumIntColumn, IntegerColumn, UIntegerColumn, BigIntColumn, UBigIntColumn, DecimalColumn, NumericColumn, FloatColumn, DoubleColumn, RealColumn, BitColumn, TimeColumn, DateColumn, DateTimeColumn, TimestampColumn, YearColumn, CharColumn, VarCharColumn, BinaryColumn, VarBinaryColumn, EnumColumn, SetColumn}
|
||||
)
|
||||
|
||||
return allTypesTable{
|
||||
Table: mysql.NewTable(schemaName, tableName, alias, allColumns...),
|
||||
|
||||
//Columns
|
||||
Boolean: BooleanColumn,
|
||||
BooleanPtr: BooleanPtrColumn,
|
||||
TinyInt: TinyIntColumn,
|
||||
UTinyInt: UTinyIntColumn,
|
||||
SmallInt: SmallIntColumn,
|
||||
USmallInt: USmallIntColumn,
|
||||
MediumInt: MediumIntColumn,
|
||||
UMediumInt: UMediumIntColumn,
|
||||
Integer: IntegerColumn,
|
||||
UInteger: UIntegerColumn,
|
||||
BigInt: BigIntColumn,
|
||||
UBigInt: UBigIntColumn,
|
||||
TinyIntPtr: TinyIntPtrColumn,
|
||||
UTinyIntPtr: UTinyIntPtrColumn,
|
||||
SmallIntPtr: SmallIntPtrColumn,
|
||||
USmallIntPtr: USmallIntPtrColumn,
|
||||
MediumIntPtr: MediumIntPtrColumn,
|
||||
UMediumIntPtr: UMediumIntPtrColumn,
|
||||
IntegerPtr: IntegerPtrColumn,
|
||||
UIntegerPtr: UIntegerPtrColumn,
|
||||
BigIntPtr: BigIntPtrColumn,
|
||||
UBigIntPtr: UBigIntPtrColumn,
|
||||
Decimal: DecimalColumn,
|
||||
DecimalPtr: DecimalPtrColumn,
|
||||
Numeric: NumericColumn,
|
||||
NumericPtr: NumericPtrColumn,
|
||||
Float: FloatColumn,
|
||||
FloatPtr: FloatPtrColumn,
|
||||
Double: DoubleColumn,
|
||||
DoublePtr: DoublePtrColumn,
|
||||
Real: RealColumn,
|
||||
RealPtr: RealPtrColumn,
|
||||
Bit: BitColumn,
|
||||
BitPtr: BitPtrColumn,
|
||||
Time: TimeColumn,
|
||||
TimePtr: TimePtrColumn,
|
||||
Date: DateColumn,
|
||||
DatePtr: DatePtrColumn,
|
||||
DateTime: DateTimeColumn,
|
||||
DateTimePtr: DateTimePtrColumn,
|
||||
Timestamp: TimestampColumn,
|
||||
TimestampPtr: TimestampPtrColumn,
|
||||
Year: YearColumn,
|
||||
YearPtr: YearPtrColumn,
|
||||
Char: CharColumn,
|
||||
CharPtr: CharPtrColumn,
|
||||
VarChar: VarCharColumn,
|
||||
VarCharPtr: VarCharPtrColumn,
|
||||
Binary: BinaryColumn,
|
||||
BinaryPtr: BinaryPtrColumn,
|
||||
VarBinary: VarBinaryColumn,
|
||||
VarBinaryPtr: VarBinaryPtrColumn,
|
||||
Blob: BlobColumn,
|
||||
BlobPtr: BlobPtrColumn,
|
||||
Text: TextColumn,
|
||||
TextPtr: TextPtrColumn,
|
||||
Enum: EnumColumn,
|
||||
EnumPtr: EnumPtrColumn,
|
||||
Set: SetColumn,
|
||||
SetPtr: SetPtrColumn,
|
||||
JSON: JSONColumn,
|
||||
JSONPtr: JSONPtrColumn,
|
||||
|
||||
AllColumns: allColumns,
|
||||
MutableColumns: mutableColumns,
|
||||
DefaultColumns: defaultColumns,
|
||||
}
|
||||
}
|
||||
`
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import (
|
|||
jetmysql "github.com/go-jet/jet/v2/mysql"
|
||||
"github.com/go-jet/jet/v2/stmtcache"
|
||||
"github.com/go-jet/jet/v2/tests/dbconfig"
|
||||
"github.com/go-jet/jet/v2/tests/internal/utils/repo"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/stretchr/testify/require"
|
||||
"runtime"
|
||||
|
|
@ -21,12 +22,14 @@ var db *stmtcache.DB
|
|||
|
||||
var source string
|
||||
var withStatementCaching bool
|
||||
var testRoot string
|
||||
|
||||
const MariaDB = "MariaDB"
|
||||
|
||||
func init() {
|
||||
source = os.Getenv("MY_SQL_SOURCE")
|
||||
withStatementCaching = os.Getenv("JET_TESTS_WITH_STMT_CACHE") == "true"
|
||||
testRoot = repo.GetTestsDirPath()
|
||||
}
|
||||
|
||||
func sourceIsMariaDB() bool {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package postgres
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"github.com/go-jet/jet/v2/internal/utils/ptr"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
|
|
@ -485,6 +486,7 @@ func TestExpressionCast(t *testing.T) {
|
|||
CAST(String("1999-01-08 04:05:06")).AS_TIMESTAMP(),
|
||||
CAST(String("1999-01-08 04:05:06+01:00")).AS_TIMESTAMPZ(),
|
||||
CAST(String("04:05:06")).AS_INTERVAL(),
|
||||
CAST(String("some text")).AS_BYTEA().EQ(Bytea([]byte("some text"))),
|
||||
|
||||
func() ProjectionList {
|
||||
if sourceIsCockroachDB() {
|
||||
|
|
@ -538,7 +540,6 @@ func TestStringOperators(t *testing.T) {
|
|||
AllTypes.Text.BETWEEN(String("min"), String("max")),
|
||||
AllTypes.Text.NOT_BETWEEN(AllTypes.VarChar, AllTypes.CharPtr),
|
||||
AllTypes.Text.CONCAT(String("text2")),
|
||||
AllTypes.Text.CONCAT(Int(11)),
|
||||
AllTypes.Text.LIKE(String("abc")),
|
||||
AllTypes.Text.NOT_LIKE(String("_b_")),
|
||||
AllTypes.Text.REGEXP_LIKE(String("^t")),
|
||||
|
|
@ -569,18 +570,18 @@ func TestStringOperators(t *testing.T) {
|
|||
CONCAT(AllTypes.VarCharPtr, AllTypes.VarCharPtr, String("aaa"), Int(1)),
|
||||
CONCAT(Bool(false), Int(1), Float(22.2), String("test test")),
|
||||
CONCAT_WS(String("string1"), Int(1), Float(11.22), String("bytea"), Bool(false)), //Float(11.12)),
|
||||
CONVERT(Bytea("bytea"), String("UTF8"), String("LATIN1")),
|
||||
CONVERT(AllTypes.Bytea, String("UTF8"), String("LATIN1")),
|
||||
CONVERT_FROM(Bytea("text_in_utf8"), String("UTF8")),
|
||||
CONVERT_TO(String("text_in_utf8"), String("UTF8")),
|
||||
ENCODE(Bytea("123\000\001"), String("base64")),
|
||||
DECODE(String("MTIzAAE="), String("base64")),
|
||||
CONVERT(Bytea("bytea"), UTF8, LATIN1),
|
||||
CONVERT(AllTypes.Bytea, UTF8, LATIN1),
|
||||
CONVERT_FROM(Bytea("text_in_utf8"), UTF8),
|
||||
CONVERT_TO(String("text_in_utf8"), UTF8),
|
||||
ENCODE(Bytea("some text"), Escape),
|
||||
DECODE(String("MTIzAAE="), Base64),
|
||||
FORMAT(String("Hello %s, %1$s"), String("World")),
|
||||
INITCAP(String("hi THOMAS")),
|
||||
LEFT(String("abcde"), Int(2)),
|
||||
RIGHT(String("abcde"), Int(2)),
|
||||
LENGTH(Bytea("jose")),
|
||||
LENGTH(Bytea("jose"), String("UTF8")),
|
||||
LENGTH(Bytea("jose"), UTF8),
|
||||
LPAD(String("Hi"), Int(5)),
|
||||
LPAD(String("Hi"), Int(5), String("xy")),
|
||||
RPAD(String("Hi"), Int(5)),
|
||||
|
|
@ -601,6 +602,155 @@ func TestStringOperators(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestBlob(t *testing.T) {
|
||||
|
||||
var sampleBlob = Bytea([]byte{11, 0, 22, 33, 44})
|
||||
var textBlob = Bytea([]byte("text blob"))
|
||||
|
||||
stmt := SELECT(
|
||||
AllTypes.Bytea.EQ(sampleBlob),
|
||||
AllTypes.Bytea.EQ(AllTypes.ByteaPtr),
|
||||
AllTypes.Bytea.NOT_EQ(sampleBlob),
|
||||
AllTypes.Bytea.GT(textBlob),
|
||||
AllTypes.Bytea.GT_EQ(AllTypes.ByteaPtr),
|
||||
AllTypes.Bytea.LT(AllTypes.ByteaPtr),
|
||||
AllTypes.Bytea.LT_EQ(sampleBlob),
|
||||
AllTypes.Bytea.BETWEEN(Bytea([]byte("min")), Bytea([]byte("max"))),
|
||||
AllTypes.Bytea.NOT_BETWEEN(AllTypes.Bytea, AllTypes.ByteaPtr),
|
||||
AllTypes.Bytea.CONCAT(textBlob),
|
||||
|
||||
func() ProjectionList {
|
||||
if sourceIsCockroachDB() {
|
||||
return ProjectionList{NULL}
|
||||
}
|
||||
// cockroach doesn't support currently
|
||||
return ProjectionList{
|
||||
AllTypes.Bytea.LIKE(Bytea("b'%pattern%'")),
|
||||
AllTypes.Bytea.NOT_LIKE(Bytea("b'%pattern%'")),
|
||||
|
||||
BTRIM(AllTypes.Bytea, Bytea([]byte{33})),
|
||||
RTRIM(AllTypes.ByteaPtr, sampleBlob),
|
||||
LTRIM(sampleBlob, textBlob),
|
||||
CONCAT(sampleBlob, AllTypes.ByteaPtr, textBlob),
|
||||
BIT_COUNT(sampleBlob).EQ(Int(3)),
|
||||
LENGTH(textBlob, UTF8).EQ(Int(4)),
|
||||
|
||||
CONVERT(textBlob, UTF8, WIN1252),
|
||||
CONVERT(AllTypes.Bytea, UTF8, LATIN1).EQ(sampleBlob),
|
||||
}
|
||||
}(),
|
||||
|
||||
BIT_LENGTH(textBlob),
|
||||
OCTET_LENGTH(textBlob),
|
||||
|
||||
GET_BIT(textBlob, Int(2)).EQ(Int(23)),
|
||||
GET_BYTE(sampleBlob, Int(1)).EQ(Int(0)),
|
||||
SET_BIT(textBlob, Int(1), Int(0)).EQ(sampleBlob),
|
||||
SET_BYTE(textBlob, Int(1), Int(0)).EQ(textBlob),
|
||||
LENGTH(sampleBlob),
|
||||
|
||||
SUBSTR(AllTypes.Bytea, Int(0), Int(2)),
|
||||
|
||||
MD5(AllTypes.Bytea),
|
||||
SHA224(AllTypes.Bytea),
|
||||
SHA256(AllTypes.Bytea),
|
||||
SHA384(AllTypes.Bytea),
|
||||
SHA512(AllTypes.Bytea),
|
||||
|
||||
ENCODE(sampleBlob, Base64),
|
||||
DECODE(String("A234C12B"), Hex).EQ(sampleBlob),
|
||||
|
||||
CONVERT_FROM(AllTypes.ByteaPtr, UTF8).EQ(AllTypes.VarChar),
|
||||
CONVERT_TO(AllTypes.Text, UTF8).NOT_EQ(textBlob),
|
||||
|
||||
RawBytea("DECODE(#1::text, #2)", RawArgs{
|
||||
"#1": "A234C12B",
|
||||
"#2": "hex",
|
||||
}).EQ(sampleBlob),
|
||||
).FROM(
|
||||
AllTypes,
|
||||
)
|
||||
|
||||
if !sourceIsCockroachDB() {
|
||||
testutils.AssertStatementSql(t, stmt, `
|
||||
SELECT all_types.bytea = $1::bytea,
|
||||
all_types.bytea = all_types.bytea_ptr,
|
||||
all_types.bytea != $2::bytea,
|
||||
all_types.bytea > $3::bytea,
|
||||
all_types.bytea >= all_types.bytea_ptr,
|
||||
all_types.bytea < all_types.bytea_ptr,
|
||||
all_types.bytea <= $4::bytea,
|
||||
all_types.bytea BETWEEN $5::bytea AND $6::bytea,
|
||||
all_types.bytea NOT BETWEEN all_types.bytea AND all_types.bytea_ptr,
|
||||
all_types.bytea || $7::bytea,
|
||||
all_types.bytea LIKE $8::bytea,
|
||||
all_types.bytea NOT LIKE $9::bytea,
|
||||
BTRIM(all_types.bytea, $10::bytea),
|
||||
RTRIM(all_types.bytea_ptr, $11::bytea),
|
||||
LTRIM($12::bytea, $13::bytea),
|
||||
CONCAT($14::bytea, all_types.bytea_ptr, $15::bytea),
|
||||
BIT_COUNT($16::bytea) = $17,
|
||||
LENGTH($18::bytea, $19::text) = $20,
|
||||
CONVERT($21::bytea, $22::text, $23::text),
|
||||
CONVERT(all_types.bytea, $24::text, $25::text) = $26::bytea,
|
||||
BIT_LENGTH($27::bytea),
|
||||
OCTET_LENGTH($28::bytea),
|
||||
GET_BIT($29::bytea, $30) = $31,
|
||||
GET_BYTE($32::bytea, $33) = $34,
|
||||
SET_BIT($35::bytea, $36, $37) = $38::bytea,
|
||||
SET_BYTE($39::bytea, $40, $41) = $42::bytea,
|
||||
LENGTH($43::bytea),
|
||||
SUBSTR(all_types.bytea, $44, $45),
|
||||
MD5(all_types.bytea),
|
||||
SHA224(all_types.bytea),
|
||||
SHA256(all_types.bytea),
|
||||
SHA384(all_types.bytea),
|
||||
SHA512(all_types.bytea),
|
||||
ENCODE($46::bytea, $47::text),
|
||||
DECODE($48::text, $49::text) = $50::bytea,
|
||||
CONVERT_FROM(all_types.bytea_ptr, $51::text) = all_types.var_char,
|
||||
CONVERT_TO(all_types.text, $52::text) != $53::bytea,
|
||||
(DECODE($54::text, $55)) = $56::bytea
|
||||
FROM test_sample.all_types;
|
||||
`)
|
||||
}
|
||||
|
||||
var dest []struct{}
|
||||
err := stmt.Query(db, &dest)
|
||||
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestBlobConversion(t *testing.T) {
|
||||
|
||||
nonPrintable := []byte{11, 22, 33, 44, 55}
|
||||
printable := []byte("this is blob")
|
||||
|
||||
stmt := SELECT(
|
||||
Bytea(nonPrintable).AS("non_printable"),
|
||||
Bytea(printable).AS("printable"),
|
||||
|
||||
ENCODE(Bytea(nonPrintable), Base64).AS("non_printable_base64"),
|
||||
CONVERT_FROM(Bytea(printable), UTF8).AS("printable_utf8"),
|
||||
)
|
||||
|
||||
var dest struct {
|
||||
NonPrintable []byte
|
||||
Printable []byte
|
||||
|
||||
NonPrintableBase64 []byte
|
||||
PrintableUTF8 string
|
||||
}
|
||||
|
||||
err := stmt.Query(db, &dest)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, dest.NonPrintable, nonPrintable)
|
||||
require.Equal(t, dest.Printable, printable)
|
||||
require.Equal(t, dest.NonPrintableBase64, []byte(base64.StdEncoding.EncodeToString(nonPrintable)))
|
||||
require.Equal(t, dest.PrintableUTF8, string(printable))
|
||||
}
|
||||
|
||||
func TestBoolOperators(t *testing.T) {
|
||||
query := AllTypes.SELECT(
|
||||
AllTypes.Boolean.EQ(AllTypes.BooleanPtr).AS("EQ1"),
|
||||
|
|
@ -1208,6 +1358,106 @@ SELECT ROW($1::integer, $2::real, $3::text) AS "row",
|
|||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestAllTypesSubQueryFrom(t *testing.T) {
|
||||
subQuery := SELECT(
|
||||
AllTypes.Boolean,
|
||||
AllTypes.Integer,
|
||||
AllTypes.DoublePrecision,
|
||||
AllTypes.Text,
|
||||
AllTypes.Date,
|
||||
AllTypes.Time,
|
||||
AllTypes.Timez,
|
||||
AllTypes.Timestamp,
|
||||
AllTypes.Interval,
|
||||
AllTypes.Bytea,
|
||||
).FROM(
|
||||
AllTypes,
|
||||
).AsTable("subQuery")
|
||||
|
||||
stmt := SELECT(
|
||||
AllTypes.Boolean.From(subQuery),
|
||||
AllTypes.Integer.From(subQuery),
|
||||
AllTypes.DoublePrecision.From(subQuery),
|
||||
AllTypes.Text.From(subQuery),
|
||||
AllTypes.Date.From(subQuery),
|
||||
AllTypes.Time.From(subQuery),
|
||||
AllTypes.Timez.From(subQuery),
|
||||
AllTypes.Timestamp.From(subQuery),
|
||||
AllTypes.Interval.From(subQuery),
|
||||
AllTypes.Bytea.From(subQuery),
|
||||
).FROM(
|
||||
subQuery,
|
||||
)
|
||||
|
||||
testutils.AssertStatementSql(t, stmt, `
|
||||
SELECT "subQuery"."all_types.boolean" AS "all_types.boolean",
|
||||
"subQuery"."all_types.integer" AS "all_types.integer",
|
||||
"subQuery"."all_types.double_precision" AS "all_types.double_precision",
|
||||
"subQuery"."all_types.text" AS "all_types.text",
|
||||
"subQuery"."all_types.date" AS "all_types.date",
|
||||
"subQuery"."all_types.time" AS "all_types.time",
|
||||
"subQuery"."all_types.timez" AS "all_types.timez",
|
||||
"subQuery"."all_types.timestamp" AS "all_types.timestamp",
|
||||
"subQuery"."all_types.interval" AS "all_types.interval",
|
||||
"subQuery"."all_types.bytea" AS "all_types.bytea"
|
||||
FROM (
|
||||
SELECT all_types.boolean AS "all_types.boolean",
|
||||
all_types.integer AS "all_types.integer",
|
||||
all_types.double_precision AS "all_types.double_precision",
|
||||
all_types.text AS "all_types.text",
|
||||
all_types.date AS "all_types.date",
|
||||
all_types.time AS "all_types.time",
|
||||
all_types.timez AS "all_types.timez",
|
||||
all_types.timestamp AS "all_types.timestamp",
|
||||
all_types.interval AS "all_types.interval",
|
||||
all_types.bytea AS "all_types.bytea"
|
||||
FROM test_sample.all_types
|
||||
) AS "subQuery";
|
||||
`)
|
||||
|
||||
var dest []model.AllTypes
|
||||
|
||||
err := stmt.Query(db, &dest)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestAllTypesUpdateSet(t *testing.T) {
|
||||
|
||||
stmt := AllTypes.UPDATE().
|
||||
SET(
|
||||
AllTypes.Boolean.SET(Bool(false)),
|
||||
AllTypes.Integer.SET(Int(2)),
|
||||
AllTypes.DoublePrecision.SET(Float(2.22)),
|
||||
AllTypes.Text.SET(Text("some text")),
|
||||
AllTypes.Date.SET(DateT(time.Now())),
|
||||
AllTypes.Time.SET(TimeT(time.Now())),
|
||||
AllTypes.Timez.SET(TimezT(time.Now())),
|
||||
AllTypes.Timestamp.SET(TimestampT(time.Now())),
|
||||
AllTypes.Interval.SET(INTERVAL(1, HOUR)),
|
||||
AllTypes.Bytea.SET(Bytea([]byte{11, 22, 33, 44})),
|
||||
).WHERE(Bool(true))
|
||||
|
||||
testutils.AssertStatementSql(t, stmt, `
|
||||
UPDATE test_sample.all_types
|
||||
SET boolean = $1::boolean,
|
||||
integer = $2,
|
||||
double_precision = $3,
|
||||
text = $4::text,
|
||||
date = $5::date,
|
||||
time = $6::time without time zone,
|
||||
timez = $7::time with time zone,
|
||||
timestamp = $8::timestamp without time zone,
|
||||
interval = INTERVAL '1 HOUR',
|
||||
bytea = $9::bytea
|
||||
WHERE $10::boolean;
|
||||
`)
|
||||
|
||||
testutils.ExecuteInTxAndRollback(t, db, func(tx qrm.DB) {
|
||||
_, err := stmt.Exec(tx)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestSubQueryColumnReference(t *testing.T) {
|
||||
type expected struct {
|
||||
sql string
|
||||
|
|
|
|||
|
|
@ -974,8 +974,8 @@ type allTypesTable struct {
|
|||
Char postgres.ColumnString
|
||||
TextPtr postgres.ColumnString
|
||||
Text postgres.ColumnString
|
||||
ByteaPtr postgres.ColumnString
|
||||
Bytea postgres.ColumnString
|
||||
ByteaPtr postgres.ColumnBytea
|
||||
Bytea postgres.ColumnBytea
|
||||
TimestampzPtr postgres.ColumnTimestampz
|
||||
Timestampz postgres.ColumnTimestampz
|
||||
TimestampPtr postgres.ColumnTimestamp
|
||||
|
|
@ -1078,8 +1078,8 @@ func newAllTypesTableImpl(schemaName, tableName, alias string) allTypesTable {
|
|||
CharColumn = postgres.StringColumn("char")
|
||||
TextPtrColumn = postgres.StringColumn("text_ptr")
|
||||
TextColumn = postgres.StringColumn("text")
|
||||
ByteaPtrColumn = postgres.StringColumn("bytea_ptr")
|
||||
ByteaColumn = postgres.StringColumn("bytea")
|
||||
ByteaPtrColumn = postgres.ByteaColumn("bytea_ptr")
|
||||
ByteaColumn = postgres.ByteaColumn("bytea")
|
||||
TimestampzPtrColumn = postgres.TimestampzColumn("timestampz_ptr")
|
||||
TimestampzColumn = postgres.TimestampzColumn("timestampz")
|
||||
TimestampPtrColumn = postgres.TimestampColumn("timestamp_ptr")
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ const CockroachDB = "COCKROACH_DB"
|
|||
func init() {
|
||||
source = os.Getenv("PG_SOURCE")
|
||||
withStatementCaching = os.Getenv("JET_TESTS_WITH_STMT_CACHE") == "true"
|
||||
testRoot = repo.GetTestsDirPath()
|
||||
}
|
||||
|
||||
func sourceIsCockroachDB() bool {
|
||||
|
|
@ -46,8 +47,6 @@ func skipForCockroachDB(t *testing.T) {
|
|||
func TestMain(m *testing.M) {
|
||||
defer profile.Start().Stop()
|
||||
|
||||
setTestRoot()
|
||||
|
||||
for _, driverName := range []string{"postgres", "pgx"} {
|
||||
|
||||
fmt.Printf("\nRunning postgres tests for driver: %s, caching enabled: %t \n", driverName, withStatementCaching)
|
||||
|
|
@ -94,10 +93,6 @@ func getConnectionString() string {
|
|||
return dbconfig.PostgresConnectString
|
||||
}
|
||||
|
||||
func setTestRoot() {
|
||||
testRoot = repo.GetTestsDirPath()
|
||||
}
|
||||
|
||||
var loggedSQL string
|
||||
var loggedSQLArgs []interface{}
|
||||
var loggedDebugSQL string
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package sqlite
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"github.com/go-jet/jet/v2/internal/testutils"
|
||||
"github.com/go-jet/jet/v2/internal/utils/ptr"
|
||||
. "github.com/go-jet/jet/v2/sqlite"
|
||||
|
|
@ -18,7 +19,7 @@ import (
|
|||
|
||||
func TestAllTypes(t *testing.T) {
|
||||
|
||||
dest := []model.AllTypes{}
|
||||
var dest []model.AllTypes
|
||||
|
||||
err := SELECT(AllTypes.AllColumns).
|
||||
FROM(AllTypes).
|
||||
|
|
@ -571,12 +572,102 @@ func TestStringOperators(t *testing.T) {
|
|||
SUBSTR(AllTypes.CharPtr, Int(3), Int(2)),
|
||||
).FROM(AllTypes)
|
||||
|
||||
dest := []struct{}{}
|
||||
var dest []struct{}
|
||||
err := query.Query(sampleDB, &dest)
|
||||
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestBlob(t *testing.T) {
|
||||
|
||||
var sampleBlob = Blob([]byte{11, 0, 22, 33, 44})
|
||||
var textBlob = Blob([]byte("text blob"))
|
||||
|
||||
stmt := SELECT(
|
||||
AllTypes.Blob.EQ(sampleBlob),
|
||||
AllTypes.Blob.EQ(AllTypes.BlobPtr),
|
||||
AllTypes.Blob.NOT_EQ(sampleBlob),
|
||||
AllTypes.Blob.GT(textBlob),
|
||||
AllTypes.Blob.GT_EQ(AllTypes.BlobPtr),
|
||||
AllTypes.Blob.LT(AllTypes.BlobPtr),
|
||||
AllTypes.Blob.LT_EQ(sampleBlob),
|
||||
AllTypes.Blob.BETWEEN(Blob([]byte("min")), Blob([]byte("max"))),
|
||||
AllTypes.Blob.NOT_BETWEEN(AllTypes.Blob, AllTypes.BlobPtr),
|
||||
AllTypes.Blob.CONCAT(textBlob),
|
||||
AllTypes.Blob.LIKE(AllTypes.BlobPtr),
|
||||
AllTypes.Blob.NOT_LIKE(sampleBlob),
|
||||
|
||||
RTRIM(AllTypes.BlobPtr, sampleBlob),
|
||||
LTRIM(sampleBlob, textBlob),
|
||||
LENGTH(sampleBlob),
|
||||
OCTET_LENGTH(textBlob),
|
||||
SUBSTR(AllTypes.Blob, Int(0), Int(2)),
|
||||
|
||||
HEX(AllTypes.Blob),
|
||||
UNHEX(AllTypes.Text),
|
||||
).FROM(
|
||||
AllTypes,
|
||||
)
|
||||
|
||||
testutils.AssertDebugStatementSql(t, stmt, `
|
||||
SELECT all_types.blob = X'0b0016212c',
|
||||
all_types.blob = all_types.blob_ptr,
|
||||
all_types.blob != X'0b0016212c',
|
||||
all_types.blob > X'7465787420626c6f62',
|
||||
all_types.blob >= all_types.blob_ptr,
|
||||
all_types.blob < all_types.blob_ptr,
|
||||
all_types.blob <= X'0b0016212c',
|
||||
all_types.blob BETWEEN X'6d696e' AND X'6d6178',
|
||||
all_types.blob NOT BETWEEN all_types.blob AND all_types.blob_ptr,
|
||||
all_types.blob || X'7465787420626c6f62',
|
||||
all_types.blob LIKE all_types.blob_ptr,
|
||||
all_types.blob NOT LIKE X'0b0016212c',
|
||||
RTRIM(all_types.blob_ptr, X'0b0016212c'),
|
||||
LTRIM(X'0b0016212c', X'7465787420626c6f62'),
|
||||
LENGTH(X'0b0016212c'),
|
||||
OCTET_LENGTH(X'7465787420626c6f62'),
|
||||
SUBSTR(all_types.blob, 0, 2),
|
||||
HEX(all_types.blob),
|
||||
UNHEX(all_types.text)
|
||||
FROM all_types;
|
||||
`)
|
||||
|
||||
var dest []struct{}
|
||||
err := stmt.Query(sampleDB, &dest)
|
||||
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestBlobConversion(t *testing.T) {
|
||||
|
||||
nonPrintable := []byte{0x11, 0x22, 0x33, 0x44, 0x55}
|
||||
printable := []byte("this is blob")
|
||||
|
||||
stmt := SELECT(
|
||||
Blob(nonPrintable).AS("non_printable"),
|
||||
Blob(printable).AS("printable"),
|
||||
|
||||
HEX(Blob(nonPrintable)).AS("non_printable_hex"),
|
||||
UNHEX(String("1122334455")).AS("non_printable_unhex"),
|
||||
)
|
||||
|
||||
var dest struct {
|
||||
NonPrintable []byte
|
||||
Printable []byte
|
||||
|
||||
NonPrintableHex string
|
||||
NonPrintableUnHex []byte
|
||||
}
|
||||
|
||||
err := stmt.Query(db, &dest)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, dest.NonPrintable, nonPrintable)
|
||||
require.Equal(t, dest.Printable, printable)
|
||||
require.Equal(t, dest.NonPrintableHex, hex.EncodeToString(nonPrintable))
|
||||
require.Equal(t, dest.NonPrintableUnHex, nonPrintable)
|
||||
}
|
||||
|
||||
func TestReservedWord(t *testing.T) {
|
||||
stmt := SELECT(ReservedWords.AllColumns).
|
||||
FROM(ReservedWords)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue