Support use nvarchar for all varchar columns when using mssql (#12269)
* Support use nvarchar for all varchar columns when using mssql * fix lint * Change DEFAULT_VARCHAR to nvarchar * Remove the config for default varchar since it's unnecessary
This commit is contained in:
		
					parent
					
						
							
								ed8e064f5e
							
						
					
				
			
			
				commit
				
					
						45631083a4
					
				
			
		
					 11 changed files with 68 additions and 8 deletions
				
			
		
							
								
								
									
										2
									
								
								go.mod
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -120,5 +120,5 @@ require (
 | 
			
		|||
	mvdan.cc/xurls/v2 v2.1.0
 | 
			
		||||
	strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251
 | 
			
		||||
	xorm.io/builder v0.3.7
 | 
			
		||||
	xorm.io/xorm v1.0.3
 | 
			
		||||
	xorm.io/xorm v1.0.4-0.20200718080127-318102c9ff87
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								go.sum
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -979,5 +979,5 @@ xorm.io/core v0.7.2 h1:mEO22A2Z7a3fPaZMk6gKL/jMD80iiyNwRrX5HOv3XLw=
 | 
			
		|||
xorm.io/core v0.7.2/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM=
 | 
			
		||||
xorm.io/xorm v0.8.0 h1:iALxgJrX8O00f8Jk22GbZwPmxJNgssV5Mv4uc2HL9PM=
 | 
			
		||||
xorm.io/xorm v0.8.0/go.mod h1:ZkJLEYLoVyg7amJK/5r779bHyzs2AU8f8VMiP6BM7uY=
 | 
			
		||||
xorm.io/xorm v1.0.3 h1:3dALAohvINu2mfEix5a5x5ZmSVGSljinoSGgvGbaZp0=
 | 
			
		||||
xorm.io/xorm v1.0.3/go.mod h1:uF9EtbhODq5kNWxMbnBEj8hRRZnlcNSz2t2N7HW/+A4=
 | 
			
		||||
xorm.io/xorm v1.0.4-0.20200718080127-318102c9ff87 h1:vgc2F0wjD0cyrNrSKiIdWu123wuKkPQI84DZUKvJ6ns=
 | 
			
		||||
xorm.io/xorm v1.0.4-0.20200718080127-318102c9ff87/go.mod h1:uF9EtbhODq5kNWxMbnBEj8hRRZnlcNSz2t2N7HW/+A4=
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -145,6 +145,8 @@ func getEngine() (*xorm.Engine, error) {
 | 
			
		|||
	}
 | 
			
		||||
	if setting.Database.Type == "mysql" {
 | 
			
		||||
		engine.Dialect().SetParams(map[string]string{"rowFormat": "DYNAMIC"})
 | 
			
		||||
	} else if setting.Database.Type == "mssql" {
 | 
			
		||||
		engine.Dialect().SetParams(map[string]string{"DEFAULT_VARCHAR": "nvarchar"})
 | 
			
		||||
	}
 | 
			
		||||
	engine.SetSchema(setting.Database.Schema)
 | 
			
		||||
	return engine, nil
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								vendor/modules.txt
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/modules.txt
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -916,7 +916,7 @@ strk.kbt.io/projects/go/libravatar
 | 
			
		|||
# xorm.io/builder v0.3.7
 | 
			
		||||
## explicit
 | 
			
		||||
xorm.io/builder
 | 
			
		||||
# xorm.io/xorm v1.0.3
 | 
			
		||||
# xorm.io/xorm v1.0.4-0.20200718080127-318102c9ff87
 | 
			
		||||
## explicit
 | 
			
		||||
xorm.io/xorm
 | 
			
		||||
xorm.io/xorm/caches
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								vendor/xorm.io/xorm/.drone.yml
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/xorm.io/xorm/.drone.yml
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -164,6 +164,7 @@ steps:
 | 
			
		|||
  - make test-mssql
 | 
			
		||||
  - TEST_CACHE_ENABLE=true make test-mssql
 | 
			
		||||
  - TEST_QUOTE_POLICY=reserved make test-mssql
 | 
			
		||||
  - TEST_MSSQL_DEFAULT_VARCHAR=NVARCHAR TEST_MSSQL_DEFAULT_CHAR=NCHAR make test-mssql
 | 
			
		||||
  when:
 | 
			
		||||
    event:
 | 
			
		||||
    - push
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								vendor/xorm.io/xorm/Makefile
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/xorm.io/xorm/Makefile
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -20,6 +20,8 @@ TEST_MSSQL_HOST ?= mssql:1433
 | 
			
		|||
TEST_MSSQL_DBNAME ?= gitea
 | 
			
		||||
TEST_MSSQL_USERNAME ?= sa
 | 
			
		||||
TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1
 | 
			
		||||
TEST_MSSQL_DEFAULT_VARCHAR ?= varchar
 | 
			
		||||
TEST_MSSQL_DEFAULT_CHAR ?= char
 | 
			
		||||
 | 
			
		||||
TEST_MYSQL_HOST ?= mysql:3306
 | 
			
		||||
TEST_MYSQL_CHARSET ?= utf8
 | 
			
		||||
| 
						 | 
				
			
			@ -144,12 +146,14 @@ test-cockroach\#%: go-check
 | 
			
		|||
test-mssql: go-check
 | 
			
		||||
	$(GO) test $(INTEGRATION_PACKAGES) -v -race -db=mssql -cache=$(TEST_CACHE_ENABLE) -quote=$(TEST_QUOTE_POLICY) \
 | 
			
		||||
	-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) \
 | 
			
		||||
	-coverprofile=mssql.$(TEST_QUOTE_POLICY).$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic
 | 
			
		||||
 | 
			
		||||
.PNONY: test-mssql\#%
 | 
			
		||||
test-mssql\#%: go-check
 | 
			
		||||
	$(GO) test $(INTEGRATION_PACKAGES) -v -race -run $* -db=mssql -cache=$(TEST_CACHE_ENABLE) -quote=$(TEST_QUOTE_POLICY) \
 | 
			
		||||
	-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) \
 | 
			
		||||
	-coverprofile=mssql.$(TEST_QUOTE_POLICY).$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic
 | 
			
		||||
 | 
			
		||||
