2
0

primary_key_test.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package pgserver
  2. import (
  3. "fmt"
  4. "testing"
  5. )
  6. func TestPrimaryKeySQLStateAcrossMutationAndProtocolPaths(t *testing.T) {
  7. for _, extended := range []bool{false, true} {
  8. for _, transaction := range []bool{false, true} {
  9. for _, sql := range []string{"INSERT INTO t VALUES (1)", "INSERT INTO t VALUES (3),(3)", "UPDATE t SET id=2 WHERE id=1"} {
  10. t.Run(fmt.Sprintf("extended=%v/transaction=%v/%s", extended, transaction, sql), func(t *testing.T) {
  11. c, client := newDataConnection(t)
  12. runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte("CREATE TABLE t (id INTEGER PRIMARY KEY)\x00")})
  13. runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte("INSERT INTO t VALUES (1),(2)\x00")})
  14. if transaction {
  15. runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte("BEGIN\x00")})
  16. }
  17. var messages []*Message
  18. if extended {
  19. messages = runExtendedExecution(t, c, client, sql)
  20. } else {
  21. messages = runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte(sql + "\x00")})
  22. }
  23. if code := errorCode(messages[0]); code != ErrCodeUniqueViolation {
  24. t.Fatalf("SQLSTATE=%s want 23505", code)
  25. }
  26. if transaction {
  27. if c.txStatus != TxStatusFailed {
  28. t.Fatalf("transaction status %c want E", c.txStatus)
  29. }
  30. blocked := runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte("SELECT 1\x00")})
  31. if code := errorCode(blocked[0]); code != ErrCodeTransactionAborted {
  32. t.Fatalf("aborted SQLSTATE=%s", code)
  33. }
  34. runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte("ROLLBACK\x00")})
  35. }
  36. count := runQuery(t, c, client, &Message{Type: MsgQuery, Data: []byte("SELECT COUNT(*) FROM t\x00")})
  37. if values := dataRowValues(t, count[1]); len(values) != 1 || values[0] != "2" {
  38. t.Fatalf("failed statement changed rows: %v", values)
  39. }
  40. })
  41. }
  42. }
  43. }
  44. }