unsupported_default_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package pgserver
  2. import (
  3. "bufio"
  4. "bytes"
  5. "net"
  6. "testing"
  7. )
  8. func runExtendedMessage(t *testing.T, c *Connection, client net.Conn, msg *Message) *Message {
  9. t.Helper()
  10. done := make(chan error, 1)
  11. go func() {
  12. done <- c.handleExecute(msg)
  13. }()
  14. m, err := ReadMessage(bufio.NewReader(client))
  15. if err != nil {
  16. t.Fatalf("read response: %v", err)
  17. }
  18. if err := <-done; err != nil {
  19. t.Fatalf("handle message: %v", err)
  20. }
  21. return m
  22. }
  23. func TestNonConstantDefaultRejectedOverSimpleQuery(t *testing.T) {
  24. c, client := newDataConnection(t)
  25. msgs := runQuery(t, c, client, &Message{Type: MsgQuery, Data: append([]byte("CREATE TABLE t (id INTEGER PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)"), 0)})
  26. if len(msgs) != 2 {
  27. t.Fatalf("got %d messages, want ErrorResponse+ReadyForQuery", len(msgs))
  28. }
  29. if code := errorCode(msgs[0]); code != ErrCodeFeatureNotSupported {
  30. t.Fatalf("error code = %q, want %q", code, ErrCodeFeatureNotSupported)
  31. }
  32. if message := errorField(t, msgs[0], ErrorFieldMessage); !bytes.Contains([]byte(message), []byte("constant")) {
  33. t.Fatalf("error message = %q, want an explanation about constant defaults", message)
  34. }
  35. }
  36. func TestNonConstantDefaultRejectedOverExtendedQuery(t *testing.T) {
  37. c, client := newDataConnection(t)
  38. // Parse does not parse the SQL (it is parsed at Execute), so install the
  39. // portal directly; this exercises the extended-protocol execution error path.
  40. c.portals["p1"] = &portal{query: "CREATE TABLE t (id INTEGER PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)"}
  41. execute := NewMessageBuilder()
  42. execute.WriteString("p1")
  43. execute.WriteInt32(0)
  44. errMsg := runExtendedMessage(t, c, client, &Message{Type: MsgExecute, Data: execute.Bytes()})
  45. if code := errorCode(errMsg); code != ErrCodeFeatureNotSupported {
  46. t.Fatalf("error code = %q, want %q", code, ErrCodeFeatureNotSupported)
  47. }
  48. }