diff --git a/.gitea/workflows/test-mssql.yml b/.gitea/workflows/test-mssql.yml index c5baf194..4988fa7e 100644 --- a/.gitea/workflows/test-mssql.yml +++ b/.gitea/workflows/test-mssql.yml @@ -45,6 +45,14 @@ jobs: TEST_MSSQL_USERNAME: sa TEST_MSSQL_PASSWORD: "yourStrong(!)Password" run: TEST_MSSQL_DEFAULT_VARCHAR=NVARCHAR TEST_MSSQL_DEFAULT_CHAR=NCHAR make test-mssql + - name: test mssql with collation + env: + TEST_MSSQL_HOST: mssql + TEST_MSSQL_DBNAME: xorm_test + TEST_MSSQL_USERNAME: sa + TEST_MSSQL_PASSWORD: "yourStrong(!)Password" + TEST_MSSQL_COLLATION: SQL_Latin1_General_CP1_CS_AS + run: TEST_MSSQL_DEFAULT_VARCHAR=NVARCHAR TEST_MSSQL_DEFAULT_CHAR=NCHAR make test-mssql services: mssql: diff --git a/Makefile b/Makefile index ff93f181..52f81293 100644 --- a/Makefile +++ b/Makefile @@ -25,6 +25,7 @@ TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1 TEST_MSSQL_DEFAULT_VARCHAR ?= varchar TEST_MSSQL_DEFAULT_CHAR ?= char TEST_MSSQL_DO_NVARCHAR_OVERRIDE_TEST ?= true +TEST_MSSQL_COLLATION ?= TEST_MYSQL_HOST ?= mysql:3306 TEST_MYSQL_CHARSET ?= utf8 @@ -152,6 +153,7 @@ test-mssql: go-check -conn_str="server=$(TEST_MSSQL_HOST);user id=$(TEST_MSSQL_USERNAME);password=$(TEST_MSSQL_PASSWORD);database=$(TEST_MSSQL_DBNAME)" \ -default_varchar=$(TEST_MSSQL_DEFAULT_VARCHAR) -default_char=$(TEST_MSSQL_DEFAULT_CHAR) \ -do_nvarchar_override_test=$(TEST_MSSQL_DO_NVARCHAR_OVERRIDE_TEST) \ + -collation=$(TEST_MSSQL_COLLATION) \ -coverprofile=mssql.$(TEST_QUOTE_POLICY).coverage.out -covermode=atomic -timeout=20m .PNONY: test-mssql\#% diff --git a/dialects/mssql.go b/dialects/mssql.go index d936fd80..f6a1a0de 100644 --- a/dialects/mssql.go +++ b/dialects/mssql.go @@ -586,7 +586,7 @@ func (db *mssql) GetIndexes(ctx context.Context, queryer core.Queryer, tableName IXS.NAME AS [INDEX_NAME], C.NAME AS [COLUMN_NAME], IXS.is_unique AS [IS_UNIQUE] -FROM SYS.INDEXES IXS +FROM sys.indexes IXS INNER JOIN SYS.INDEX_COLUMNS IXCS ON IXS.OBJECT_ID=IXCS.OBJECT_ID AND IXS.INDEX_ID = IXCS.INDEX_ID INNER JOIN SYS.COLUMNS C ON IXS.OBJECT_ID=C.OBJECT_ID diff --git a/go.mod b/go.mod index c6665677..0587d258 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,6 @@ require ( github.com/mattn/go-sqlite3 v1.14.16 github.com/shopspring/decimal v1.3.1 github.com/stretchr/testify v1.8.1 - github.com/syndtr/goleveldb v1.0.0 modernc.org/sqlite v1.20.4 xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 xorm.io/xorm v1.3.4 @@ -39,6 +38,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect + github.com/syndtr/goleveldb v1.0.0 // indirect golang.org/x/crypto v0.6.0 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/sys v0.5.0 // indirect diff --git a/tests/tests.go b/tests/tests.go index bcb70e78..290af0a7 100644 --- a/tests/tests.go +++ b/tests/tests.go @@ -39,6 +39,7 @@ var ( quotePolicyStr = flag.String("quote", "always", "quote could be always, none, reversed") defaultVarchar = flag.String("default_varchar", "varchar", "default varchar type, mssql only, could be varchar or nvarchar, default is varchar") defaultChar = flag.String("default_char", "char", "default char type, mssql only, could be char or nchar, default is char") + collation = flag.String("collation", "", "default database collation, it's different for different database") tableMapper names.Mapper colMapper names.Mapper ) @@ -54,7 +55,12 @@ func createEngine(dbType, connStr string) error { if err != nil { return err } - if _, err = db.Exec("If(db_id(N'xorm_test') IS NULL) BEGIN CREATE DATABASE xorm_test; END;"); err != nil { + createDBSQL := "If(db_id(N'xorm_test') IS NULL) BEGIN CREATE DATABASE xorm_test" + if collation != nil && *collation != "" { + createDBSQL += fmt.Sprintf(" COLLATE %s", *collation) + } + createDBSQL += "; END;" + if _, err = db.Exec(createDBSQL); err != nil { return fmt.Errorf("db.Exec: %v", err) } db.Close()