Skip to content

Commit

Permalink
Merge pull request cockroachdb#63775 from the-ericwang35/backport20.2…
Browse files Browse the repository at this point in the history
…-63271

release-20.2: sql: wrap typed Array within IndirectionExpr in ParenExpr
  • Loading branch information
the-ericwang35 authored Apr 19, 2021
2 parents 9403cf5 + 8156a5d commit 0f7c01f
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 3 deletions.
22 changes: 22 additions & 0 deletions pkg/sql/logictest/testdata/logic_test/enums
Original file line number Diff line number Diff line change
Expand Up @@ -1218,3 +1218,25 @@ query T
SELECT * FROM arr_t3
----
c

statement ok
CREATE TABLE arr_t4 (i typ DEFAULT ARRAY['a'::typ][1], j typ DEFAULT ARRAY['a'::typ, 'b'::typ, 'c'::typ][2])

statement ok
INSERT INTO arr_t4 VALUES (default, default)

query TT
SELECT * from arr_t4
----
a b

statement ok
CREATE TABLE arr_t5 (i typ[] default ARRAY['a'::typ, 'b'::typ])

statement ok
INSERT INTO arr_t5 VALUES (default)

query T
SELECT * from arr_t5
----
{a,b}
14 changes: 11 additions & 3 deletions pkg/sql/sem/tree/expr.go
Original file line number Diff line number Diff line change
Expand Up @@ -1624,10 +1624,18 @@ type IndirectionExpr struct {

// Format implements the NodeFormatter interface.
func (node *IndirectionExpr) Format(ctx *FmtCtx) {
// If the subExpr is a CastExpr, we need to wrap it in a ParenExpr,
// otherwise the indirection will get interpreted as part of the type.
// If the sub expression is a CastExpr or an Array that has a type,
// we need to wrap it in a ParenExpr, otherwise the indirection
// will get interpreted as part of the type.
// Ex. ('{a}'::_typ)[1] vs. '{a}'::_typ[1].
if _, isCast := node.Expr.(*CastExpr); isCast {
// Ex. (ARRAY['a'::typ]:::typ[])[1] vs. ARRAY['a'::typ]:::typ[][1].
var annotateArray bool
if arr, ok := node.Expr.(*Array); ctx.HasFlags(FmtParsable) && ok && arr.typ != nil {
if arr.typ.ArrayContents().Family() != types.UnknownFamily {
annotateArray = true
}
}
if _, isCast := node.Expr.(*CastExpr); isCast || annotateArray {
withParens := ParenExpr{Expr: node.Expr}
exprFmtWithParen(ctx, &withParens)
} else {
Expand Down
1 change: 1 addition & 0 deletions pkg/sql/sem/tree/type_check_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ func TestTypeCheck(t *testing.T) {

{`(('{' || 'a' ||'}')::STRING[])[1]::STRING`, `((('{':::STRING || 'a':::STRING) || '}':::STRING)::STRING[])[1:::INT8]`},
{`(('{' || '1' ||'}')::INT[])[1]`, `((('{':::STRING || '1':::STRING) || '}':::STRING)::INT8[])[1:::INT8]`},
{`(ARRAY[1, 2, 3]::int[])[2]`, `(ARRAY[1:::INT8, 2:::INT8, 3:::INT8]:::INT8[])[2:::INT8]`},
}
ctx := context.Background()
for _, d := range testData {
Expand Down

0 comments on commit 0f7c01f

Please sign in to comment.