2
0

unsupported_locking_test.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package pgserver
  2. import (
  3. "bytes"
  4. "testing"
  5. )
  6. // errorField extracts a named field from an ErrorResponse.
  7. func errorField(t *testing.T, msg *Message, want byte) string {
  8. t.Helper()
  9. if msg == nil || msg.Type != MsgErrorResponse {
  10. t.Fatalf("message type = %v, want ErrorResponse", msg)
  11. }
  12. data := msg.Data
  13. for i := 0; i < len(data); {
  14. if data[i] == 0 {
  15. break
  16. }
  17. field := data[i]
  18. i++
  19. end := bytes.IndexByte(data[i:], 0)
  20. if end < 0 {
  21. break
  22. }
  23. value := string(data[i : i+end])
  24. if field == want {
  25. return value
  26. }
  27. i += end + 1
  28. }
  29. return ""
  30. }
  31. func TestLockingClauseRejectedOverSimpleQuery(t *testing.T) {
  32. c, client := newDataConnection(t)
  33. runQuery(t, c, client, &Message{Type: MsgQuery, Data: append([]byte("CREATE TABLE t (id INTEGER PRIMARY KEY)"), 0)})
  34. msgs := runQuery(t, c, client, &Message{Type: MsgQuery, Data: append([]byte("SELECT * FROM t FOR UPDATE"), 0)})
  35. if code := errorCode(msgs[0]); code != ErrCodeFeatureNotSupported {
  36. t.Fatalf("error code = %q, want %q", code, ErrCodeFeatureNotSupported)
  37. }
  38. if message := errorField(t, msgs[0], ErrorFieldMessage); !bytes.Contains([]byte(message), []byte("row locking")) {
  39. t.Fatalf("error message = %q, want a row-locking explanation", message)
  40. }
  41. }