Skip to content

Commit 480c4e8

Browse files
authored
Implement inline PRIMARY KEY (#248)
* Implement column inline PRIMARY KEY * Update testdata
1 parent 9ed6971 commit 480c4e8

File tree

53 files changed

+291
-118
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+291
-118
lines changed

ast/ast.go

+11-7
Original file line numberDiff line numberDiff line change
@@ -2350,7 +2350,7 @@ type DropProtoBundle struct {
23502350
// {{.TableConstraints | sqlJoin ","}}{{if and .TableConstraints .Synonym}},{{end}}
23512351
// {{.Synonym | sqlJoin ","}}
23522352
// )
2353-
// PRIMARY KEY ({{.PrimaryKeys | sqlJoin ","}})
2353+
// {{if .PrimaryKeys}}PRIMARY KEY ({{.PrimaryKeys | sqlJoin ","}}){{end}}
23542354
// {{.Cluster | sqlOpt}}
23552355
// {{.CreateRowDeletionPolicy | sqlOpt}}
23562356
//
@@ -2368,7 +2368,7 @@ type CreateTable struct {
23682368
Name *Path
23692369
Columns []*ColumnDef
23702370
TableConstraints []*TableConstraint
2371-
PrimaryKeys []*IndexKey
2371+
PrimaryKeys []*IndexKey // when omitted, len(PrimaryKeys) = 0
23722372
Synonyms []*Synonym
23732373
Cluster *Cluster // optional
23742374
RowDeletionPolicy *CreateRowDeletionPolicy // optional
@@ -2438,22 +2438,26 @@ type BitReversedPositive struct {
24382438
BitReversedPositive token.Pos // position of "BIT_REVERSED_POSITIVE" keyword
24392439
}
24402440

2441-
// ColumnDef is column definition in CREATE TABLE.
2441+
// ColumnDef is column definition in CREATE TABLE and ALTER TABLE ADD COLUMN.
2442+
// Note: Some fields are not valid in ADD COLUMN.
24422443
//
24432444
// {{.Name | sql}}
24442445
// {{.Type | sql}} {{if .NotNull}}NOT NULL{{end}}
24452446
// {{.DefaultSemantics | sqlOpt}}
24462447
// {{if .Hidden.Invalid | not)}}HIDDEN{{end}}
2448+
// {{if .PrimaryKey}}PRIMARY KEY{{end}}
24472449
// {{.Options | sqlOpt}}
24482450
type ColumnDef struct {
24492451
// pos = Name.pos
2450-
// end = Options.end || Hidden + 6 || DefaultSemantics.end || Null + 4 || Type.end
2452+
// end = Options.end || Key + 3 || Hidden + 6 || DefaultSemantics.end || Null + 4 || Type.end
24512453

24522454
Null token.Pos // position of "NULL"
2455+
Key token.Pos // position of "KEY" of PRIMARY KEY
24532456

2454-
Name *Ident
2455-
Type SchemaType
2456-
NotNull bool
2457+
Name *Ident
2458+
Type SchemaType
2459+
NotNull bool
2460+
PrimaryKey bool
24572461

24582462
DefaultSemantics ColumnDefaultSemantics // optional
24592463

ast/pos.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ast/sql.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,8 @@ func (c *CreateTable) SQL() string {
789789
indent + sqlJoin(c.Columns, ",\n"+indent) + strOpt(len(c.Columns) > 0 && (len(c.TableConstraints) > 0 || len(c.Synonyms) > 0), ",\n") +
790790
strOpt(len(c.TableConstraints) > 0, indent) + sqlJoin(c.TableConstraints, ",\n"+indent) + strOpt(len(c.TableConstraints) > 0 && len(c.Synonyms) > 0, ",\n") +
791791
strOpt(len(c.Synonyms) > 0, indent) + sqlJoin(c.Synonyms, ",\n") +
792-
"\n) PRIMARY KEY (" + sqlJoin(c.PrimaryKeys, ", ") + ")" +
792+
"\n)" +
793+
strOpt(len(c.PrimaryKeys) > 0, " PRIMARY KEY ("+sqlJoin(c.PrimaryKeys, ", ")+")") +
793794
sqlOpt("", c.Cluster, "") +
794795
sqlOpt("", c.RowDeletionPolicy, "")
795796
}
@@ -836,6 +837,7 @@ func (c *ColumnDef) SQL() string {
836837
strOpt(c.NotNull, " NOT NULL") +
837838
sqlOpt(" ", c.DefaultSemantics, "") +
838839
strOpt(!c.Hidden.Invalid(), " HIDDEN") +
840+
strOpt(c.PrimaryKey, " PRIMARY KEY") +
839841
sqlOpt(" ", c.Options, "")
840842
}
841843

parser.go

+25-13
Original file line numberDiff line numberDiff line change
@@ -3072,22 +3072,26 @@ func (p *Parser) parseCreateTable(pos token.Pos) *ast.CreateTable {
30723072
}
30733073
p.expect(")")
30743074

3075-
p.expectKeywordLike("PRIMARY")
3076-
p.expectKeywordLike("KEY")
3077-
3078-
p.expect("(")
3075+
// PRIMARY KEY clause is now optional
30793076
var keys []*ast.IndexKey
3080-
for p.Token.Kind != token.TokenEOF {
3081-
if p.Token.Kind == ")" {
3082-
break
3083-
}
3084-
keys = append(keys, p.parseIndexKey())
3085-
if p.Token.Kind != "," {
3086-
break
3087-
}
3077+
rparen := token.InvalidPos
3078+
if p.Token.IsKeywordLike("PRIMARY") {
30883079
p.nextToken()
3080+
p.expectKeywordLike("KEY")
3081+
3082+
p.expect("(")
3083+
for p.Token.Kind != token.TokenEOF {
3084+
if p.Token.Kind == ")" {
3085+
break
3086+
}
3087+
keys = append(keys, p.parseIndexKey())
3088+
if p.Token.Kind != "," {
3089+
break
3090+
}
3091+
p.nextToken()
3092+
}
3093+
rparen = p.expect(")").Pos
30893094
}
3090-
rparen := p.expect(")").Pos
30913095

30923096
cluster := p.tryParseCluster()
30933097
rdp := p.tryParseCreateRowDeletionPolicy()
@@ -3223,13 +3227,21 @@ func (p *Parser) parseColumnDef() *ast.ColumnDef {
32233227
hiddenPos = p.expectKeywordLike("HIDDEN").Pos
32243228
}
32253229

3230+
key := token.InvalidPos
3231+
if p.Token.IsKeywordLike("PRIMARY") {
3232+
p.nextToken()
3233+
key = p.expectKeywordLike("KEY").Pos
3234+
}
3235+
32263236
options := p.tryParseOptions()
32273237

32283238
return &ast.ColumnDef{
32293239
Null: null,
3240+
Key: key,
32303241
Name: name,
32313242
Type: t,
32323243
NotNull: notNull,
3244+
PrimaryKey: !key.Invalid(),
32333245
DefaultSemantics: defaultSemantics,
32343246
Hidden: hiddenPos,
32353247
Options: options,
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
create table foo (
22
id int64 generated by default as identity (
3-
bit_reversed_positive start counter with 1000 skip range 1, 12345),
3+
bit_reversed_positive start counter with 1000 skip range 1, 12345)
4+
primary key,
45
startCount int64 generated by default as identity (
56
bit_reversed_positive start counter with 1000),
67
skipRange int64 generated by default as identity (
78
bit_reversed_positive skip range 1000, 2000),
89
simple int64 generated by default as identity ( bit_reversed_positive),
9-
) primary key (id)
10+
)

testdata/result/ddl/!bad_alter_table_add_column.sql.txt

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ syntax error: testdata/input/ddl/!bad_alter_table_add_column.sql:1:44: expected
2121
Add: 16,
2222
Column: &ast.ColumnDef{
2323
Null: -1,
24+
Key: -1,
2425
Name: &ast.Ident{
2526
NamePos: 27,
2627
NameEnd: 30,

testdata/result/ddl/alter_table_add_column.sql.txt

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ alter table foo add column baz string(max) not null
1515
Add: 16,
1616
Column: &ast.ColumnDef{
1717
Null: 47,
18+
Key: -1,
1819
Name: &ast.Ident{
1920
NamePos: 27,
2021
NameEnd: 30,

testdata/result/ddl/alter_table_add_column_identity.sql.txt

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ alter table foo add column baz int64 not null generated by default as identity (
1515
Add: 16,
1616
Column: &ast.ColumnDef{
1717
Null: 41,
18+
Key: -1,
1819
Name: &ast.Ident{
1920
NamePos: 27,
2021
NameEnd: 30,

testdata/result/ddl/alter_table_add_column_if_not_exists.sql.txt

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ alter table foo add column if not exists baz string(max) not null
1717
IfNotExists: true,
1818
Column: &ast.ColumnDef{
1919
Null: 61,
20+
Key: -1,
2021
Name: &ast.Ident{
2122
NamePos: 41,
2223
NameEnd: 44,

testdata/result/ddl/alter_table_add_column_with_if_expression.sql.txt

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ ALTER TABLE foo ADD COLUMN expired_at TIMESTAMP AS (IF (status != "OPEN" AND sta
1515
Add: 16,
1616
Column: &ast.ColumnDef{
1717
Null: -1,
18+
Key: -1,
1819
Name: &ast.Ident{
1920
NamePos: 27,
2021
NameEnd: 37,

testdata/result/ddl/create_table.sql.txt

+6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ create table foo (
2929
Columns: []*ast.ColumnDef{
3030
&ast.ColumnDef{
3131
Null: -1,
32+
Key: -1,
3233
Name: &ast.Ident{
3334
NamePos: 21,
3435
NameEnd: 24,
@@ -42,6 +43,7 @@ create table foo (
4243
},
4344
&ast.ColumnDef{
4445
Null: 50,
46+
Key: -1,
4547
Name: &ast.Ident{
4648
NamePos: 34,
4749
NameEnd: 37,
@@ -56,6 +58,7 @@ create table foo (
5658
},
5759
&ast.ColumnDef{
5860
Null: 78,
61+
Key: -1,
5962
Name: &ast.Ident{
6063
NamePos: 58,
6164
NameEnd: 61,
@@ -93,6 +96,7 @@ create table foo (
9396
},
9497
&ast.ColumnDef{
9598
Null: 145,
99+
Key: -1,
96100
Name: &ast.Ident{
97101
NamePos: 125,
98102
NameEnd: 128,
@@ -147,6 +151,7 @@ create table foo (
147151
},
148152
&ast.ColumnDef{
149153
Null: -1,
154+
Key: -1,
150155
Name: &ast.Ident{
151156
NamePos: 482,
152157
NameEnd: 486,
@@ -160,6 +165,7 @@ create table foo (
160165
},
161166
&ast.ColumnDef{
162167
Null: 515,
168+
Key: -1,
163169
Name: &ast.Ident{
164170
NamePos: 495,
165171
NameEnd: 500,

testdata/result/ddl/create_table_cluster.sql.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ create table foo (
2020
Columns: []*ast.ColumnDef{
2121
&ast.ColumnDef{
2222
Null: -1,
23+
Key: -1,
2324
Name: &ast.Ident{
2425
NamePos: 21,
2526
NameEnd: 24,
@@ -33,6 +34,7 @@ create table foo (
3334
},
3435
&ast.ColumnDef{
3536
Null: -1,
37+
Key: -1,
3638
Name: &ast.Ident{
3739
NamePos: 34,
3840
NameEnd: 37,
@@ -64,5 +66,5 @@ create table foo (
6466
CREATE TABLE foo (
6567
foo INT64,
6668
bar INT64
67-
) PRIMARY KEY (),
69+
),
6870
INTERLEAVE IN PARENT foobar

testdata/result/ddl/create_table_cluster_and_row_deletion_policy.sql.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ create table foo (
2222
Columns: []*ast.ColumnDef{
2323
&ast.ColumnDef{
2424
Null: -1,
25+
Key: -1,
2526
Name: &ast.Ident{
2627
NamePos: 21,
2728
NameEnd: 24,
@@ -35,6 +36,7 @@ create table foo (
3536
},
3637
&ast.ColumnDef{
3738
Null: -1,
39+
Key: -1,
3840
Name: &ast.Ident{
3941
NamePos: 34,
4042
NameEnd: 37,
@@ -48,6 +50,7 @@ create table foo (
4850
},
4951
&ast.ColumnDef{
5052
Null: -1,
53+
Key: -1,
5154
Name: &ast.Ident{
5255
NamePos: 47,
5356
NameEnd: 50,
@@ -98,5 +101,5 @@ CREATE TABLE foo (
98101
foo INT64,
99102
bar INT64,
100103
baz TIMESTAMP
101-
) PRIMARY KEY (),
104+
),
102105
INTERLEAVE IN PARENT foobar, ROW DELETION POLICY ( OLDER_THAN ( baz, INTERVAL 30 DAY ))

testdata/result/ddl/create_table_cluster_on_delete_no_action.sql.txt

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ create table foo (
1919
Columns: []*ast.ColumnDef{
2020
&ast.ColumnDef{
2121
Null: -1,
22+
Key: -1,
2223
Name: &ast.Ident{
2324
NamePos: 21,
2425
NameEnd: 24,

testdata/result/ddl/create_table_cluster_set_on_delete.sql.txt

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ create table foo (
1919
Columns: []*ast.ColumnDef{
2020
&ast.ColumnDef{
2121
Null: -1,
22+
Key: -1,
2223
Name: &ast.Ident{
2324
NamePos: 21,
2425
NameEnd: 24,

testdata/result/ddl/create_table_for_format_test.sql.txt

+5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ create table if not exists foo (
2929
Columns: []*ast.ColumnDef{
3030
&ast.ColumnDef{
3131
Null: -1,
32+
Key: -1,
3233
Name: &ast.Ident{
3334
NamePos: 37,
3435
NameEnd: 40,
@@ -42,6 +43,7 @@ create table if not exists foo (
4243
},
4344
&ast.ColumnDef{
4445
Null: 68,
46+
Key: -1,
4547
Name: &ast.Ident{
4648
NamePos: 52,
4749
NameEnd: 55,
@@ -56,6 +58,7 @@ create table if not exists foo (
5658
},
5759
&ast.ColumnDef{
5860
Null: 98,
61+
Key: -1,
5962
Name: &ast.Ident{
6063
NamePos: 78,
6164
NameEnd: 81,
@@ -93,6 +96,7 @@ create table if not exists foo (
9396
},
9497
&ast.ColumnDef{
9598
Null: 167,
99+
Key: -1,
96100
Name: &ast.Ident{
97101
NamePos: 147,
98102
NameEnd: 150,
@@ -147,6 +151,7 @@ create table if not exists foo (
147151
},
148152
&ast.ColumnDef{
149153
Null: 408,
154+
Key: -1,
150155
Name: &ast.Ident{
151156
NamePos: 388,
152157
NameEnd: 393,

0 commit comments

Comments
 (0)