Skip to content

Commit 41b5f76

Browse files
Merge pull request #68 from alexhokl/mssql
Added MSSQL support
2 parents 413ed89 + d2cda9c commit 41b5f76

File tree

11 files changed

+642
-12
lines changed

11 files changed

+642
-12
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ sqls aims to provide advanced intelligence for you to edit sql in your own edito
1717
- MySQL([Go-MySQL-Driver](https://github.com/go-sql-driver/mysql))
1818
- PostgreSQL([pgx](https://github.com/jackc/pgx))
1919
- SQLite3([go-sqlite3](https://github.com/mattn/go-sqlite3))
20+
- MSSQL([go-mssqldb](https://github.com/denisenkom/go-mssqldb))
2021

2122
### Language Server Features
2223

dialect/keyword.go

+5
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ const (
385385
DatabaseDriverMySQL56 DatabaseDriver = "mysql56"
386386
DatabaseDriverPostgreSQL DatabaseDriver = "postgresql"
387387
DatabaseDriverSQLite3 DatabaseDriver = "sqlite3"
388+
DatabaseDriverMssql DatabaseDriver = "mssql"
388389
)
389390

390391
func DataBaseKeywords(driver DatabaseDriver) []string {
@@ -401,6 +402,8 @@ func DataBaseKeywords(driver DatabaseDriver) []string {
401402
return postgresql13Keywords
402403
case DatabaseDriverSQLite3:
403404
return sqliteKeywords
405+
case DatabaseDriverMssql:
406+
return mssqlKeywords
404407
default:
405408
return sqliteKeywords
406409
}
@@ -420,6 +423,8 @@ func DataBaseFunctions(driver DatabaseDriver) []string {
420423
return []string{}
421424
case DatabaseDriverSQLite3:
422425
return []string{}
426+
case DatabaseDriverMssql:
427+
return []string{}
423428
default:
424429
return []string{}
425430
}

dialect/mssql.go

+190
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
package dialect
2+
3+
// https://docs.microsoft.com/en-us/sql/t-sql/language-elements/reserved-keywords-transact-sql
4+
var mssqlKeywords = []string{
5+
"ADD",
6+
"ALL",
7+
"ALTER",
8+
"AND",
9+
"ANY",
10+
"AS",
11+
"ASC",
12+
"AUTHORIZATION",
13+
"BACKUP",
14+
"BEGIN",
15+
"BETWEEN",
16+
"BREAK",
17+
"BROWSE",
18+
"BULK",
19+
"BY",
20+
"CASCADE",
21+
"CASE",
22+
"CHECK",
23+
"CHECKPOINT",
24+
"CLOSE",
25+
"CLUSTERED",
26+
"COALESCE",
27+
"COLLATE",
28+
"COLUMN",
29+
"COMMIT",
30+
"COMPUTE",
31+
"CONSTRAINT",
32+
"CONTAINS",
33+
"CONTAINSTABLE",
34+
"CONTINUE",
35+
"CONVERT",
36+
"CREATE",
37+
"CROSS",
38+
"CURRENT",
39+
"CURRENT_DATE",
40+
"CURRENT_TIME",
41+
"CURRENT_TIMESTAMP",
42+
"CURRENT_USER",
43+
"CURSOR",
44+
"DATABASE",
45+
"DBCC",
46+
"DEALLOCATE",
47+
"DECLARE",
48+
"DEFAULT",
49+
"DELETE",
50+
"DENY",
51+
"DESC",
52+
"DISK",
53+
"DISTINCT",
54+
"DISTRIBUTED",
55+
"DOUBLE",
56+
"DROP",
57+
"DUMP",
58+
"ELSE",
59+
"END",
60+
"ERRLVL",
61+
"ESCAPE",
62+
"EXCEPT",
63+
"EXEC",
64+
"EXECUTE",
65+
"EXISTS",
66+
"EXIT",
67+
"EXTERNAL",
68+
"FETCH",
69+
"FILE",
70+
"FILLFACTOR",
71+
"FOR",
72+
"FOREIGN",
73+
"FREETEXT",
74+
"FREETEXTTABLE",
75+
"FROM",
76+
"FULL",
77+
"FUNCTION",
78+
"GOTO",
79+
"GRANT",
80+
"GROUP",
81+
"HAVING",
82+
"HOLDLOCK",
83+
"IDENTITY",
84+
"IDENTITYCOL",
85+
"IDENTITY_INSERT",
86+
"IF",
87+
"IN",
88+
"INDEX",
89+
"INNER",
90+
"INSERT",
91+
"INTERSECT",
92+
"INTO",
93+
"IS",
94+
"JOIN",
95+
"KEY",
96+
"KILL",
97+
"LEFT",
98+
"LIKE",
99+
"LINENO",
100+
"LOAD",
101+
"MERGE",
102+
"NATIONAL",
103+
"NOCHECK",
104+
"NONCLUSTERED",
105+
"NOT",
106+
"NULL",
107+
"NULLIF",
108+
"OF",
109+
"OFF",
110+
"OFFSETS",
111+
"ON",
112+
"OPEN",
113+
"OPENDATASOURCE",
114+
"OPENQUERY",
115+
"OPENROWSET",
116+
"OPENXML",
117+
"OPTION",
118+
"OR",
119+
"ORDER",
120+
"OUTER",
121+
"OVER",
122+
"PERCENT",
123+
"PIVOT",
124+
"PLAN",
125+
"PRECISION",
126+
"PRIMARY",
127+
"PRINT",
128+
"PROC",
129+
"PROCEDURE",
130+
"PUBLIC",
131+
"RAISERROR",
132+
"READ",
133+
"READTEXT",
134+
"RECONFIGURE",
135+
"REFERENCES",
136+
"REPLICATION",
137+
"RESTORE",
138+
"RESTRICT",
139+
"RETURN",
140+
"REVERT",
141+
"REVOKE",
142+
"RIGHT",
143+
"ROLLBACK",
144+
"ROWCOUNT",
145+
"ROWGUIDCOL",
146+
"RULE",
147+
"SAVE",
148+
"SCHEMA",
149+
"SECURITYAUDIT",
150+
"SELECT",
151+
"SEMANTICKEYPHRASETABLE",
152+
"SEMANTICSIMILARITYDETAILSTABLE",
153+
"SEMANTICSIMILARITYTABLE",
154+
"SESSION_USER",
155+
"SET",
156+
"SETUSER",
157+
"SHUTDOWN",
158+
"SOME",
159+
"STATISTICS",
160+
"SYSTEM_USER",
161+
"TABLE",
162+
"TABLESAMPLE",
163+
"TEXTSIZE",
164+
"THEN",
165+
"TO",
166+
"TOP",
167+
"TRAN",
168+
"TRANSACTION",
169+
"TRIGGER",
170+
"TRUNCATE",
171+
"TRY_CONVERT",
172+
"TSEQUAL",
173+
"UNION",
174+
"UNIQUE",
175+
"UNPIVOT",
176+
"UPDATE",
177+
"UPDATETEXT",
178+
"USE",
179+
"USER",
180+
"VALUES",
181+
"VARYING",
182+
"VIEW",
183+
"WAITFOR",
184+
"WHEN",
185+
"WHERE",
186+
"WHILE",
187+
"WITH",
188+
"WITHIN GROUP",
189+
"WRITETEXT",
190+
}

docker-compose.yml

+11-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ services:
4545
postgres12:
4646
image: postgres:12-alpine
4747
container_name: sqls_postgres12
48-
ports:
48+
ports:
4949
- "15432:5432"
5050
environment:
5151
- POSTGRES_USER=postgres
@@ -55,3 +55,13 @@ services:
5555
- DATABASE_HOST=localhost
5656
volumes:
5757
- ./.docker/postgres/data:/var/lib/postgresql/data
58+
mssql2019:
59+
image: mcr.microsoft.com/mssql/server:2019-latest
60+
container_name: sqls_mssql2019
61+
ports:
62+
- "11433:1433"
63+
environment:
64+
SA_PASSWORD: Passw0rd
65+
ACCEPT_EULA: Y
66+
volumes:
67+
- ./.docker/mssql/data:/var/opt/mssql/data

go.mod

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@ module github.com/lighttiger2505/sqls
33
go 1.16
44

55
require (
6+
github.com/denisenkom/go-mssqldb v0.11.0
67
github.com/go-sql-driver/mysql v1.6.0
78
github.com/google/go-cmp v0.5.6
9+
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
10+
github.com/jackc/pgx v3.6.2+incompatible
811
github.com/jackc/pgx/v4 v4.12.0
912
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect
1013
github.com/k0kubun/pp v2.4.0+incompatible
1114
github.com/mattn/go-sqlite3 v1.14.8
1215
github.com/olekukonko/tablewriter v0.0.5
1316
github.com/sourcegraph/jsonrpc2 v0.1.0
14-
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
17+
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519
1518
gopkg.in/yaml.v2 v2.4.0
1619
)

go.sum

+11-2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do
4545
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4646
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4747
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
48+
github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI=
49+
github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
4850
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
4951
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
5052
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
@@ -76,6 +78,8 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG
7678
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
7779
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
7880
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
81+
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
82+
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
7983
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
8084
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
8185
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -133,6 +137,8 @@ github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9
133137
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
134138
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
135139
github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
140+
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
141+
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
136142
github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
137143
github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
138144
github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
@@ -172,6 +178,8 @@ github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/V
172178
github.com/jackc/pgtype v1.7.0/go.mod h1:ZnHF+rMePVqDKaOfJVI4Q8IVvAQMryDlDkZnKOI75BE=
173179
github.com/jackc/pgtype v1.8.0 h1:iFVCcVhYlw0PulYCVoguRGm0SE9guIcPcccnLzHj8bA=
174180
github.com/jackc/pgtype v1.8.0/go.mod h1:PqDKcEBtllAtk/2p6z6SHdXW5UB+MhE75tUol2OKexE=
181+
github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o=
182+
github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
175183
github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
176184
github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
177185
github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
@@ -365,6 +373,7 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
365373
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
366374
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
367375
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
376+
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
368377
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
369378
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
370379
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -376,8 +385,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
376385
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
377386
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
378387
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
379-
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
380-
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
388+
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
389+
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
381390
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
382391
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
383392
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=

internal/completer/completer_test.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,10 @@ func TestComplete(t *testing.T) {
122122
text: "sel",
123123
expected: []lsp.CompletionItem{
124124
{
125-
Label: "SELECT",
126-
Kind: lsp.KeywordCompletion,
127-
Detail: "keyword",
125+
Label: "SELECT",
126+
Kind: lsp.KeywordCompletion,
127+
Detail: "keyword",
128+
SortText: "9SELECT",
128129
},
129130
},
130131
},
@@ -134,9 +135,10 @@ func TestComplete(t *testing.T) {
134135
lowerCase: true,
135136
expected: []lsp.CompletionItem{
136137
{
137-
Label: "select",
138-
Kind: lsp.KeywordCompletion,
139-
Detail: "keyword",
138+
Label: "select",
139+
Kind: lsp.KeywordCompletion,
140+
Detail: "keyword",
141+
SortText: "9select",
140142
},
141143
},
142144
},

internal/database/config.go

+18
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,24 @@ func (c *DBConfig) Validate() error {
7272
if c.DataSourceName == "" {
7373
return errors.New("required: connections[].dataSourceName")
7474
}
75+
case dialect.DatabaseDriverMssql:
76+
if c.DataSourceName == "" && c.Proto == "" {
77+
return errors.New("required: connections[].dataSourceName or connections[].proto")
78+
}
79+
if c.DataSourceName == "" && c.Proto != "" {
80+
if c.User == "" {
81+
return errors.New("required: connections[].user")
82+
}
83+
switch c.Proto {
84+
case ProtoTCP:
85+
if c.Host == "" {
86+
return errors.New("required: connections[].host")
87+
}
88+
case ProtoUDP, ProtoUnix:
89+
default:
90+
return errors.New("invalid: connections[].proto")
91+
}
92+
}
7593
default:
7694
return errors.New("invalid: connections[].driver")
7795
}

0 commit comments

Comments
 (0)