.PNONY: test-mymysql
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										34
									
								
								vendor/xorm.io/xorm/dialects/mssql.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								vendor/xorm.io/xorm/dialects/mssql.go
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -214,6 +214,8 @@ var (
 | 
			
		|||
 | 
			
		||||
type mssql struct {
 | 
			
		||||
	Base
 | 
			
		||||
	defaultVarchar string
 | 
			
		||||
	defaultChar    string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (db *mssql) Init(uri *URI) error {
 | 
			
		||||
| 
						 | 
				
			
			@ -221,6 +223,34 @@ func (db *mssql) Init(uri *URI) error {
 | 
			
		|||
	return db.Base.Init(db, uri)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (db *mssql) SetParams(params map[string]string) {
 | 
			
		||||
	defaultVarchar, ok := params["DEFAULT_VARCHAR"]
 | 
			
		||||
	if ok {
 | 
			
		||||
		var t = strings.ToUpper(defaultVarchar)
 | 
			
		||||
		switch t {
 | 
			
		||||
		case "NVARCHAR", "VARCHAR":
 | 
			
		||||
			db.defaultVarchar = defaultVarchar
 | 
			
		||||
		default:
 | 
			
		||||
			db.defaultVarchar = "VARCHAR"
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		db.defaultVarchar = "VARCHAR"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defaultChar, ok := params["DEFAULT_CHAR"]
 | 
			
		||||
	if ok {
 | 
			
		||||
		var t = strings.ToUpper(defaultChar)
 | 
			
		||||
		switch t {
 | 
			
		||||
		case "NCHAR", "CHAR":
 | 
			
		||||
			db.defaultChar = defaultChar
 | 
			
		||||
		default:
 | 
			
		||||
			db.defaultChar = "CHAR"
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		db.defaultChar = "CHAR"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (db *mssql) SQLType(c *schemas.Column) string {
 | 
			
		||||
	var res string
 | 
			
		||||
	switch t := c.SQLType.Name; t {
 | 
			
		||||
| 
						 | 
				
			
			@ -267,6 +297,10 @@ func (db *mssql) SQLType(c *schemas.Column) string {
 | 
			
		|||
	case schemas.BigInt:
 | 
			
		||||
		res = schemas.BigInt
 | 
			
		||||
		c.Length = 0
 | 
			
		||||
	case schemas.Varchar:
 | 
			
		||||
		res = db.defaultVarchar
 | 
			
		||||
	case schemas.Char:
 | 
			
		||||
		res = db.defaultChar
 | 
			
		||||
	default:
 | 
			
		||||
		res = t
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										13
									
								
								vendor/xorm.io/xorm/go.sum
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/xorm.io/xorm/go.sum
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,5 +1,7 @@
 | 
			
		|||
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
 | 
			
		||||
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
 | 
			
		||||
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
 | 
			
		||||
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzqk8QCaRC4os14xoKDdbHqqlJtJA0oc1ZAjg=
 | 
			
		||||
| 
						 | 
				
			
			@ -18,8 +20,8 @@ github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 | 
			
		|||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
			
		||||
github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY=
 | 
			
		||||
github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 | 
			
		||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
 | 
			
		||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
			
		||||
github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA=
 | 
			
		||||
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
 | 
			
		||||
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=
 | 
			
		||||
| 
						 | 
				
			
			@ -36,16 +38,23 @@ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFd
 | 
			
		|||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
 | 
			
		||||
github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
 | 
			
		||||
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
 | 
			
		||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
 | 
			
		||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
 | 
			
		||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								vendor/xorm.io/xorm/interface.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/xorm.io/xorm/interface.go
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -120,6 +120,7 @@ type EngineInterface interface {
 | 
			
		|||
	TableInfo(bean interface{}) (*schemas.Table, error)
 | 
			
		||||
	TableName(interface{}, ...bool) string
 | 
			
		||||
	UnMapType(reflect.Type)
 | 
			
		||||
	EnableSessionID(bool)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								vendor/xorm.io/xorm/log/logger_context.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/xorm.io/xorm/log/logger_context.go
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -42,6 +42,7 @@ var (
 | 
			
		|||
// enumerate all the context keys
 | 
			
		||||
var (
 | 
			
		||||
	SessionIDKey      = "__xorm_session_id"
 | 
			
		||||
	SessionKey        = "__xorm_session_key"
 | 
			
		||||
	SessionShowSQLKey = "__xorm_show_sql"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								vendor/xorm.io/xorm/session.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/xorm.io/xorm/session.go
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -107,7 +107,7 @@ func newSession(engine *Engine) *Session {
 | 
			
		|||
		ctx = engine.defaultContext
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &Session{
 | 
			
		||||
	session := &Session{
 | 
			
		||||
		ctx:    ctx,
 | 
			
		||||
		engine: engine,
 | 
			
		||||
		tx:     nil,
 | 
			
		||||
| 
						 | 
				
			
			@ -136,6 +136,10 @@ func newSession(engine *Engine) *Session {
 | 
			
		|||
 | 
			
		||||
		sessionType: engineSession,
 | 
			
		||||
	}
 | 
			
		||||
	if engine.logSessionID {
 | 
			
		||||
		session.ctx = context.WithValue(session.ctx, log.SessionKey, session)
 | 
			
		||||
	}
 | 
			
		||||
	return session
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Close release the connection from pool
 | 
			
		||||
| 
						 | 
				
			
			@ -165,6 +169,10 @@ func (session *Session) db() *core.DB {
 | 
			
		|||
	return session.engine.db
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (session *Session) Engine() *Engine {
 | 
			
		||||
	return session.engine
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (session *Session) getQueryer() core.Queryer {
 | 
			
		||||
	if session.tx != nil {
 | 
			
		||||
		return session.tx
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue