Skip to content

Commit d5e88a6

Browse files
authored
Add support for CREATE USER VALID UNTIL clause (#264)
1 parent 120ff65 commit d5e88a6

9 files changed

Lines changed: 391 additions & 194 deletions

File tree

parser/ast.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1815,6 +1815,7 @@ type CreateUser struct {
18151815
OrReplace bool
18161816
UserNames []*RoleName
18171817
Authentication *AuthenticationClause
1818+
ValidUntil *StringLiteral
18181819
Hosts []*HostClause
18191820
DefaultRole *DefaultRoleClause
18201821
DefaultDatabase *Ident
@@ -1848,6 +1849,11 @@ func (c *CreateUser) Accept(visitor ASTVisitor) error {
18481849
return err
18491850
}
18501851
}
1852+
if c.ValidUntil != nil {
1853+
if err := c.ValidUntil.Accept(visitor); err != nil {
1854+
return err
1855+
}
1856+
}
18511857
for _, host := range c.Hosts {
18521858
if err := host.Accept(visitor); err != nil {
18531859
return err

parser/format.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,11 @@ func (c *CreateUser) FormatSQL(formatter *Formatter) {
10691069
formatter.Break()
10701070
formatter.WriteExpr(c.Authentication)
10711071
}
1072+
if c.ValidUntil != nil {
1073+
formatter.Break()
1074+
formatter.WriteString("VALID UNTIL ")
1075+
formatter.WriteExpr(c.ValidUntil)
1076+
}
10721077
if len(c.Hosts) > 0 {
10731078
formatter.Break()
10741079
for i, host := range c.Hosts {

parser/keyword.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,9 @@ const (
241241
KeywordUse = "USE"
242242
KeywordUser = "USER"
243243
KeywordUsing = "USING"
244+
KeywordUntil = "UNTIL"
244245
KeywordUuid = "UUID"
246+
KeywordValid = "VALID"
245247
KeywordValues = "VALUES"
246248
KeywordView = "VIEW"
247249
KeywordVolume = "VOLUME"
@@ -498,7 +500,9 @@ var keywords = NewSet(
498500
KeywordUse,
499501
KeywordUser,
500502
KeywordUsing,
503+
KeywordUntil,
501504
KeywordUuid,
505+
KeywordValid,
502506
KeywordValues,
503507
KeywordView,
504508
KeywordVolume,

parser/parse_system.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,18 @@ func (p *Parser) parseOptionalClauses(createUser *CreateUser) error {
824824
createUser.Authentication = auth
825825
createUser.StatementEnd = auth.End()
826826

827+
case p.matchKeyword(KeywordValid):
828+
_ = p.lexer.consumeToken() // consume VALID keyword
829+
if err := p.expectKeyword(KeywordUntil); err != nil {
830+
return err
831+
}
832+
validUntil, err := p.parseString(p.Pos())
833+
if err != nil {
834+
return err
835+
}
836+
createUser.ValidUntil = validUntil
837+
createUser.StatementEnd = validUntil.End()
838+
827839
case p.matchKeyword(KeywordHost):
828840
hosts, err := p.parseHostClauses()
829841
if err != nil {

parser/testdata/ddl/create_user.sql

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ CREATE USER user9 IDENTIFIED WITH ldap SERVER 'ldap_server';
1313
CREATE USER user10 IDENTIFIED WITH kerberos;
1414
CREATE USER user11 IDENTIFIED WITH kerberos REALM 'EXAMPLE.COM';
1515

16+
-- CREATE USER with VALID UNTIL
17+
CREATE USER user33 VALID UNTIL '2026-12-12 00:00:00';
18+
CREATE USER user34 IDENTIFIED WITH plaintext_password BY 'password123' VALID UNTIL '2026-06-15';
19+
CREATE USER user35 VALID UNTIL 'infinity';
20+
1621
-- CREATE USER with host restrictions
1722
CREATE USER user12 HOST LOCAL;
1823
CREATE USER user13 HOST ANY;
@@ -44,8 +49,9 @@ CREATE USER user30 SETTINGS PROFILE 'default';
4449
CREATE USER user31 SETTINGS readonly=1, max_memory_usage=5000000;
4550

4651
-- Complex CREATE USER with multiple clauses
47-
CREATE USER user32
52+
CREATE USER user32
4853
IDENTIFIED WITH plaintext_password BY 'password'
54+
VALID UNTIL '2025-12-31'
4955
HOST NAME 'localhost'
5056
DEFAULT ROLE role1, role2
5157
DEFAULT DATABASE test_db

parser/testdata/ddl/format/beautify/create_user.sql

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ CREATE USER user9 IDENTIFIED WITH ldap SERVER 'ldap_server';
1414
CREATE USER user10 IDENTIFIED WITH kerberos;
1515
CREATE USER user11 IDENTIFIED WITH kerberos REALM 'EXAMPLE.COM';
1616

17+
-- CREATE USER with VALID UNTIL
18+
CREATE USER user33 VALID UNTIL '2026-12-12 00:00:00';
19+
CREATE USER user34 IDENTIFIED WITH plaintext_password BY 'password123' VALID UNTIL '2026-06-15';
20+
CREATE USER user35 VALID UNTIL 'infinity';
21+
1722
-- CREATE USER with host restrictions
1823
CREATE USER user12 HOST LOCAL;
1924
CREATE USER user13 HOST ANY;
@@ -45,8 +50,9 @@ CREATE USER user30 SETTINGS PROFILE 'default';
4550
CREATE USER user31 SETTINGS readonly=1, max_memory_usage=5000000;
4651

4752
-- Complex CREATE USER with multiple clauses
48-
CREATE USER user32
53+
CREATE USER user32
4954
IDENTIFIED WITH plaintext_password BY 'password'
55+
VALID UNTIL '2025-12-31'
5056
HOST NAME 'localhost'
5157
DEFAULT ROLE role1, role2
5258
DEFAULT DATABASE test_db
@@ -73,6 +79,13 @@ WITH kerberos;
7379
CREATE USER user11
7480
IDENTIFIED
7581
WITH kerberos REALM 'EXAMPLE.COM';
82+
CREATE USER user33
83+
VALID UNTIL '2026-12-12 00:00:00';
84+
CREATE USER user34
85+
IDENTIFIED WITH plaintext_password BY 'password123'
86+
VALID UNTIL '2026-06-15';
87+
CREATE USER user35
88+
VALID UNTIL 'infinity';
7689
CREATE USER user12
7790
HOST LOCAL;
7891
CREATE USER user13
@@ -120,6 +133,7 @@ SETTINGS
120133
max_memory_usage=5000000;
121134
CREATE USER user32
122135
IDENTIFIED WITH plaintext_password BY 'password'
136+
VALID UNTIL '2025-12-31'
123137
HOST NAME 'localhost'
124138
DEFAULT ROLE role1, role2
125139
DEFAULT DATABASE test_db

parser/testdata/ddl/format/create_user.sql

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ CREATE USER user9 IDENTIFIED WITH ldap SERVER 'ldap_server';
1414
CREATE USER user10 IDENTIFIED WITH kerberos;
1515
CREATE USER user11 IDENTIFIED WITH kerberos REALM 'EXAMPLE.COM';
1616

17+
-- CREATE USER with VALID UNTIL
18+
CREATE USER user33 VALID UNTIL '2026-12-12 00:00:00';
19+
CREATE USER user34 IDENTIFIED WITH plaintext_password BY 'password123' VALID UNTIL '2026-06-15';
20+
CREATE USER user35 VALID UNTIL 'infinity';
21+
1722
-- CREATE USER with host restrictions
1823
CREATE USER user12 HOST LOCAL;
1924
CREATE USER user13 HOST ANY;
@@ -45,8 +50,9 @@ CREATE USER user30 SETTINGS PROFILE 'default';
4550
CREATE USER user31 SETTINGS readonly=1, max_memory_usage=5000000;
4651

4752
-- Complex CREATE USER with multiple clauses
48-
CREATE USER user32
53+
CREATE USER user32
4954
IDENTIFIED WITH plaintext_password BY 'password'
55+
VALID UNTIL '2025-12-31'
5056
HOST NAME 'localhost'
5157
DEFAULT ROLE role1, role2
5258
DEFAULT DATABASE test_db
@@ -64,6 +70,9 @@ CREATE USER user8 IDENTIFIED WITH sha256_password BY 'hash123';
6470
CREATE USER user9 IDENTIFIED WITH ldap SERVER 'ldap_server';
6571
CREATE USER user10 IDENTIFIED WITH kerberos;
6672
CREATE USER user11 IDENTIFIED WITH kerberos REALM 'EXAMPLE.COM';
73+
CREATE USER user33 VALID UNTIL '2026-12-12 00:00:00';
74+
CREATE USER user34 IDENTIFIED WITH plaintext_password BY 'password123' VALID UNTIL '2026-06-15';
75+
CREATE USER user35 VALID UNTIL 'infinity';
6776
CREATE USER user12 HOST LOCAL;
6877
CREATE USER user13 HOST ANY;
6978
CREATE USER user14 HOST NONE;
@@ -84,4 +93,4 @@ CREATE USER user28 GRANTEES user1, user2 EXCEPT user3;
8493
CREATE USER user29 SETTINGS max_memory_usage=5000000;
8594
CREATE USER user30 SETTINGS PROFILE 'default';
8695
CREATE USER user31 SETTINGS readonly=1, max_memory_usage=5000000;
87-
CREATE USER user32 IDENTIFIED WITH plaintext_password BY 'password' HOST NAME 'localhost' DEFAULT ROLE role1, role2 DEFAULT DATABASE test_db GRANTEES user1, user2 EXCEPT user3 SETTINGS max_memory_usage=5000000, readonly=1;
96+
CREATE USER user32 IDENTIFIED WITH plaintext_password BY 'password' VALID UNTIL '2025-12-31' HOST NAME 'localhost' DEFAULT ROLE role1, role2 DEFAULT DATABASE test_db GRANTEES user1, user2 EXCEPT user3 SETTINGS max_memory_usage=5000000, readonly=1;

0 commit comments

Comments
 (0)