From 606bab1429e7683dc8234fa5ce54cfe3f97c23b8 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 3 Feb 2019 18:56:45 +0800 Subject: [PATCH 01/24] add oracle tests --- dialects/oracle.go | 2 +- oracle_test.go | 11 +++++++++++ test_oracle.sh | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 oracle_test.go create mode 100755 test_oracle.sh diff --git a/dialects/oracle.go b/dialects/oracle.go index 04652bd6..be08a9a6 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -735,7 +735,7 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam col.SQLType = schemas.SQLType{Name: schemas.TimeStampz, DefaultLength: 0, DefaultLength2: 0} case "NUMBER": col.SQLType = schemas.SQLType{Name: schemas.Double, DefaultLength: len1, DefaultLength2: len2} - case "LONG", "LONG RAW": + case "LONG", "LONG RAW", "NCLOB", "CLOB": col.SQLType = schemas.SQLType{Name: schemas.Text, DefaultLength: 0, DefaultLength2: 0} case "RAW": col.SQLType = schemas.SQLType{Name: schemas.Binary, DefaultLength: 0, DefaultLength2: 0} diff --git a/oracle_test.go b/oracle_test.go new file mode 100644 index 00000000..ccebd965 --- /dev/null +++ b/oracle_test.go @@ -0,0 +1,11 @@ +// Copyright 20190 The Xorm Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build oracle + +package xorm + +import ( + _ "github.com/mattn/go-oci8" +) diff --git a/test_oracle.sh b/test_oracle.sh new file mode 100755 index 00000000..56bd4609 --- /dev/null +++ b/test_oracle.sh @@ -0,0 +1 @@ +go test -tags=oracle -db=oci8 -conn_str="system/oracle@localhost:1521/xe" \ No newline at end of file -- 2.40.1 From 1e0921d45572768ebd33f11a22141c788502ca8b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 21 Feb 2020 10:41:32 +0800 Subject: [PATCH 02/24] Add oracle on makefile and drone --- .drone.yml | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 18 +++++++++++++++++ go.mod | 1 + go.sum | 3 +++ test_oracle.sh | 1 - 5 files changed, 75 insertions(+), 1 deletion(-) delete mode 100755 test_oracle.sh diff --git a/.drone.yml b/.drone.yml index faaeca17..11c8040a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -398,6 +398,58 @@ services: # commands: # - /bin/bash /startDm.sh +--- +kind: pipeline +name: test-oracle +depends_on: + - test-cockroach +steps: +- name: test-oracle + pull: never + image: golang:1.15 + volumes: + - name: cache + path: /go/pkg/mod + environment: + TEST_ORACLE_HOST: oracle:1521 + TEST_ORACLE_DBNAME: xe + TEST_ORACLE_USERNAME: system + TEST_ORACLE_PASSWORD: oracle + TEST_CACHE_ENABLE: false + commands: + - make test-oracle + +- name: test-oracle-schema + pull: never + image: golang:1.15 + depends_on: + - test-oracle + volumes: + - name: cache + path: /go/pkg/mod + environment: + TEST_ORACLE_SCHEMA: xorm + TEST_ORACLE_HOST: oracle:1521 + TEST_ORACLE_DBNAME: xe + TEST_ORACLE_USERNAME: system + TEST_ORACLE_PASSWORD: oracle + TEST_CACHE_ENABLE: true + SCHEMA: xorm + commands: + - make test-oracle + +volumes: +- name: cache + host: + path: /tmp/cache + +services: + - name: oracle + image: oracleinanutshell/oracle-xe-11g:latest + environment: + ORACLE_ALLOW_REMOTE: true + ORACLE_ENABLE_XDB: true + --- kind: pipeline name: merge_coverage @@ -410,6 +462,7 @@ depends_on: - test-tidb - test-cockroach #- test-dameng + - test-oracle trigger: ref: - refs/heads/master diff --git a/Makefile b/Makefile index e9bd4129..87ad9a16 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,12 @@ TEST_MYSQL_DBNAME ?= xorm_test TEST_MYSQL_USERNAME ?= root TEST_MYSQL_PASSWORD ?= +TEST_ORACLE_HOST ?= oracle:1521 +TEST_ORACLE_SCHEMA ?= +TEST_ORACLE_DBNAME ?= xe +TEST_ORACLE_USERNAME ?= system +TEST_ORACLE_PASSWORD ?= oracle + TEST_PGSQL_HOST ?= pgsql:5432 TEST_PGSQL_SCHEMA ?= TEST_PGSQL_DBNAME ?= xorm_test @@ -190,6 +196,18 @@ test-mysql\#%: go-check -conn_str="$(TEST_MYSQL_USERNAME):$(TEST_MYSQL_PASSWORD)@tcp($(TEST_MYSQL_HOST))/$(TEST_MYSQL_DBNAME)?charset=$(TEST_MYSQL_CHARSET)" \ -coverprofile=mysql.$(TEST_QUOTE_POLICY).$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic +.PNONY: test-oracle +test-oracle: go-check + $(GO) test -race -tags=oracle -db=oci8 -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + -conn_str="$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ + -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic + +.PHONY: test-oracle\#% +test-oralce\#%: go-check + $(GO) test -race -run $* -tags=oracle -db=oci8 -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + -conn_str="postgres://$(TEST_PGSQL_USERNAME):$(TEST_PGSQL_PASSWORD)@$(TEST_PGSQL_HOST)/$(TEST_PGSQL_DBNAME)" \ + -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic + .PNONY: test-postgres test-postgres: go-check $(GO) test $(INTEGRATION_PACKAGES) -v -race -db=postgres -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ diff --git a/go.mod b/go.mod index 98b5617c..f97ede0b 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/jackc/pgx/v4 v4.12.0 github.com/json-iterator/go v1.1.11 github.com/lib/pq v1.10.2 + github.com/mattn/go-oci8 v0.1.0 github.com/mattn/go-sqlite3 v1.14.8 github.com/shopspring/decimal v1.2.0 github.com/stretchr/testify v1.7.0 diff --git a/go.sum b/go.sum index 4596f326..e117870a 100644 --- a/go.sum +++ b/go.sum @@ -245,6 +245,9 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-oci8 v0.1.0 h1:HnmdOy+/cLPN43obUokKka4hRE4b7Hp3U3E0fs1clp8= +github.com/mattn/go-oci8 v0.1.0/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= +github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU= github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= diff --git a/test_oracle.sh b/test_oracle.sh deleted file mode 100755 index 56bd4609..00000000 --- a/test_oracle.sh +++ /dev/null @@ -1 +0,0 @@ -go test -tags=oracle -db=oci8 -conn_str="system/oracle@localhost:1521/xe" \ No newline at end of file -- 2.40.1 From f6f647d6881649eadfdef6b8f786cd142b1a11e3 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 26 Feb 2020 10:04:04 +0800 Subject: [PATCH 03/24] move goracle to godror --- Makefile | 23 ++++++++++--- dialects/oracle.go | 65 +++++++++++++++++-------------------- go.sum | 2 -- integrations/engine_test.go | 4 ++- 4 files changed, 52 insertions(+), 42 deletions(-) diff --git a/Makefile b/Makefile index 87ad9a16..77f0c72b 100644 --- a/Makefile +++ b/Makefile @@ -196,18 +196,33 @@ test-mysql\#%: go-check -conn_str="$(TEST_MYSQL_USERNAME):$(TEST_MYSQL_PASSWORD)@tcp($(TEST_MYSQL_HOST))/$(TEST_MYSQL_DBNAME)?charset=$(TEST_MYSQL_CHARSET)" \ -coverprofile=mysql.$(TEST_QUOTE_POLICY).$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -.PNONY: test-oracle -test-oracle: go-check +.PHONY: test-oracle +test-oracle: test-godror + +.PNONY: test-oci8 +test-oci8: go-check $(GO) test -race -tags=oracle -db=oci8 -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -.PHONY: test-oracle\#% -test-oralce\#%: go-check +.PHONY: test-oci8\#% +test-oci8\#%: go-check $(GO) test -race -run $* -tags=oracle -db=oci8 -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="postgres://$(TEST_PGSQL_USERNAME):$(TEST_PGSQL_PASSWORD)@$(TEST_PGSQL_HOST)/$(TEST_PGSQL_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic +.PHONY: test-godror +test-godror: go-check + $(GO) test -race -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ + -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic + +.PHONY: test-godror\#% +test-godror\#%: go-check + $(GO) test -race -run $* -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ + -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic + .PNONY: test-postgres test-postgres: go-check $(GO) test $(INTEGRATION_PACKAGES) -v -race -db=postgres -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ diff --git a/dialects/oracle.go b/dialects/oracle.go index be08a9a6..6fed0b6a 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -9,7 +9,7 @@ import ( "database/sql" "errors" "fmt" - "regexp" + "net/url" "strconv" "strings" @@ -856,6 +856,7 @@ func (db *oracle) Filters() []Filter { } } +// https://github.com/godror/godror type godrorDriver struct { baseDriver } @@ -866,22 +867,31 @@ func (g *godrorDriver) Features() *DriverFeatures { } } -func (g *godrorDriver) Parse(driverName, dataSourceName string) (*URI, error) { - db := &URI{DBType: schemas.ORACLE} - dsnPattern := regexp.MustCompile( - `^(?:(?P.*?)(?::(?P.*))?@)?` + // [user[:password]@] - `(?:(?P[^\(]*)(?:\((?P[^\)]*)\))?)?` + // [net[(addr)]] - `\/(?P.*?)` + // /dbname - `(?:\?(?P[^\?]*))?$`) // [?param1=value1¶mN=valueN] - matches := dsnPattern.FindStringSubmatch(dataSourceName) - // tlsConfigRegister := make(map[string]*tls.Config) - names := dsnPattern.SubexpNames() - - for i, match := range matches { - if names[i] == "dbname" { - db.DBName = match - } +func parseOracle(driverName, dataSourceName string) (*URI, error) { + var connStr = dataSourceName + if !strings.HasPrefix(connStr, "oracle://") { + connStr = fmt.Sprintf("oracle://%s", connStr) } + + u, err := url.Parse(connStr) + if err != nil { + return nil, err + } + + db := &URI{ + DBType: schemas.ORACLE, + Host: u.Hostname(), + Port: u.Port(), + DBName: strings.TrimLeft(u.RequestURI(), "/"), + } + + if u.User != nil { + db.User = u.User.Username() + db.Passwd, _ = u.User.Password() + } + + fmt.Printf("%#v\n", db) + if db.DBName == "" { return nil, errors.New("dbname is empty") } @@ -908,27 +918,12 @@ func (g *godrorDriver) GenScanResult(colType string) (interface{}, error) { } } -type oci8Driver struct { - godrorDriver +func (g *godrorDriver) Parse(driverName, dataSourceName string) (*URI, error) { + return parseOracle(driverName, dataSourceName) } // dataSourceName=user/password@ipv4:port/dbname // dataSourceName=user/password@[ipv6]:port/dbname -func (o *oci8Driver) Parse(driverName, dataSourceName string) (*URI, error) { - db := &URI{DBType: schemas.ORACLE} - dsnPattern := regexp.MustCompile( - `^(?P.*)\/(?P.*)@` + // user:password@ - `(?P.*)` + // ip:port - `\/(?P.*)`) // dbname - matches := dsnPattern.FindStringSubmatch(dataSourceName) - names := dsnPattern.SubexpNames() - for i, match := range matches { - if names[i] == "dbname" { - db.DBName = match - } - } - if db.DBName == "" && len(matches) != 0 { - return nil, errors.New("dbname is empty") - } - return db, nil +type oci8Driver struct { + godrorDriver } diff --git a/go.sum b/go.sum index e117870a..1b13ef82 100644 --- a/go.sum +++ b/go.sum @@ -278,9 +278,7 @@ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtb github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= diff --git a/integrations/engine_test.go b/integrations/engine_test.go index 74e1f903..06ab4988 100644 --- a/integrations/engine_test.go +++ b/integrations/engine_test.go @@ -17,12 +17,14 @@ import ( _ "gitee.com/travelliu/dm" _ "github.com/denisenkom/go-mssqldb" _ "github.com/go-sql-driver/mysql" + _ "github.com/godror/godror" _ "github.com/jackc/pgx/v4/stdlib" _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" - "github.com/stretchr/testify/assert" _ "github.com/ziutek/mymysql/godrv" _ "modernc.org/sqlite" + + "github.com/stretchr/testify/assert" ) func TestPing(t *testing.T) { -- 2.40.1 From e840c2e45692039b4e2be35d1060e0a34ccb9113 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 4 Mar 2020 13:38:05 +0800 Subject: [PATCH 04/24] fix oracle --- dialects/oracle.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dialects/oracle.go b/dialects/oracle.go index 6fed0b6a..42c5b290 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -773,8 +773,8 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam } func (db *oracle) GetTables(queryer core.Queryer, ctx context.Context) ([]*schemas.Table, error) { - args := []interface{}{} - s := "SELECT table_name FROM user_tables" + s := "SELECT table_name FROM user_tables WHERE TABLESPACE_NAME = :1 AND table_name NOT LIKE :2" + args := []interface{}{strings.ToUpper(db.uri.User), "%$%"} rows, err := queryer.QueryContext(ctx, s, args...) if err != nil { -- 2.40.1 From fce6fbd4d5b83b4267a7b05893a09eecd68dfdf9 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 8 Mar 2020 01:06:27 +0800 Subject: [PATCH 05/24] fix bugs --- Makefile | 8 ++-- core/interface.go | 1 + dialects/dialect.go | 4 +- dialects/mssql.go | 6 +-- dialects/oracle.go | 76 ++++++++++++++++++++++++++++++------- integrations/engine_test.go | 3 +- integrations/tests.go | 2 +- session_insert.go | 5 ++- session_schema.go | 29 +++++++++++++- 9 files changed, 104 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index 77f0c72b..62e91439 100644 --- a/Makefile +++ b/Makefile @@ -201,25 +201,25 @@ test-oracle: test-godror .PNONY: test-oci8 test-oci8: go-check - $(GO) test -race -tags=oracle -db=oci8 -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + $(GO) test -v -race -tags=oracle -db=oci8 -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PHONY: test-oci8\#% test-oci8\#%: go-check - $(GO) test -race -run $* -tags=oracle -db=oci8 -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + $(GO) test -v -race -run $* -tags=oracle -db=oci8 -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="postgres://$(TEST_PGSQL_USERNAME):$(TEST_PGSQL_PASSWORD)@$(TEST_PGSQL_HOST)/$(TEST_PGSQL_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PHONY: test-godror test-godror: go-check - $(GO) test -race -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + $(GO) test -v -race -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PHONY: test-godror\#% test-godror\#%: go-check - $(GO) test -race -run $* -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + $(GO) test -v -race -run $* -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic diff --git a/core/interface.go b/core/interface.go index a5c8e4e2..b2746ae0 100644 --- a/core/interface.go +++ b/core/interface.go @@ -7,6 +7,7 @@ import ( // Queryer represents an interface to query a SQL to get data from database type Queryer interface { + QueryRowContext(ctx context.Context, query string, args ...interface{}) *Row QueryContext(ctx context.Context, query string, args ...interface{}) (*Rows, error) } diff --git a/dialects/dialect.go b/dialects/dialect.go index 460ab56a..d06e4f28 100644 --- a/dialects/dialect.go +++ b/dialects/dialect.go @@ -169,9 +169,9 @@ func (db *Base) DropSequenceSQL(seqName string) (string, error) { } // DropTableSQL returns drop table SQL -func (db *Base) DropTableSQL(tableName string) (string, bool) { +func (db *Base) DropTableSQL(tableName, autoincrCol string) (string, bool) { quote := db.dialect.Quoter().Quote - return fmt.Sprintf("DROP TABLE IF EXISTS %s", quote(tableName)), true + return []string{fmt.Sprintf("DROP TABLE IF EXISTS %s", quote(tableName))}, true } // HasRecords returns true if the SQL has records returned diff --git a/dialects/mssql.go b/dialects/mssql.go index cd19afb9..1a8206ff 100644 --- a/dialects/mssql.go +++ b/dialects/mssql.go @@ -421,10 +421,10 @@ func (db *mssql) AutoIncrStr() string { return "IDENTITY" } -func (db *mssql) DropTableSQL(tableName string) (string, bool) { - return fmt.Sprintf("IF EXISTS (SELECT * FROM sysobjects WHERE id = "+ +func (db *mssql) DropTableSQL(tableName, autoincrCol string) ([]string, bool) { + return []string{fmt.Sprintf("IF EXISTS (SELECT * FROM sysobjects WHERE id = "+ "object_id(N'%s') and OBJECTPROPERTY(id, N'IsUserTable') = 1) "+ - "DROP TABLE \"%s\"", tableName, tableName), true + "DROP TABLE \"%s\"", tableName, tableName)}, true } func (db *mssql) ModifyColumnSQL(tableName string, col *schemas.Column) string { diff --git a/dialects/oracle.go b/dialects/oracle.go index 42c5b290..6940199b 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -553,9 +553,9 @@ func (db *oracle) SQLType(c *schemas.Column) string { case schemas.Binary, schemas.VarBinary, schemas.Blob, schemas.TinyBlob, schemas.MediumBlob, schemas.LongBlob, schemas.Bytea: return schemas.Blob case schemas.Time, schemas.DateTime, schemas.TimeStamp: - res = schemas.TimeStamp + res = schemas.Date case schemas.TimeStampz: - res = "TIMESTAMP WITH TIME ZONE" + res = "TIMESTAMP" case schemas.Float, schemas.Double, schemas.Numeric, schemas.Decimal: res = "NUMBER" case schemas.Text, schemas.MediumText, schemas.LongText, schemas.Json: @@ -601,8 +601,14 @@ func (db *oracle) IsReserved(name string) bool { return ok } -func (db *oracle) DropTableSQL(tableName string) (string, bool) { - return fmt.Sprintf("DROP TABLE `%s`", tableName), false +func (db *oracle) DropTableSQL(tableName, autoincrCol string) ([]string, bool) { + var sqls = []string{ + fmt.Sprintf("DROP TABLE `%s`", tableName), + } + if autoincrCol != "" { + sqls = append(sqls, fmt.Sprintf("DROP SEQUENCE %s", seqName(tableName))) + } + return sqls, false } func (db *oracle) CreateTableSQL(ctx context.Context, queryer core.Queryer, table *schemas.Table, tableName string) (string, bool, error) { @@ -672,12 +678,32 @@ func (db *oracle) IsColumnExist(queryer core.Queryer, ctx context.Context, table return db.HasRecords(queryer, ctx, query, args...) } -func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableName string) ([]string, map[string]*schemas.Column, error) { - args := []interface{}{tableName} - s := "SELECT column_name,data_default,data_type,data_length,data_precision,data_scale," + - "nullable FROM USER_TAB_COLUMNS WHERE table_name = :1" +func seqName(tableName string) string { + return "SEQ_" + strings.ToUpper(tableName) +} - rows, err := queryer.QueryContext(ctx, s, args...) +func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableName string) ([]string, map[string]*schemas.Column, error) { + //s := "SELECT column_name,data_default,data_type,data_length,data_precision,data_scale," + + // "nullable FROM USER_TAB_COLUMNS WHERE table_name = :1" + + s := `select column_name from user_cons_columns + where constraint_name = (select constraint_name from user_constraints + where table_name = :1 and constraint_type ='P')` + var pkName string + err := queryer.QueryRowContext(ctx, s, tableName).Scan(&pkName) + if err != nil { + return nil, nil, err + } + + s = `SELECT USER_TAB_COLS.COLUMN_NAME, USER_TAB_COLS.DATA_DEFAULT, USER_TAB_COLS.DATA_TYPE, USER_TAB_COLS.DATA_LENGTH, + USER_TAB_COLS.data_precision, USER_TAB_COLS.data_scale, USER_TAB_COLS.NULLABLE, + user_col_comments.comments + FROM USER_TAB_COLS + LEFT JOIN user_col_comments on user_col_comments.TABLE_NAME=USER_TAB_COLS.TABLE_NAME + AND user_col_comments.COLUMN_NAME=USER_TAB_COLS.COLUMN_NAME + WHERE USER_TAB_COLS.table_name = :1` + + rows, err := queryer.QueryContext(ctx, s, tableName) if err != nil { return nil, nil, err } @@ -689,11 +715,11 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam col := new(schemas.Column) col.Indexes = make(map[string]int) - var colName, colDefault, nullable, dataType, dataPrecision, dataScale *string + var colName, colDefault, nullable, dataType, dataPrecision, dataScale, comment *string var dataLen int err = rows.Scan(&colName, &colDefault, &dataType, &dataLen, &dataPrecision, - &dataScale, &nullable) + &dataScale, &nullable, &comment) if err != nil { return nil, nil, err } @@ -710,10 +736,28 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam col.Nullable = false } - var ignore bool + if comment != nil { + col.Comment = *comment + } + if pkName != "" && pkName == col.Name { + col.IsPrimaryKey = true - var dt string - var len1, len2 int + has, err := db.HasRecords(queryer, ctx, "SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = :1", seqName(tableName)) + if err != nil { + return nil, nil, err + } + if has { + col.IsAutoIncrement = true + } + + fmt.Println("-----", pkName, col.Name, col.IsPrimaryKey) + } + + var ( + ignore bool + dt string + len1, len2 int + ) dts := strings.Split(*dataType, "(") dt = dts[0] if len(dts) > 1 { @@ -769,6 +813,10 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam return nil, nil, rows.Err() } + /*select * + from user_tab_comments + where Table_Name='用户表' */ + return colSeq, cols, nil } diff --git a/integrations/engine_test.go b/integrations/engine_test.go index 06ab4988..047cba83 100644 --- a/integrations/engine_test.go +++ b/integrations/engine_test.go @@ -63,8 +63,7 @@ func TestAutoTransaction(t *testing.T) { engine.Transaction(func(session *xorm.Session) (interface{}, error) { _, err := session.Insert(TestTx{Msg: "hi"}) assert.NoError(t, err) - - return nil, nil + return nil, err }) has, err := engine.Exist(&TestTx{Msg: "hi"}) diff --git a/integrations/tests.go b/integrations/tests.go index 8b14b0f4..9f01e9ae 100644 --- a/integrations/tests.go +++ b/integrations/tests.go @@ -162,7 +162,7 @@ func createEngine(dbType, connStr string) error { if err != nil { return err } - var tableNames = make([]interface{}, 0, len(tables)) + var tableNames []interface{} for _, table := range tables { tableNames = append(tableNames, table.Name) } diff --git a/session_insert.go b/session_insert.go index 43a4118b..a1bb7007 100644 --- a/session_insert.go +++ b/session_insert.go @@ -257,7 +257,9 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) { if err := session.statement.SetRefBean(bean); err != nil { return 0, err } - if len(session.statement.TableName()) <= 0 { + + var tableName = session.statement.TableName() + if tableName == "" { return 0, ErrTableNotFound } @@ -271,7 +273,6 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) { processor.BeforeInsert() } - var tableName = session.statement.TableName() table := session.statement.RefTable colNames, args, err := session.genInsertColumns(bean) diff --git a/session_schema.go b/session_schema.go index e9ed9ec5..bbb5d0be 100644 --- a/session_schema.go +++ b/session_schema.go @@ -148,8 +148,33 @@ func (session *Session) DropTable(beanOrTableName interface{}) error { } func (session *Session) dropTable(beanOrTableName interface{}) error { - tableName := session.engine.TableName(beanOrTableName) - sqlStr, checkIfExist := session.engine.dialect.DropTableSQL(session.engine.TableName(tableName, true)) + var tableName, autoIncrementCol string + switch beanOrTableName.(type) { + case *schemas.Table: + table := beanOrTableName.(*schemas.Table) + tableName = table.Name + if table.AutoIncrColumn() != nil { + autoIncrementCol = table.AutoIncrColumn().Name + } + case string: + tableName = beanOrTableName.(string) + default: + v := utils.ReflectValue(beanOrTableName) + table, err := session.engine.tagParser.ParseWithCache(v) + if err != nil { + return err + } + if session.statement.AltTableName != "" { + tableName = session.statement.AltTableName + } else { + tableName = table.Name + } + if table.AutoIncrColumn() != nil { + autoIncrementCol = table.AutoIncrColumn().Name + } + } + + sqlStrs, checkIfExist := session.engine.dialect.DropTableSQL(tableName, autoIncrementCol) if !checkIfExist { exist, err := session.engine.dialect.IsTableExist(session.getQueryer(), session.ctx, tableName) if err != nil { -- 2.40.1 From 75405e50d207c86a0eba00603658d2957c8bb4f4 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 9 Mar 2020 10:30:41 +0800 Subject: [PATCH 06/24] Fix quote --- dialects/oracle.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dialects/oracle.go b/dialects/oracle.go index 6940199b..05a7fa37 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -603,7 +603,7 @@ func (db *oracle) IsReserved(name string) bool { func (db *oracle) DropTableSQL(tableName, autoincrCol string) ([]string, bool) { var sqls = []string{ - fmt.Sprintf("DROP TABLE `%s`", tableName), + fmt.Sprintf("DROP TABLE %s", db.quoter.Quote(tableName)), } if autoincrCol != "" { sqls = append(sqls, fmt.Sprintf("DROP SEQUENCE %s", seqName(tableName))) -- 2.40.1 From 75f02eca0f8e80d653d9b8c00c5bb8e52d26b08f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 9 Mar 2020 17:37:13 +0800 Subject: [PATCH 07/24] Fix batch insert --- core/db_test.go | 1 - dialects/dialect.go | 2 +- dialects/oracle.go | 7 +++---- dialects/time.go | 6 ++++++ session_insert.go | 8 ++++++-- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/core/db_test.go b/core/db_test.go index e9c2d82d..5c5a5781 100644 --- a/core/db_test.go +++ b/core/db_test.go @@ -96,7 +96,6 @@ func BenchmarkOriQuery(b *testing.B) { if err != nil { b.Error(err) } - //fmt.Println(Id, Name, Title, Age, Alias, NickName) } rows.Close() } diff --git a/dialects/dialect.go b/dialects/dialect.go index d06e4f28..c6ce3653 100644 --- a/dialects/dialect.go +++ b/dialects/dialect.go @@ -169,7 +169,7 @@ func (db *Base) DropSequenceSQL(seqName string) (string, error) { } // DropTableSQL returns drop table SQL -func (db *Base) DropTableSQL(tableName, autoincrCol string) (string, bool) { +func (db *Base) DropTableSQL(tableName, autoincrCol string) ([]string, bool) { quote := db.dialect.Quoter().Quote return []string{fmt.Sprintf("DROP TABLE IF EXISTS %s", quote(tableName))}, true } diff --git a/dialects/oracle.go b/dialects/oracle.go index 05a7fa37..e15cf7d0 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -692,6 +692,9 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam var pkName string err := queryer.QueryRowContext(ctx, s, tableName).Scan(&pkName) if err != nil { + if err == sql.ErrNoRows { + err = nil + } return nil, nil, err } @@ -749,8 +752,6 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam if has { col.IsAutoIncrement = true } - - fmt.Println("-----", pkName, col.Name, col.IsPrimaryKey) } var ( @@ -938,8 +939,6 @@ func parseOracle(driverName, dataSourceName string) (*URI, error) { db.Passwd, _ = u.User.Password() } - fmt.Printf("%#v\n", db) - if db.DBName == "" { return nil, errors.New("dbname is empty") } diff --git a/dialects/time.go b/dialects/time.go index f0bbb765..47ca423f 100644 --- a/dialects/time.go +++ b/dialects/time.go @@ -32,6 +32,9 @@ func FormatColumnTime(dialect Dialect, dbLocation *time.Location, col *schemas.C switch col.SQLType.Name { case schemas.Date: + if dialect.URI().DBType == schemas.ORACLE { + return t, nil + } return t.Format("2006-01-02"), nil case schemas.Time: var layout = "15:04:05" @@ -40,6 +43,9 @@ func FormatColumnTime(dialect Dialect, dbLocation *time.Location, col *schemas.C } return t.Format(layout), nil case schemas.DateTime, schemas.TimeStamp: + if dialect.URI().DBType == schemas.ORACLE { + return t, nil + } var layout = "2006-01-02 15:04:05" if col.Length > 0 { layout += "." + strings.Repeat("0", col.Length) diff --git a/session_insert.go b/session_insert.go index a1bb7007..cb95dd7f 100644 --- a/session_insert.go +++ b/session_insert.go @@ -504,13 +504,17 @@ func (session *Session) genInsertColumns(bean interface{}) ([]string, []interfac } } - if (col.IsCreated || col.IsUpdated) && session.statement.UseAutoTime /*&& isZero(fieldValue.Interface())*/ { + if (col.IsCreated || col.IsUpdated) && session.statement.UseAutoTime { // if time is non-empty, then set to auto time val, t, err := session.engine.nowTime(col) if err != nil { return nil, nil, err } - args = append(args, val) + if session.engine.dialect.URI().DBType == schemas.ORACLE { + args = append(args, t) + } else { + args = append(args, val) + } var colName = col.Name session.afterClosures = append(session.afterClosures, func(bean interface{}) { -- 2.40.1 From 1d97b52e30c4b80fe103116f1b6d968752c2a551 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 27 Mar 2020 17:28:31 +0800 Subject: [PATCH 08/24] Fix insert returnning id --- go.mod | 1 + go.sum | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index f97ede0b..415d94ed 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/go-sql-driver/mysql v1.6.0 github.com/goccy/go-json v0.7.4 github.com/jackc/pgx/v4 v4.12.0 + github.com/godror/godror v0.25.3 github.com/json-iterator/go v1.1.11 github.com/lib/pq v1.10.2 github.com/mattn/go-oci8 v0.1.0 diff --git a/go.sum b/go.sum index 1b13ef82..8d365cba 100644 --- a/go.sum +++ b/go.sum @@ -75,6 +75,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -87,6 +89,8 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/godror/godror v0.25.3 h1:ltL94Ct9otjMfUNTRMqyZh0GpepPd9f9pyFgtUciT9k= +github.com/godror/godror v0.25.3/go.mod h1:JgtdZ1iSaNoioa/B53BVVWji9J9iGPDDj2763T5d1So= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -105,6 +109,7 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -247,7 +252,6 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-oci8 v0.1.0 h1:HnmdOy+/cLPN43obUokKka4hRE4b7Hp3U3E0fs1clp8= github.com/mattn/go-oci8 v0.1.0/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU= github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= @@ -278,7 +282,9 @@ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtb github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= @@ -436,6 +442,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -- 2.40.1 From cf53cb80a06f129c2e69d1bed706afd190c14ade Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 27 Mar 2020 17:28:31 +0800 Subject: [PATCH 09/24] Fix insert returnning id --- Makefile | 8 +-- oracle_test.go => integrations/oracle_test.go | 2 +- internal/statements/insert.go | 51 ++++++++++--------- internal/statements/statement.go | 4 ++ session_insert.go | 4 +- 5 files changed, 37 insertions(+), 32 deletions(-) rename oracle_test.go => integrations/oracle_test.go (91%) diff --git a/Makefile b/Makefile index 62e91439..41f7bdd4 100644 --- a/Makefile +++ b/Makefile @@ -201,25 +201,25 @@ test-oracle: test-godror .PNONY: test-oci8 test-oci8: go-check - $(GO) test -v -race -tags=oracle -db=oci8 -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + $(GO) test $(INTEGRATION_PACKAGES) -v -race -tags=oracle -db=oci8 -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PHONY: test-oci8\#% test-oci8\#%: go-check - $(GO) test -v -race -run $* -tags=oracle -db=oci8 -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + $(GO) test $(INTEGRATION_PACKAGES) -v -race -run $* -tags=oracle -db=oci8 -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="postgres://$(TEST_PGSQL_USERNAME):$(TEST_PGSQL_PASSWORD)@$(TEST_PGSQL_HOST)/$(TEST_PGSQL_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PHONY: test-godror test-godror: go-check - $(GO) test -v -race -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + $(GO) test $(INTEGRATION_PACKAGES) -v -race -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PHONY: test-godror\#% test-godror\#%: go-check - $(GO) test -v -race -run $* -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ + $(GO) test $(INTEGRATION_PACKAGES) -v -race -run $* -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic diff --git a/oracle_test.go b/integrations/oracle_test.go similarity index 91% rename from oracle_test.go rename to integrations/oracle_test.go index ccebd965..56cd3b69 100644 --- a/oracle_test.go +++ b/integrations/oracle_test.go @@ -4,7 +4,7 @@ // +build oracle -package xorm +package integrations import ( _ "github.com/mattn/go-oci8" diff --git a/internal/statements/insert.go b/internal/statements/insert.go index 91a33319..2c3fda60 100644 --- a/internal/statements/insert.go +++ b/internal/statements/insert.go @@ -27,7 +27,7 @@ func (statement *Statement) writeInsertOutput(buf *strings.Builder, table *schem } // GenInsertSQL generates insert beans SQL -func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) (string, []interface{}, error) { +func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) (*builder.BytesWriter, error) { var ( buf = builder.NewWriter() exprs = statement.ExprColumns @@ -36,11 +36,11 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) ) if _, err := buf.WriteString("INSERT INTO "); err != nil { - return "", nil, err + return nil, err } if err := statement.dialect.Quoter().QuoteTo(buf.Builder, tableName); err != nil { - return "", nil, err + return nil, err } var hasInsertColumns = len(colNames) > 0 @@ -58,19 +58,19 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) statement.dialect.URI().DBType != schemas.DAMENG { if statement.dialect.URI().DBType == schemas.MYSQL { if _, err := buf.WriteString(" VALUES ()"); err != nil { - return "", nil, err + return nil, err } } else { if err := statement.writeInsertOutput(buf.Builder, table); err != nil { - return "", nil, err + return nil, err } if _, err := buf.WriteString(" DEFAULT VALUES"); err != nil { - return "", nil, err + return nil, err } } } else { if _, err := buf.WriteString(" ("); err != nil { - return "", nil, err + return nil, err } if needSeq { @@ -82,19 +82,19 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) } if _, err := buf.WriteString(")"); err != nil { - return "", nil, err + return nil, err } if err := statement.writeInsertOutput(buf.Builder, table); err != nil { - return "", nil, err + return nil, err } if statement.Conds().IsValid() { if _, err := buf.WriteString(" SELECT "); err != nil { - return "", nil, err + return nil, err } if err := statement.WriteArgs(buf, args); err != nil { - return "", nil, err + return nil, err } if needSeq { @@ -109,7 +109,7 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) } if len(exprs) > 0 { if _, err := buf.WriteString(","); err != nil { - return "", nil, err + return nil, err } if err := exprs.WriteArgs(buf); err != nil { return "", nil, err @@ -117,27 +117,27 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) } if _, err := buf.WriteString(" FROM "); err != nil { - return "", nil, err + return nil, err } if err := statement.dialect.Quoter().QuoteTo(buf.Builder, tableName); err != nil { - return "", nil, err + return nil, err } if _, err := buf.WriteString(" WHERE "); err != nil { - return "", nil, err + return nil, err } if err := statement.Conds().WriteTo(buf); err != nil { - return "", nil, err + return nil, err } } else { if _, err := buf.WriteString(" VALUES ("); err != nil { - return "", nil, err + return nil, err } if err := statement.WriteArgs(buf, args); err != nil { - return "", nil, err + return nil, err } // Insert tablename (id) Values(seq_tablename.nextval) @@ -154,30 +154,31 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) if len(exprs) > 0 { if _, err := buf.WriteString(","); err != nil { - return "", nil, err + return nil, err } } if err := exprs.WriteArgs(buf); err != nil { - return "", nil, err + return nil, err } if _, err := buf.WriteString(")"); err != nil { - return "", nil, err + return nil, err } } } - if len(table.AutoIncrement) > 0 && statement.dialect.URI().DBType == schemas.POSTGRES { + if len(table.AutoIncrement) > 0 && (statement.dialect.URI().DBType == schemas.POSTGRES || + statement.dialect.URI().DBType == schemas.ORACLE) { if _, err := buf.WriteString(" RETURNING "); err != nil { - return "", nil, err + return nil, err } if err := statement.dialect.Quoter().QuoteTo(buf.Builder, table.AutoIncrement); err != nil { - return "", nil, err + return nil, err } } - return buf.String(), buf.Args(), nil + return buf, nil } // GenInsertMapSQL generates insert map SQL diff --git a/internal/statements/statement.go b/internal/statements/statement.go index 80451f50..b4566a42 100644 --- a/internal/statements/statement.go +++ b/internal/statements/statement.go @@ -91,6 +91,10 @@ func NewStatement(dialect dialects.Dialect, tagParser *tags.Parser, defaultTimeZ return statement } +func (statement *Statement) Dialect() dialects.Dialect { + return statement.dialect +} + // SetTableName set table name func (statement *Statement) SetTableName(tableName string) { statement.tableName = tableName diff --git a/session_insert.go b/session_insert.go index cb95dd7f..4540af72 100644 --- a/session_insert.go +++ b/session_insert.go @@ -280,7 +280,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) { return 0, err } - sqlStr, args, err := session.statement.GenInsertSQL(colNames, args) + buf, err := session.statement.GenInsertSQL(colNames, args) if err != nil { return 0, err } @@ -384,7 +384,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) { return 1, convert.AssignValue(*aiValue, id) } - res, err := session.exec(sqlStr, args...) + res, err := session.exec(buf.String(), buf.Args()...) if err != nil { return 0, err } -- 2.40.1 From 9d6cfff9acd34090caf672a4ecd1f18aaf58ce03 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 27 Mar 2020 22:58:39 +0800 Subject: [PATCH 10/24] download instant client on Makefile --- Makefile | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 41f7bdd4..6fa94607 100644 --- a/Makefile +++ b/Makefile @@ -140,6 +140,23 @@ misspell-check: fi misspell -error -i unknwon,destory $(GOFILES) +.PHONY: install-instant-client +install-instant-client: +ifeq ("$(PKG_CONFIG_PATH)", ) + wget https://download.oracle.com/otn_software/linux/instantclient/19600/instantclient-basic-linux.x64-19.6.0.0.0dbru.zip + unzip instantclient-basic-linux.x64-19.6.0.0.0dbru.zip -d /usr/local/instantclient + echo "prefixdir=/usr/local/instantclient +libdir=${prefixdir} +includedir=${prefixdir}/sdk/include + +Name: OCI +Description: Oracle database driver +Version: 11.2 +Libs: -L${libdir} -lclntsh +Cflags: -I${includedir}" > /usr/local/instantclient/oci8.pc +export PKG_CONFIG_PATH=/usr/local/instantclient/oci8.pc +endif + .PHONY: test test: go-check $(GO) test $(PACKAGES) @@ -200,25 +217,25 @@ test-mysql\#%: go-check test-oracle: test-godror .PNONY: test-oci8 -test-oci8: go-check +test-oci8: go-check install-instant-client $(GO) test $(INTEGRATION_PACKAGES) -v -race -tags=oracle -db=oci8 -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PHONY: test-oci8\#% -test-oci8\#%: go-check +test-oci8\#%: go-check install-instant-client $(GO) test $(INTEGRATION_PACKAGES) -v -race -run $* -tags=oracle -db=oci8 -schema='$(TEST_PGSQL_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="postgres://$(TEST_PGSQL_USERNAME):$(TEST_PGSQL_PASSWORD)@$(TEST_PGSQL_HOST)/$(TEST_PGSQL_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PHONY: test-godror -test-godror: go-check +test-godror: go-check install-instant-client $(GO) test $(INTEGRATION_PACKAGES) -v -race -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic .PHONY: test-godror\#% -test-godror\#%: go-check +test-godror\#%: go-check install-instant-client $(GO) test $(INTEGRATION_PACKAGES) -v -race -run $* -tags=oracle -db=godror -schema='$(TEST_ORACLE_SCHEMA)' -cache=$(TEST_CACHE_ENABLE) \ -conn_str="oracle://$(TEST_ORACLE_USERNAME):$(TEST_ORACLE_PASSWORD)@$(TEST_ORACLE_HOST)/$(TEST_ORACLE_DBNAME)" \ -coverprofile=oracle.$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -- 2.40.1 From 561191a079bfa12f0e062bb8547306c6928a84a1 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 12 Apr 2020 20:39:30 +0800 Subject: [PATCH 11/24] Fix batch insert --- integrations/session_cond_test.go | 2 +- session_insert.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/session_cond_test.go b/integrations/session_cond_test.go index 0597d74e..c2e13c74 100644 --- a/integrations/session_cond_test.go +++ b/integrations/session_cond_test.go @@ -85,7 +85,7 @@ func TestBuilder(t *testing.T) { assert.EqualValues(t, 1, len(conds), "records should exist") conds = make([]Condition, 0) - err = testEngine.NotIn("col_name", "col1", "col2").Find(&conds) + err = testEngine.NotIn("`col_name`", "col1", "col2").Find(&conds) assert.NoError(t, err) assert.EqualValues(t, 0, len(conds), "records should not exist") diff --git a/session_insert.go b/session_insert.go index 4540af72..283c5d26 100644 --- a/session_insert.go +++ b/session_insert.go @@ -91,6 +91,7 @@ func (session *Session) insertMultipleStruct(rowsSlicePtr interface{}) (int64, e colMultiPlaces []string args []interface{} cols []*schemas.Column + insertCnt int ) for i := 0; i < size; i++ { -- 2.40.1 From 572e277b42052385589a8d744d7f777bd9be8273 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 14 Apr 2020 15:19:41 +0800 Subject: [PATCH 12/24] Fix insert --- dialects/oracle.go | 23 ++++++++++++++++++++++- internal/statements/insert.go | 5 +++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/dialects/oracle.go b/dialects/oracle.go index e15cf7d0..4f3975d0 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -10,6 +10,7 @@ import ( "errors" "fmt" "net/url" + "regexp" "strconv" "strings" @@ -916,10 +917,30 @@ func (g *godrorDriver) Features() *DriverFeatures { } } +func parseNoProtocol(driverName, dataSourceName string) (*URI, error) { + db := &URI{DBType: schemas.ORACLE} + dsnPattern := regexp.MustCompile( + `^(?P.*)\/(?P.*)@` + // user:password@ + `(?P.*)` + // ip:port + `\/(?P.*)`) // dbname + matches := dsnPattern.FindStringSubmatch(dataSourceName) + names := dsnPattern.SubexpNames() + for i, match := range matches { + switch names[i] { + case "dbname": + db.DBName = match + } + } + if db.DBName == "" && len(matches) != 0 { + return nil, errors.New("dbname is empty") + } + return db, nil +} + func parseOracle(driverName, dataSourceName string) (*URI, error) { var connStr = dataSourceName if !strings.HasPrefix(connStr, "oracle://") { - connStr = fmt.Sprintf("oracle://%s", connStr) + return parseNoProtocol(driverName, dataSourceName) } u, err := url.Parse(connStr) diff --git a/internal/statements/insert.go b/internal/statements/insert.go index 2c3fda60..d773f64b 100644 --- a/internal/statements/insert.go +++ b/internal/statements/insert.go @@ -44,6 +44,7 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) } var hasInsertColumns = len(colNames) > 0 +<<<<<<< HEAD var needSeq = len(table.AutoIncrement) > 0 && (statement.dialect.URI().DBType == schemas.ORACLE || statement.dialect.URI().DBType == schemas.DAMENG) if needSeq { for _, col := range colNames { @@ -56,6 +57,10 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) if !hasInsertColumns && statement.dialect.URI().DBType != schemas.ORACLE && statement.dialect.URI().DBType != schemas.DAMENG { +======= + + if !hasInsertColumns && statement.dialect.URI().DBType != schemas.ORACLE { +>>>>>>> d24e7cb (Fix insert) if statement.dialect.URI().DBType == schemas.MYSQL { if _, err := buf.WriteString(" VALUES ()"); err != nil { return nil, err -- 2.40.1 From 3de08f5396824f8dfe0d50ee37397dcf1d83228d Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 2 Dec 2020 22:05:02 +0800 Subject: [PATCH 13/24] Improve oracle --- dialects/dialect.go | 4 ++- dialects/oracle.go | 44 ++++++++++++++++++--------------- integrations/processors_test.go | 10 +++++--- internal/statements/insert.go | 27 ++++++++++---------- 4 files changed, 48 insertions(+), 37 deletions(-) diff --git a/dialects/dialect.go b/dialects/dialect.go index c6ce3653..98ad73ae 100644 --- a/dialects/dialect.go +++ b/dialects/dialect.go @@ -43,8 +43,10 @@ const ( SequenceAutoincrMode ) +// DialectFeatures represents the features that the dialect supports type DialectFeatures struct { - AutoincrMode int // 0 autoincrement column, 1 sequence + AutoincrMode int // 0 autoincrement column, 1 sequence + SupportReturnIDWhenInsert bool } // Dialect represents a kind of database diff --git a/dialects/oracle.go b/dialects/oracle.go index 4f3975d0..4965eab6 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -542,7 +542,8 @@ func (db *oracle) Version(ctx context.Context, queryer core.Queryer) (*schemas.V func (db *oracle) Features() *DialectFeatures { return &DialectFeatures{ - AutoincrMode: SequenceAutoincrMode, + AutoincrMode: SequenceAutoincrMode, + SupportReturnIDWhenInsert: false, } } @@ -553,8 +554,9 @@ func (db *oracle) SQLType(c *schemas.Column) string { res = "NUMBER" case schemas.Binary, schemas.VarBinary, schemas.Blob, schemas.TinyBlob, schemas.MediumBlob, schemas.LongBlob, schemas.Bytea: return schemas.Blob - case schemas.Time, schemas.DateTime, schemas.TimeStamp: + case schemas.Date, schemas.Time, schemas.DateTime, schemas.TimeStamp: res = schemas.Date + return res case schemas.TimeStampz: res = "TIMESTAMP" case schemas.Float, schemas.Double, schemas.Numeric, schemas.Decimal: @@ -607,42 +609,44 @@ func (db *oracle) DropTableSQL(tableName, autoincrCol string) ([]string, bool) { fmt.Sprintf("DROP TABLE %s", db.quoter.Quote(tableName)), } if autoincrCol != "" { - sqls = append(sqls, fmt.Sprintf("DROP SEQUENCE %s", seqName(tableName))) + sqls = append(sqls, fmt.Sprintf("DROP SEQUENCE %s", OracleSeqName(tableName))) } return sqls, false } func (db *oracle) CreateTableSQL(ctx context.Context, queryer core.Queryer, table *schemas.Table, tableName string) (string, bool, error) { - var sql = "CREATE TABLE " if tableName == "" { tableName = table.Name } quoter := db.Quoter() - sql += quoter.Quote(tableName) + " (" + var b strings.Builder + b.WriteString("CREATE TABLE ") + quoter.QuoteTo(&b, tableName) + b.WriteString(" (") pkList := table.PrimaryKeys - for _, colName := range table.ColumnsSeq() { + for i, colName := range table.ColumnsSeq() { col := table.GetColumn(colName) - /*if col.IsPrimaryKey && len(pkList) == 1 { - sql += col.String(b.dialect) - } else {*/ s, _ := ColumnString(db, col, false) - sql += s - // } - sql = strings.TrimSpace(sql) - sql += ", " + b.WriteString(s) + if i != len(table.ColumnsSeq())-1 { + b.WriteString(", ") + } } if len(pkList) > 0 { - sql += "PRIMARY KEY ( " - sql += quoter.Join(pkList, ",") - sql += " ), " + if len(table.ColumnsSeq()) > 0 { + b.WriteString(", ") + } + b.WriteString("PRIMARY KEY (") + quoter.JoinWrite(&b, pkList, ",") + b.WriteString(")") } + b.WriteString(")") - sql = sql[:len(sql)-2] + ")" - return sql, false, nil + return b.String(), false, nil } func (db *oracle) SetQuotePolicy(quotePolicy QuotePolicy) { @@ -679,7 +683,7 @@ func (db *oracle) IsColumnExist(queryer core.Queryer, ctx context.Context, table return db.HasRecords(queryer, ctx, query, args...) } -func seqName(tableName string) string { +func OracleSeqName(tableName string) string { return "SEQ_" + strings.ToUpper(tableName) } @@ -746,7 +750,7 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam if pkName != "" && pkName == col.Name { col.IsPrimaryKey = true - has, err := db.HasRecords(queryer, ctx, "SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = :1", seqName(tableName)) + has, err := db.HasRecords(queryer, ctx, "SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = :1", OracleSeqName(tableName)) if err != nil { return nil, nil, err } diff --git a/integrations/processors_test.go b/integrations/processors_test.go index b32f6fbb..33c71edc 100644 --- a/integrations/processors_test.go +++ b/integrations/processors_test.go @@ -10,6 +10,7 @@ import ( "testing" "xorm.io/xorm" + "xorm.io/xorm/dialects" "github.com/stretchr/testify/assert" ) @@ -885,11 +886,12 @@ func TestAfterLoadProcessor(t *testing.T) { } type AfterInsertStruct struct { - Id int64 + Id int64 + Dialect dialects.Dialect `xorm:"-"` } func (a *AfterInsertStruct) AfterInsert() { - if a.Id == 0 { + if a.Dialect.Features().SupportReturnIDWhenInsert && a.Id == 0 { panic("a.Id") } } @@ -899,6 +901,8 @@ func TestAfterInsert(t *testing.T) { assertSync(t, new(AfterInsertStruct)) - _, err := testEngine.Insert(&AfterInsertStruct{}) + _, err := testEngine.Insert(&AfterInsertStruct{ + Dialect: testEngine.Dialect(), + }) assert.NoError(t, err) } diff --git a/internal/statements/insert.go b/internal/statements/insert.go index d773f64b..127a4449 100644 --- a/internal/statements/insert.go +++ b/internal/statements/insert.go @@ -44,7 +44,6 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) } var hasInsertColumns = len(colNames) > 0 -<<<<<<< HEAD var needSeq = len(table.AutoIncrement) > 0 && (statement.dialect.URI().DBType == schemas.ORACLE || statement.dialect.URI().DBType == schemas.DAMENG) if needSeq { for _, col := range colNames { @@ -57,10 +56,6 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) if !hasInsertColumns && statement.dialect.URI().DBType != schemas.ORACLE && statement.dialect.URI().DBType != schemas.DAMENG { -======= - - if !hasInsertColumns && statement.dialect.URI().DBType != schemas.ORACLE { ->>>>>>> d24e7cb (Fix insert) if statement.dialect.URI().DBType == schemas.MYSQL { if _, err := buf.WriteString(" VALUES ()"); err != nil { return nil, err @@ -173,14 +168,20 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) } } - if len(table.AutoIncrement) > 0 && (statement.dialect.URI().DBType == schemas.POSTGRES || - statement.dialect.URI().DBType == schemas.ORACLE) { - if _, err := buf.WriteString(" RETURNING "); err != nil { - return nil, err - } - if err := statement.dialect.Quoter().QuoteTo(buf.Builder, table.AutoIncrement); err != nil { - return nil, err - } + if len(table.AutoIncrement) > 0 { + if statement.dialect.URI().DBType == schemas.POSTGRES { + if _, err := buf.WriteString(" RETURNING "); err != nil { + return nil, err + } + if err := statement.dialect.Quoter().QuoteTo(buf.Builder, table.AutoIncrement); err != nil { + return nil, err + } + } /* else if statement.dialect.URI().DBType == schemas.ORACLE { + if _, err := buf.WriteString(fmt.Sprintf("; select %s.currval from dual", + dialects.OracleSeqName(tableName))); err != nil { + return nil, err + } + }*/ } return buf, nil -- 2.40.1 From ca0227838d057d4cbf8404094a4ed0efb0974715 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 12 Jun 2021 21:11:28 +0800 Subject: [PATCH 14/24] Merge --- internal/statements/insert.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/statements/insert.go b/internal/statements/insert.go index 127a4449..21164ce1 100644 --- a/internal/statements/insert.go +++ b/internal/statements/insert.go @@ -78,7 +78,7 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) } if err := statement.dialect.Quoter().JoinWrite(buf.Builder, append(colNames, exprs.ColNames()...), ","); err != nil { - return "", nil, err + return nil, err } if _, err := buf.WriteString(")"); err != nil { -- 2.40.1 From c53c61a6a10e1aea5b7fbe0e3aa8ced488fa2564 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 21 Jul 2021 12:59:50 +0800 Subject: [PATCH 15/24] pass build --- integrations/processors_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/processors_test.go b/integrations/processors_test.go index 33c71edc..34c3aa59 100644 --- a/integrations/processors_test.go +++ b/integrations/processors_test.go @@ -891,7 +891,7 @@ type AfterInsertStruct struct { } func (a *AfterInsertStruct) AfterInsert() { - if a.Dialect.Features().SupportReturnIDWhenInsert && a.Id == 0 { + if a.Id == 0 { panic("a.Id") } } -- 2.40.1 From 368935ad9820ce3b5e10cd2375fba8244bf23dde Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 21 Jul 2021 13:23:30 +0800 Subject: [PATCH 16/24] Fix test --- dialects/dialect.go | 4 ++++ dialects/oracle.go | 11 +++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/dialects/dialect.go b/dialects/dialect.go index 98ad73ae..69684b2e 100644 --- a/dialects/dialect.go +++ b/dialects/dialect.go @@ -334,7 +334,11 @@ func ColumnString(dialect Dialect, col *schemas.Column, includePrimaryKey bool) } if !col.DefaultIsEmpty { +<<<<<<< HEAD if _, err := bd.WriteString(" DEFAULT "); err != nil { +======= + if _, err := bd.WriteString("DEFAULT "); err != nil { +>>>>>>> ab9b694 (Fix test) return "", err } if col.Default == "" { diff --git a/dialects/oracle.go b/dialects/oracle.go index 4965eab6..d2561e0c 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -550,7 +550,10 @@ func (db *oracle) Features() *DialectFeatures { func (db *oracle) SQLType(c *schemas.Column) string { var res string switch t := c.SQLType.Name; t { - case schemas.Bit, schemas.TinyInt, schemas.SmallInt, schemas.MediumInt, schemas.Int, schemas.Integer, schemas.BigInt, schemas.Bool, schemas.Serial, schemas.BigSerial: + case schemas.Bit, schemas.TinyInt, schemas.SmallInt, schemas.MediumInt, schemas.Int, schemas.Integer, schemas.BigInt, + schemas.UnsignedBigInt, schemas.UnsignedBit, schemas.UnsignedInt, + schemas.Bool, + schemas.Serial, schemas.BigSerial: res = "NUMBER" case schemas.Binary, schemas.VarBinary, schemas.Blob, schemas.TinyBlob, schemas.MediumBlob, schemas.LongBlob, schemas.Bytea: return schemas.Blob @@ -802,7 +805,7 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam } if _, ok := schemas.SqlTypes[col.SQLType.Name]; !ok { - return nil, nil, fmt.Errorf("Unknown colType %v %v", *dataType, col.SQLType) + return nil, nil, fmt.Errorf("unknown colType %v %v", *dataType, col.SQLType) } col.Length = dataLen @@ -819,10 +822,6 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam return nil, nil, rows.Err() } - /*select * - from user_tab_comments - where Table_Name='用户表' */ - return colSeq, cols, nil } -- 2.40.1 From c7f3c3cae9819f3891c10556d333ea93f9cb8e97 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 21 Jul 2021 13:25:48 +0800 Subject: [PATCH 17/24] Update drone.yml --- .drone.yml | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/.drone.yml b/.drone.yml index 11c8040a..5afe62bd 100644 --- a/.drone.yml +++ b/.drone.yml @@ -403,6 +403,10 @@ kind: pipeline name: test-oracle depends_on: - test-cockroach +trigger: + ref: + - refs/heads/master + - refs/pull/*/head steps: - name: test-oracle pull: never @@ -418,25 +422,7 @@ steps: TEST_CACHE_ENABLE: false commands: - make test-oracle - -- name: test-oracle-schema - pull: never - image: golang:1.15 - depends_on: - - test-oracle - volumes: - - name: cache - path: /go/pkg/mod - environment: - TEST_ORACLE_SCHEMA: xorm - TEST_ORACLE_HOST: oracle:1521 - TEST_ORACLE_DBNAME: xe - TEST_ORACLE_USERNAME: system - TEST_ORACLE_PASSWORD: oracle - TEST_CACHE_ENABLE: true - SCHEMA: xorm - commands: - - make test-oracle + - TEST_ORACLE_SCHEMA=xorm make test-oracle volumes: - name: cache -- 2.40.1 From b11dd70c3c2f64d5c559a5cb08c0c123fec99235 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 22 Jul 2021 17:09:34 +0800 Subject: [PATCH 18/24] Fix time bug --- internal/statements/insert.go | 7 +------ session_insert.go | 6 +++++- session_update.go | 6 +++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/internal/statements/insert.go b/internal/statements/insert.go index 21164ce1..15978a43 100644 --- a/internal/statements/insert.go +++ b/internal/statements/insert.go @@ -176,12 +176,7 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) if err := statement.dialect.Quoter().QuoteTo(buf.Builder, table.AutoIncrement); err != nil { return nil, err } - } /* else if statement.dialect.URI().DBType == schemas.ORACLE { - if _, err := buf.WriteString(fmt.Sprintf("; select %s.currval from dual", - dialects.OracleSeqName(tableName))); err != nil { - return nil, err - } - }*/ + } } return buf, nil diff --git a/session_insert.go b/session_insert.go index 283c5d26..09c4b0f7 100644 --- a/session_insert.go +++ b/session_insert.go @@ -512,7 +512,11 @@ func (session *Session) genInsertColumns(bean interface{}) ([]string, []interfac return nil, nil, err } if session.engine.dialect.URI().DBType == schemas.ORACLE { - args = append(args, t) + if col.SQLType.IsNumeric() { + args = append(args, t.Unix()) + } else { + args = append(args, t) + } } else { args = append(args, val) } diff --git a/session_update.go b/session_update.go index 4fd45a53..365195d6 100644 --- a/session_update.go +++ b/session_update.go @@ -220,7 +220,11 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 return 0, err } if session.engine.dialect.URI().DBType == schemas.ORACLE { - args = append(args, t) + if col.SQLType.IsNumeric() { + args = append(args, t.Unix()) + } else { + args = append(args, t) + } } else { args = append(args, val) } -- 2.40.1 From ffaf88ae1a86bb3815e271c11e79f9aaec709617 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 23 Jul 2021 00:55:31 +0800 Subject: [PATCH 19/24] Fix test --- dialects/dialect.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dialects/dialect.go b/dialects/dialect.go index 69684b2e..3e3a3467 100644 --- a/dialects/dialect.go +++ b/dialects/dialect.go @@ -333,10 +333,14 @@ func ColumnString(dialect Dialect, col *schemas.Column, includePrimaryKey bool) } } +<<<<<<< HEAD if !col.DefaultIsEmpty { <<<<<<< HEAD if _, err := bd.WriteString(" DEFAULT "); err != nil { ======= +======= + if col.Default != "" { +>>>>>>> 98251fc (Fix test) if _, err := bd.WriteString("DEFAULT "); err != nil { >>>>>>> ab9b694 (Fix test) return "", err -- 2.40.1 From b5665ba1a7f0a317da6237389e637f1f9cbdfb0a Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 12 Aug 2021 09:20:43 +0800 Subject: [PATCH 20/24] Fix test --- dialects/dialect.go | 12 ++---------- dialects/mssql.go | 6 +++--- dialects/oracle.go | 18 ++++++++++-------- dialects/postgres.go | 6 ++++++ dialects/sqlite3.go | 6 ++++++ internal/statements/insert.go | 14 ++++++-------- session_insert.go | 1 - session_schema.go | 5 ++++- 8 files changed, 37 insertions(+), 31 deletions(-) diff --git a/dialects/dialect.go b/dialects/dialect.go index 3e3a3467..a336a087 100644 --- a/dialects/dialect.go +++ b/dialects/dialect.go @@ -171,9 +171,9 @@ func (db *Base) DropSequenceSQL(seqName string) (string, error) { } // DropTableSQL returns drop table SQL -func (db *Base) DropTableSQL(tableName, autoincrCol string) ([]string, bool) { +func (db *Base) DropTableSQL(tableName, autoincrCol string) (string, bool) { quote := db.dialect.Quoter().Quote - return []string{fmt.Sprintf("DROP TABLE IF EXISTS %s", quote(tableName))}, true + return fmt.Sprintf("DROP TABLE IF EXISTS %s", quote(tableName)), true } // HasRecords returns true if the SQL has records returned @@ -333,16 +333,8 @@ func ColumnString(dialect Dialect, col *schemas.Column, includePrimaryKey bool) } } -<<<<<<< HEAD if !col.DefaultIsEmpty { -<<<<<<< HEAD if _, err := bd.WriteString(" DEFAULT "); err != nil { -======= -======= - if col.Default != "" { ->>>>>>> 98251fc (Fix test) - if _, err := bd.WriteString("DEFAULT "); err != nil { ->>>>>>> ab9b694 (Fix test) return "", err } if col.Default == "" { diff --git a/dialects/mssql.go b/dialects/mssql.go index 1a8206ff..6244ce6d 100644 --- a/dialects/mssql.go +++ b/dialects/mssql.go @@ -421,10 +421,10 @@ func (db *mssql) AutoIncrStr() string { return "IDENTITY" } -func (db *mssql) DropTableSQL(tableName, autoincrCol string) ([]string, bool) { - return []string{fmt.Sprintf("IF EXISTS (SELECT * FROM sysobjects WHERE id = "+ +func (db *mssql) DropTableSQL(tableName, autoincrCol string) (string, bool) { + return fmt.Sprintf("IF EXISTS (SELECT * FROM sysobjects WHERE id = "+ "object_id(N'%s') and OBJECTPROPERTY(id, N'IsUserTable') = 1) "+ - "DROP TABLE \"%s\"", tableName, tableName)}, true + "DROP TABLE \"%s\"", tableName, tableName), true } func (db *mssql) ModifyColumnSQL(tableName string, col *schemas.Column) string { diff --git a/dialects/oracle.go b/dialects/oracle.go index d2561e0c..5137f6bd 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -598,6 +598,14 @@ func (db *oracle) ColumnTypeKind(t string) int { } } +func (db *oracle) IsSequenceExist(ctx context.Context, queryer core.Queryer, seqName string) (bool, error) { + var cnt int + if err := queryer.QueryRowContext(ctx, "SELECT COUNT(*) FROM user_sequences WHERE sequence_name = :1", seqName).Scan(&cnt); err != nil { + return false, err + } + return cnt > 0, nil +} + func (db *oracle) AutoIncrStr() string { return "AUTO_INCREMENT" } @@ -607,14 +615,8 @@ func (db *oracle) IsReserved(name string) bool { return ok } -func (db *oracle) DropTableSQL(tableName, autoincrCol string) ([]string, bool) { - var sqls = []string{ - fmt.Sprintf("DROP TABLE %s", db.quoter.Quote(tableName)), - } - if autoincrCol != "" { - sqls = append(sqls, fmt.Sprintf("DROP SEQUENCE %s", OracleSeqName(tableName))) - } - return sqls, false +func (db *oracle) DropTableSQL(tableName, autoincrCol string) (string, bool) { + return fmt.Sprintf("DROP TABLE %s", db.quoter.Quote(tableName)), false } func (db *oracle) CreateTableSQL(ctx context.Context, queryer core.Queryer, table *schemas.Table, tableName string) (string, bool, error) { diff --git a/dialects/postgres.go b/dialects/postgres.go index 822d3a70..3fe71dcc 100644 --- a/dialects/postgres.go +++ b/dialects/postgres.go @@ -876,6 +876,12 @@ func (db *postgres) SetQuotePolicy(quotePolicy QuotePolicy) { } } +func (db *postgres) Features() *DialectFeatures { + return &DialectFeatures{ + AutoincrMode: IncrAutoincrMode, + } +} + func (db *postgres) SQLType(c *schemas.Column) string { var res string switch t := c.SQLType.Name; t { diff --git a/dialects/sqlite3.go b/dialects/sqlite3.go index 4ff9a39e..731b87f1 100644 --- a/dialects/sqlite3.go +++ b/dialects/sqlite3.go @@ -207,6 +207,12 @@ func (db *sqlite3) SetQuotePolicy(quotePolicy QuotePolicy) { } } +func (db *sqlite3) Features() *DialectFeatures { + return &DialectFeatures{ + AutoincrMode: IncrAutoincrMode, + } +} + func (db *sqlite3) SQLType(c *schemas.Column) string { switch t := c.SQLType.Name; t { case schemas.Bool: diff --git a/internal/statements/insert.go b/internal/statements/insert.go index 15978a43..8583b3b8 100644 --- a/internal/statements/insert.go +++ b/internal/statements/insert.go @@ -168,14 +168,12 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) } } - if len(table.AutoIncrement) > 0 { - if statement.dialect.URI().DBType == schemas.POSTGRES { - if _, err := buf.WriteString(" RETURNING "); err != nil { - return nil, err - } - if err := statement.dialect.Quoter().QuoteTo(buf.Builder, table.AutoIncrement); err != nil { - return nil, err - } + if len(table.AutoIncrement) > 0 && statement.dialect.URI().DBType == schemas.POSTGRES { + if _, err := buf.WriteString(" RETURNING "); err != nil { + return nil, err + } + if err := statement.dialect.Quoter().QuoteTo(buf.Builder, table.AutoIncrement); err != nil { + return nil, err } } diff --git a/session_insert.go b/session_insert.go index 09c4b0f7..f6846a9d 100644 --- a/session_insert.go +++ b/session_insert.go @@ -91,7 +91,6 @@ func (session *Session) insertMultipleStruct(rowsSlicePtr interface{}) (int64, e colMultiPlaces []string args []interface{} cols []*schemas.Column - insertCnt int ) for i := 0; i < size; i++ { diff --git a/session_schema.go b/session_schema.go index bbb5d0be..ef0850cb 100644 --- a/session_schema.go +++ b/session_schema.go @@ -174,7 +174,7 @@ func (session *Session) dropTable(beanOrTableName interface{}) error { } } - sqlStrs, checkIfExist := session.engine.dialect.DropTableSQL(tableName, autoIncrementCol) + sqlStr, checkIfExist := session.engine.dialect.DropTableSQL(tableName, autoIncrementCol) if !checkIfExist { exist, err := session.engine.dialect.IsTableExist(session.getQueryer(), session.ctx, tableName) if err != nil { @@ -189,7 +189,10 @@ func (session *Session) dropTable(beanOrTableName interface{}) error { if _, err := session.exec(sqlStr); err != nil { return err } +<<<<<<< HEAD +======= +>>>>>>> 1805a60 (Fix test) if session.engine.dialect.Features().AutoincrMode == dialects.IncrAutoincrMode { return nil } -- 2.40.1 From d3348ed16592eea40aa86ed0d8e1fbb9b9e71926 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 24 Aug 2021 14:48:32 +0800 Subject: [PATCH 21/24] Fix test --- dialects/dialect.go | 2 +- dialects/mssql.go | 2 +- dialects/oracle.go | 2 +- dialects/postgres.go | 6 ------ dialects/sqlite3.go | 6 ------ internal/statements/insert.go | 10 +++++----- session_insert.go | 2 +- session_schema.go | 13 ++----------- 8 files changed, 11 insertions(+), 32 deletions(-) diff --git a/dialects/dialect.go b/dialects/dialect.go index a336a087..283da150 100644 --- a/dialects/dialect.go +++ b/dialects/dialect.go @@ -171,7 +171,7 @@ func (db *Base) DropSequenceSQL(seqName string) (string, error) { } // DropTableSQL returns drop table SQL -func (db *Base) DropTableSQL(tableName, autoincrCol string) (string, bool) { +func (db *Base) DropTableSQL(tableName string) (string, bool) { quote := db.dialect.Quoter().Quote return fmt.Sprintf("DROP TABLE IF EXISTS %s", quote(tableName)), true } diff --git a/dialects/mssql.go b/dialects/mssql.go index 6244ce6d..cd19afb9 100644 --- a/dialects/mssql.go +++ b/dialects/mssql.go @@ -421,7 +421,7 @@ func (db *mssql) AutoIncrStr() string { return "IDENTITY" } -func (db *mssql) DropTableSQL(tableName, autoincrCol string) (string, bool) { +func (db *mssql) DropTableSQL(tableName string) (string, bool) { return fmt.Sprintf("IF EXISTS (SELECT * FROM sysobjects WHERE id = "+ "object_id(N'%s') and OBJECTPROPERTY(id, N'IsUserTable') = 1) "+ "DROP TABLE \"%s\"", tableName, tableName), true diff --git a/dialects/oracle.go b/dialects/oracle.go index 5137f6bd..6c1bdc79 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -615,7 +615,7 @@ func (db *oracle) IsReserved(name string) bool { return ok } -func (db *oracle) DropTableSQL(tableName, autoincrCol string) (string, bool) { +func (db *oracle) DropTableSQL(tableName string) (string, bool) { return fmt.Sprintf("DROP TABLE %s", db.quoter.Quote(tableName)), false } diff --git a/dialects/postgres.go b/dialects/postgres.go index 3fe71dcc..e810d803 100644 --- a/dialects/postgres.go +++ b/dialects/postgres.go @@ -947,12 +947,6 @@ func (db *postgres) SQLType(c *schemas.Column) string { return res } -func (db *postgres) Features() *DialectFeatures { - return &DialectFeatures{ - AutoincrMode: IncrAutoincrMode, - } -} - func (db *postgres) ColumnTypeKind(t string) int { switch strings.ToUpper(t) { case "DATETIME", "TIMESTAMP": diff --git a/dialects/sqlite3.go b/dialects/sqlite3.go index 731b87f1..4ff9a39e 100644 --- a/dialects/sqlite3.go +++ b/dialects/sqlite3.go @@ -207,12 +207,6 @@ func (db *sqlite3) SetQuotePolicy(quotePolicy QuotePolicy) { } } -func (db *sqlite3) Features() *DialectFeatures { - return &DialectFeatures{ - AutoincrMode: IncrAutoincrMode, - } -} - func (db *sqlite3) SQLType(c *schemas.Column) string { switch t := c.SQLType.Name; t { case schemas.Bool: diff --git a/internal/statements/insert.go b/internal/statements/insert.go index 8583b3b8..43d3c69a 100644 --- a/internal/statements/insert.go +++ b/internal/statements/insert.go @@ -100,11 +100,11 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) if needSeq { if len(args) > 0 { if _, err := buf.WriteString(","); err != nil { - return "", nil, err + return nil, err } } if _, err := buf.WriteString(utils.SeqName(tableName) + ".nextval"); err != nil { - return "", nil, err + return nil, err } } if len(exprs) > 0 { @@ -112,7 +112,7 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) return nil, err } if err := exprs.WriteArgs(buf); err != nil { - return "", nil, err + return nil, err } } @@ -144,11 +144,11 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) if needSeq { if hasInsertColumns { if _, err := buf.WriteString(","); err != nil { - return "", nil, err + return nil, err } } if _, err := buf.WriteString(utils.SeqName(tableName) + ".nextval"); err != nil { - return "", nil, err + return nil, err } } diff --git a/session_insert.go b/session_insert.go index f6846a9d..5ea1dd66 100644 --- a/session_insert.go +++ b/session_insert.go @@ -284,7 +284,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) { if err != nil { return 0, err } - sqlStr = session.engine.dialect.Quoter().Replace(sqlStr) + var sqlStr = session.engine.dialect.Quoter().Replace(buf.String()) handleAfterInsertProcessorFunc := func(bean interface{}) { if session.isAutoCommit { diff --git a/session_schema.go b/session_schema.go index ef0850cb..500e2a0c 100644 --- a/session_schema.go +++ b/session_schema.go @@ -148,14 +148,11 @@ func (session *Session) DropTable(beanOrTableName interface{}) error { } func (session *Session) dropTable(beanOrTableName interface{}) error { - var tableName, autoIncrementCol string + var tableName string switch beanOrTableName.(type) { case *schemas.Table: table := beanOrTableName.(*schemas.Table) tableName = table.Name - if table.AutoIncrColumn() != nil { - autoIncrementCol = table.AutoIncrColumn().Name - } case string: tableName = beanOrTableName.(string) default: @@ -169,12 +166,9 @@ func (session *Session) dropTable(beanOrTableName interface{}) error { } else { tableName = table.Name } - if table.AutoIncrColumn() != nil { - autoIncrementCol = table.AutoIncrColumn().Name - } } - sqlStr, checkIfExist := session.engine.dialect.DropTableSQL(tableName, autoIncrementCol) + sqlStr, checkIfExist := session.engine.dialect.DropTableSQL(tableName) if !checkIfExist { exist, err := session.engine.dialect.IsTableExist(session.getQueryer(), session.ctx, tableName) if err != nil { @@ -189,10 +183,7 @@ func (session *Session) dropTable(beanOrTableName interface{}) error { if _, err := session.exec(sqlStr); err != nil { return err } -<<<<<<< HEAD -======= ->>>>>>> 1805a60 (Fix test) if session.engine.dialect.Features().AutoincrMode == dialects.IncrAutoincrMode { return nil } -- 2.40.1 From 84d1a51434a876b2a82a5cb1d789979ac18b8867 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 24 Aug 2021 15:33:48 +0800 Subject: [PATCH 22/24] Fix test --- dialects/dialect.go | 3 +-- dialects/oracle.go | 10 +++------- dialects/postgres.go | 12 ++++++------ integrations/oracle_test.go | 4 ++-- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/dialects/dialect.go b/dialects/dialect.go index 283da150..dc065d15 100644 --- a/dialects/dialect.go +++ b/dialects/dialect.go @@ -45,8 +45,7 @@ const ( // DialectFeatures represents the features that the dialect supports type DialectFeatures struct { - AutoincrMode int // 0 autoincrement column, 1 sequence - SupportReturnIDWhenInsert bool + AutoincrMode int // 0 autoincrement column, 1 sequence } // Dialect represents a kind of database diff --git a/dialects/oracle.go b/dialects/oracle.go index 6c1bdc79..ce62b51b 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -15,6 +15,7 @@ import ( "strings" "xorm.io/xorm/core" + "xorm.io/xorm/internal/utils" "xorm.io/xorm/schemas" ) @@ -542,8 +543,7 @@ func (db *oracle) Version(ctx context.Context, queryer core.Queryer) (*schemas.V func (db *oracle) Features() *DialectFeatures { return &DialectFeatures{ - AutoincrMode: SequenceAutoincrMode, - SupportReturnIDWhenInsert: false, + AutoincrMode: SequenceAutoincrMode, } } @@ -688,10 +688,6 @@ func (db *oracle) IsColumnExist(queryer core.Queryer, ctx context.Context, table return db.HasRecords(queryer, ctx, query, args...) } -func OracleSeqName(tableName string) string { - return "SEQ_" + strings.ToUpper(tableName) -} - func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableName string) ([]string, map[string]*schemas.Column, error) { //s := "SELECT column_name,data_default,data_type,data_length,data_precision,data_scale," + // "nullable FROM USER_TAB_COLUMNS WHERE table_name = :1" @@ -755,7 +751,7 @@ func (db *oracle) GetColumns(queryer core.Queryer, ctx context.Context, tableNam if pkName != "" && pkName == col.Name { col.IsPrimaryKey = true - has, err := db.HasRecords(queryer, ctx, "SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = :1", OracleSeqName(tableName)) + has, err := db.HasRecords(queryer, ctx, "SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = :1", utils.SeqName(tableName)) if err != nil { return nil, nil, err } diff --git a/dialects/postgres.go b/dialects/postgres.go index e810d803..822d3a70 100644 --- a/dialects/postgres.go +++ b/dialects/postgres.go @@ -876,12 +876,6 @@ func (db *postgres) SetQuotePolicy(quotePolicy QuotePolicy) { } } -func (db *postgres) Features() *DialectFeatures { - return &DialectFeatures{ - AutoincrMode: IncrAutoincrMode, - } -} - func (db *postgres) SQLType(c *schemas.Column) string { var res string switch t := c.SQLType.Name; t { @@ -947,6 +941,12 @@ func (db *postgres) SQLType(c *schemas.Column) string { return res } +func (db *postgres) Features() *DialectFeatures { + return &DialectFeatures{ + AutoincrMode: IncrAutoincrMode, + } +} + func (db *postgres) ColumnTypeKind(t string) int { switch strings.ToUpper(t) { case "DATETIME", "TIMESTAMP": diff --git a/integrations/oracle_test.go b/integrations/oracle_test.go index 56cd3b69..e8ace90c 100644 --- a/integrations/oracle_test.go +++ b/integrations/oracle_test.go @@ -1,8 +1,8 @@ -// Copyright 20190 The Xorm Authors. All rights reserved. +// Copyright 2021 The Xorm Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build oracle +// +build oralce package integrations -- 2.40.1 From 74195796151bdc7cb1b0752160d8f8fc75455c7a Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 24 Aug 2021 15:40:38 +0800 Subject: [PATCH 23/24] Fix test --- integrations/tests.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/tests.go b/integrations/tests.go index 9f01e9ae..8b14b0f4 100644 --- a/integrations/tests.go +++ b/integrations/tests.go @@ -162,7 +162,7 @@ func createEngine(dbType, connStr string) error { if err != nil { return err } - var tableNames []interface{} + var tableNames = make([]interface{}, 0, len(tables)) for _, table := range tables { tableNames = append(tableNames, table.Name) } -- 2.40.1 From fc3bb74d341bea53766ca8ae410a92ee6d0c2de4 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 26 Aug 2021 16:02:10 +0800 Subject: [PATCH 24/24] Fix bug --- session_insert.go | 1 + 1 file changed, 1 insertion(+) diff --git a/session_insert.go b/session_insert.go index 5ea1dd66..19bcb7c8 100644 --- a/session_insert.go +++ b/session_insert.go @@ -285,6 +285,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) { return 0, err } var sqlStr = session.engine.dialect.Quoter().Replace(buf.String()) + args = buf.Args() handleAfterInsertProcessorFunc := func(bean interface{}) { if session.isAutoCommit { -- 2.40.1