2
0

not_null_test.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package executor
  2. import (
  3. "errors"
  4. "testing"
  5. "github.com/danfragoso/pizzasql-next/pkg/storage"
  6. )
  7. func TestNotNullFinalRowValidation(t *testing.T) {
  8. _, schema, table := newTestDB(t)
  9. e := newExec(schema, table)
  10. execMust(t, e, "CREATE TABLE t (id INTEGER PRIMARY KEY, v INTEGER NOT NULL DEFAULT 7, w INTEGER NOT NULL)")
  11. execMust(t, e, "INSERT INTO t (id,w) VALUES (1,2)")
  12. for _, explicit := range []bool{false, true} {
  13. if explicit {
  14. execMust(t, e, "BEGIN")
  15. }
  16. for _, sql := range []string{
  17. "INSERT INTO t VALUES (2,NULL,3)",
  18. "INSERT INTO t (id) VALUES (2)",
  19. "INSERT INTO t VALUES (2,7,3),(3,7,NULL)",
  20. "UPDATE t SET v=NULL WHERE id=1",
  21. "UPDATE t SET w=NULL",
  22. "INSERT INTO t VALUES (1,7,4) ON CONFLICT (id) DO UPDATE SET w=NULL",
  23. } {
  24. _, err := execSQL(e, sql)
  25. var violation *storage.NotNullViolationError
  26. if !errors.As(err, &violation) {
  27. t.Fatalf("tx=%v %s: expected typed NOT NULL violation, got %v", explicit, sql, err)
  28. }
  29. rows := execMust(t, e, "SELECT id,v,w FROM t").Rows
  30. if len(rows) != 1 || rows[0][1] != int64(7) || rows[0][2] != int64(2) {
  31. t.Fatalf("failed mutation changed rows: %v", rows)
  32. }
  33. }
  34. if explicit {
  35. execMust(t, e, "COMMIT")
  36. }
  37. }
  38. if _, err := table.InsertBulk("t", []storage.Row{{"id": int64(2), "v": nil, "w": int64(3)}}); err == nil {
  39. t.Fatal("bulk insert accepted explicit NULL")
  40. }
  41. }