2
0

array_param_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package pgserver
  2. import (
  3. "bufio"
  4. "testing"
  5. )
  6. // A pg client that binds a text[] parameter for "id = ANY($1)" must receive a
  7. // clear feature-not-supported error instead of a silently empty result.
  8. func TestArrayParameterRejectedOverExtendedQuery(t *testing.T) {
  9. c, client := newDataConnection(t)
  10. reader := bufio.NewReader(client)
  11. parse := NewMessageBuilder()
  12. parse.WriteString("s1")
  13. parse.WriteString("SELECT * FROM t WHERE id = ANY($1)")
  14. parse.WriteInt16(1)
  15. parse.WriteInt32(1009) // text[]
  16. if err := c.handleParse(&Message{Type: MsgParse, Data: parse.Bytes()}); err != nil {
  17. t.Fatalf("handleParse: %v", err)
  18. }
  19. bind := NewMessageBuilder()
  20. bind.WriteString("p1")
  21. bind.WriteString("s1")
  22. bind.WriteInt16(0) // all-text parameter formats
  23. bind.WriteInt16(1) // one parameter
  24. bind.WriteInt32(5)
  25. bind.WriteBytes([]byte("{1,2}"))
  26. bind.WriteInt16(0) // all-text result formats
  27. if err := c.handleBind(&Message{Type: MsgBind, Data: bind.Bytes()}); err != nil {
  28. t.Fatalf("handleBind: %v", err)
  29. }
  30. execute := NewMessageBuilder()
  31. execute.WriteString("p1")
  32. execute.WriteInt32(0)
  33. done := make(chan error, 1)
  34. // handleBind buffered BindComplete without flushing; handleExecute's error
  35. // path flushes both messages, so read them in order.
  36. go func() { done <- c.handleExecute(&Message{Type: MsgExecute, Data: execute.Bytes()}) }()
  37. var errMsg *Message
  38. for errMsg == nil {
  39. msg, err := ReadMessage(reader)
  40. if err != nil {
  41. t.Fatalf("read response: %v", err)
  42. }
  43. if msg.Type == MsgErrorResponse {
  44. errMsg = msg
  45. }
  46. }
  47. if err := <-done; err != nil {
  48. t.Fatalf("handleExecute: %v", err)
  49. }
  50. if code := errorCode(errMsg); code != ErrCodeFeatureNotSupported {
  51. t.Fatalf("error code = %q, want %q", code, ErrCodeFeatureNotSupported)
  52. }
  53. }