| 465 | } |
| 466 | |
| 467 | func TestAppend(t *testing.T) { |
| 468 | tests := []struct { |
| 469 | input sql.Querier |
| 470 | wantQuery string |
| 471 | wantArgs []any |
| 472 | }{ |
| 473 | { |
| 474 | input: func() sql.Querier { |
| 475 | u := sql.Dialect(dialect.Postgres).Update("t") |
| 476 | sqljson.Append(u, "c", []string{"a"}) |
| 477 | return u |
| 478 | }(), |
| 479 | wantQuery: `UPDATE "t" SET "c" = CASE WHEN ("c" IS NULL OR "c" = 'null'::jsonb) THEN $1 ELSE "c" || $2 END`, |
| 480 | wantArgs: []any{`["a"]`, `["a"]`}, |
| 481 | }, |
| 482 | { |
| 483 | input: func() sql.Querier { |
| 484 | u := sql.Dialect(dialect.Postgres).Update("t") |
| 485 | sqljson.Append(u, "c", []string{"a"}, sqljson.Path("a")) |
| 486 | return u |
| 487 | }(), |
| 488 | wantQuery: `UPDATE "t" SET "c" = CASE WHEN (("c"->'a')::jsonb IS NULL OR ("c"->'a')::jsonb = 'null'::jsonb) THEN jsonb_set("c", '{a}', $1, true) ELSE jsonb_set("c", '{a}', "c"->'a' || $2, true) END`, |
| 489 | wantArgs: []any{`["a"]`, `["a"]`}, |
| 490 | }, |
| 491 | { |
| 492 | input: func() sql.Querier { |
| 493 | u := sql.Dialect(dialect.SQLite).Update("t") |
| 494 | sqljson.Append(u, "c", []string{"a"}) |
| 495 | return u |
| 496 | }(), |
| 497 | wantQuery: "UPDATE `t` SET `c` = CASE WHEN (JSON_TYPE(`c`, '$') IS NULL OR JSON_TYPE(`c`, '$') = 'null') THEN ? ELSE JSON_INSERT(`c`, '$[#]', ?) END", |
| 498 | wantArgs: []any{`["a"]`, "a"}, |
| 499 | }, |
| 500 | { |
| 501 | input: func() sql.Querier { |
| 502 | u := sql.Dialect(dialect.SQLite).Update("t") |
| 503 | sqljson.Append(u, "c", []any{"a", struct{}{}}, sqljson.Path("a")) |
| 504 | return u |
| 505 | }(), |
| 506 | wantQuery: "UPDATE `t` SET `c` = CASE WHEN (JSON_TYPE(`c`, '$.a') IS NULL OR JSON_TYPE(`c`, '$.a') = 'null') THEN JSON_SET(`c`, '$.a', JSON(?)) ELSE JSON_INSERT(`c`, '$.a[#]', ?, '$.a[#]', JSON(?)) END", |
| 507 | wantArgs: []any{`["a",{}]`, "a", "{}"}, |
| 508 | }, |
| 509 | { |
| 510 | input: func() sql.Querier { |
| 511 | u := sql.Dialect(dialect.MySQL).Update("t") |
| 512 | sqljson.Append(u, "c", []string{"a"}) |
| 513 | return u |
| 514 | }(), |
| 515 | wantQuery: "UPDATE `t` SET `c` = CASE WHEN (JSON_TYPE(JSON_EXTRACT(`c`, '$')) IS NULL OR JSON_TYPE(JSON_EXTRACT(`c`, '$')) = 'NULL') THEN JSON_ARRAY(?) ELSE JSON_ARRAY_APPEND(`c`, '$', ?) END", |
| 516 | wantArgs: []any{"a", "a"}, |
| 517 | }, |
| 518 | { |
| 519 | input: func() sql.Querier { |
| 520 | u := sql.Dialect(dialect.MySQL).Update("t") |
| 521 | sqljson.Append(u, "c", []string{"a"}, sqljson.Path("a")) |
| 522 | return u |
| 523 | }(), |
| 524 | wantQuery: "UPDATE `t` SET `c` = CASE WHEN (JSON_TYPE(JSON_EXTRACT(`c`, '$.a')) IS NULL OR JSON_TYPE(JSON_EXTRACT(`c`, '$.a')) = 'NULL') THEN JSON_SET(`c`, '$.a', JSON_ARRAY(?)) ELSE JSON_ARRAY_APPEND(`c`, '$.a', ?) END", |