not_null_test.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package pgserver
  2. import (
  3. "bufio"
  4. "net"
  5. "testing"
  6. )
  7. func runExtendedExecution(t *testing.T, c *Connection, client net.Conn, sql string) []*Message {
  8. t.Helper()
  9. c.portals[""] = &portal{query: sql}
  10. done := make(chan error, 1)
  11. go func() {
  12. if err := c.handleExecute(&Message{Type: MsgExecute, Data: []byte{0, 0, 0, 0, 0}}); err != nil {
  13. done <- err
  14. return
  15. }
  16. done <- c.handleMessage(&Message{Type: MsgSync})
  17. }()
  18. reader := bufio.NewReader(client)
  19. var messages []*Message
  20. for {
  21. m, err := ReadMessage(reader)
  22. if err != nil {
  23. t.Fatal(err)
  24. }
  25. messages = append(messages, m)
  26. if m.Type == MsgReadyForQuery {
  27. break
  28. }
  29. }
  30. if err := <-done; err != nil {
  31. t.Fatal(err)
  32. }
  33. return messages
  34. }
  35. func TestNotNullSQLStateAndTransactionState(t *testing.T) {
  36. for _, extended := range []bool{false, true} {
  37. c, client := newDataConnection(t)
  38. runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte("CREATE TABLE t (id INTEGER PRIMARY KEY, v TEXT NOT NULL DEFAULT 'x')\x00")})
  39. runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte("BEGIN\x00")})
  40. var messages []*Message
  41. if extended {
  42. messages = runExtendedExecution(t, c, client, "INSERT INTO t VALUES (1,NULL)")
  43. } else {
  44. messages = runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte("INSERT INTO t VALUES (1,NULL)\x00")})
  45. }
  46. if code := errorCode(messages[0]); code != "23502" {
  47. t.Fatalf("extended=%v SQLSTATE=%q", extended, code)
  48. }
  49. if c.txStatus != TxStatusFailed {
  50. t.Fatalf("extended=%v transaction not failed: %c", extended, c.txStatus)
  51. }
  52. runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte("ROLLBACK\x00")})
  53. }
  54. }