diff options
Diffstat (limited to 'vendor')
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/CHANGELOG.md | 12 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/README.md | 6 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/conn.go | 6 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/doc.go | 8 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/pgconn/config.go | 2 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/pgconn/pgconn.go | 17 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/pgproto3/trace.go | 260 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/pgtype/json.go | 30 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/pgtype/numeric.go | 16 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/pgtype/pgtype.go | 2 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/rows.go | 13 | ||||
| -rw-r--r-- | vendor/github.com/jackc/pgx/v5/tx.go | 1 | ||||
| -rw-r--r-- | vendor/modules.txt | 2 | 
13 files changed, 188 insertions, 187 deletions
diff --git a/vendor/github.com/jackc/pgx/v5/CHANGELOG.md b/vendor/github.com/jackc/pgx/v5/CHANGELOG.md index 916666b4a..fb2304a2f 100644 --- a/vendor/github.com/jackc/pgx/v5/CHANGELOG.md +++ b/vendor/github.com/jackc/pgx/v5/CHANGELOG.md @@ -1,3 +1,15 @@ +# 5.4.3 (August 5, 2023) + +* Fix: QCharArrayOID was defined with the wrong OID (Christoph Engelbert) +* Fix: connect_timeout for sslmode=allow|prefer (smaher-edb) +* Fix: pgxpool: background health check cannot overflow pool +* Fix: Check for nil in defer when sending batch (recover properly from panic) +* Fix: json scan of non-string pointer to pointer +* Fix: zeronull.Timestamptz should use pgtype.Timestamptz +* Fix: NewConnsCount was not correctly counting connections created by Acquire directly. (James Hartig) +* RowTo(AddrOf)StructByPos ignores fields with "-" db tag +* Optimization: improve text format numeric parsing (horpto) +  # 5.4.2 (July 11, 2023)  * Fix: RowScanner errors are fatal to Rows diff --git a/vendor/github.com/jackc/pgx/v5/README.md b/vendor/github.com/jackc/pgx/v5/README.md index ad48697c1..522206f95 100644 --- a/vendor/github.com/jackc/pgx/v5/README.md +++ b/vendor/github.com/jackc/pgx/v5/README.md @@ -1,5 +1,5 @@  [](https://pkg.go.dev/github.com/jackc/pgx/v5) - +[](https://github.com/jackc/pgx/actions/workflows/ci.yml)  # pgx - PostgreSQL Driver and Toolkit @@ -139,8 +139,8 @@ These adapters can be used with the tracelog package.  ### [github.com/pashagolub/pgxmock](https://github.com/pashagolub/pgxmock) -pgxmock is a mock library implementing pgx interfaces.  -pgxmock has one and only purpose - to simulate pgx behavior in tests, without needing a real database connection.  +pgxmock is a mock library implementing pgx interfaces. +pgxmock has one and only purpose - to simulate pgx behavior in tests, without needing a real database connection.  ### [github.com/georgysavva/scany](https://github.com/georgysavva/scany) diff --git a/vendor/github.com/jackc/pgx/v5/conn.go b/vendor/github.com/jackc/pgx/v5/conn.go index a609d1002..7c7081b48 100644 --- a/vendor/github.com/jackc/pgx/v5/conn.go +++ b/vendor/github.com/jackc/pgx/v5/conn.go @@ -194,7 +194,7 @@ func ParseConfigWithOptions(connString string, options ParseConfigOptions) (*Con  	return connConfig, nil  } -// ParseConfig creates a ConnConfig from a connection string. ParseConfig handles all options that pgconn.ParseConfig +// ParseConfig creates a ConnConfig from a connection string. ParseConfig handles all options that [pgconn.ParseConfig]  // does. In addition, it accepts the following options:  //  //   - default_query_exec_mode. @@ -507,7 +507,7 @@ func (c *Conn) execSimpleProtocol(ctx context.Context, sql string, arguments []a  	mrr := c.pgConn.Exec(ctx, sql)  	for mrr.NextResult() { -		commandTag, err = mrr.ResultReader().Close() +		commandTag, _ = mrr.ResultReader().Close()  	}  	err = mrr.Close()  	return commandTag, err @@ -1064,7 +1064,7 @@ func (c *Conn) sendBatchQueryExecModeDescribeExec(ctx context.Context, b *Batch)  func (c *Conn) sendBatchExtendedWithDescription(ctx context.Context, b *Batch, distinctNewQueries []*pgconn.StatementDescription, sdCache stmtcache.Cache) (pbr *pipelineBatchResults) {  	pipeline := c.pgConn.StartPipeline(context.Background())  	defer func() { -		if pbr.err != nil { +		if pbr != nil && pbr.err != nil {  			pipeline.Close()  		}  	}() diff --git a/vendor/github.com/jackc/pgx/v5/doc.go b/vendor/github.com/jackc/pgx/v5/doc.go index 0db8cbb14..7486f42c5 100644 --- a/vendor/github.com/jackc/pgx/v5/doc.go +++ b/vendor/github.com/jackc/pgx/v5/doc.go @@ -7,17 +7,17 @@ details.  Establishing a Connection -The primary way of establishing a connection is with `pgx.Connect`. +The primary way of establishing a connection is with [pgx.Connect]:      conn, err := pgx.Connect(context.Background(), os.Getenv("DATABASE_URL"))  The database connection string can be in URL or DSN format. Both PostgreSQL settings and pgx settings can be specified -here. In addition, a config struct can be created by `ParseConfig` and modified before establishing the connection with -`ConnectConfig` to configure settings such as tracing that cannot be configured with a connection string. +here. In addition, a config struct can be created by [ParseConfig] and modified before establishing the connection with +[ConnectConfig] to configure settings such as tracing that cannot be configured with a connection string.  Connection Pool -`*pgx.Conn` represents a single connection to the database and is not concurrency safe. Use package +[*pgx.Conn] represents a single connection to the database and is not concurrency safe. Use package  github.com/jackc/pgx/v5/pgxpool for a concurrency safe connection pool.  Query Interface diff --git a/vendor/github.com/jackc/pgx/v5/pgconn/config.go b/vendor/github.com/jackc/pgx/v5/pgconn/config.go index 24bf837ce..1c2c647d9 100644 --- a/vendor/github.com/jackc/pgx/v5/pgconn/config.go +++ b/vendor/github.com/jackc/pgx/v5/pgconn/config.go @@ -26,7 +26,7 @@ type AfterConnectFunc func(ctx context.Context, pgconn *PgConn) error  type ValidateConnectFunc func(ctx context.Context, pgconn *PgConn) error  type GetSSLPasswordFunc func(ctx context.Context) string -// Config is the settings used to establish a connection to a PostgreSQL server. It must be created by ParseConfig. A +// Config is the settings used to establish a connection to a PostgreSQL server. It must be created by [ParseConfig]. A  // manually initialized Config will cause ConnectConfig to panic.  type Config struct {  	Host           string // host (e.g. localhost) or absolute path to unix domain socket directory (e.g. /private/tmp) diff --git a/vendor/github.com/jackc/pgx/v5/pgconn/pgconn.go b/vendor/github.com/jackc/pgx/v5/pgconn/pgconn.go index 12357751a..8f602e409 100644 --- a/vendor/github.com/jackc/pgx/v5/pgconn/pgconn.go +++ b/vendor/github.com/jackc/pgx/v5/pgconn/pgconn.go @@ -97,7 +97,7 @@ type PgConn struct {  }  // Connect establishes a connection to a PostgreSQL server using the environment and connString (in URL or DSN format) -// to provide configuration. See documentation for ParseConfig for details. ctx can be used to cancel a connect attempt. +// to provide configuration. See documentation for [ParseConfig] for details. ctx can be used to cancel a connect attempt.  func Connect(ctx context.Context, connString string) (*PgConn, error) {  	config, err := ParseConfig(connString)  	if err != nil { @@ -108,7 +108,7 @@ func Connect(ctx context.Context, connString string) (*PgConn, error) {  }  // Connect establishes a connection to a PostgreSQL server using the environment and connString (in URL or DSN format) -// and ParseConfigOptions to provide additional configuration. See documentation for ParseConfig for details. ctx can be +// and ParseConfigOptions to provide additional configuration. See documentation for [ParseConfig] for details. ctx can be  // used to cancel a connect attempt.  func ConnectWithOptions(ctx context.Context, connString string, parseConfigOptions ParseConfigOptions) (*PgConn, error) {  	config, err := ParseConfigWithOptions(connString, parseConfigOptions) @@ -120,7 +120,7 @@ func ConnectWithOptions(ctx context.Context, connString string, parseConfigOptio  }  // Connect establishes a connection to a PostgreSQL server using config. config must have been constructed with -// ParseConfig. ctx can be used to cancel a connect attempt. +// [ParseConfig]. ctx can be used to cancel a connect attempt.  //  // If config.Fallbacks are present they will sequentially be tried in case of error establishing network connection. An  // authentication error will terminate the chain of attempts (like libpq: @@ -154,12 +154,15 @@ func ConnectConfig(octx context.Context, config *Config) (pgConn *PgConn, err er  	foundBestServer := false  	var fallbackConfig *FallbackConfig -	for _, fc := range fallbackConfigs { +	for i, fc := range fallbackConfigs {  		// ConnectTimeout restricts the whole connection process.  		if config.ConnectTimeout != 0 { -			var cancel context.CancelFunc -			ctx, cancel = context.WithTimeout(octx, config.ConnectTimeout) -			defer cancel() +			// create new context first time or when previous host was different +			if i == 0 || (fallbackConfigs[i].Host != fallbackConfigs[i-1].Host) { +				var cancel context.CancelFunc +				ctx, cancel = context.WithTimeout(octx, config.ConnectTimeout) +				defer cancel() +			}  		} else {  			ctx = octx  		} diff --git a/vendor/github.com/jackc/pgx/v5/pgproto3/trace.go b/vendor/github.com/jackc/pgx/v5/pgproto3/trace.go index c09f68d1a..6cc7d3e36 100644 --- a/vendor/github.com/jackc/pgx/v5/pgproto3/trace.go +++ b/vendor/github.com/jackc/pgx/v5/pgproto3/trace.go @@ -6,15 +6,18 @@ import (  	"io"  	"strconv"  	"strings" +	"sync"  	"time"  )  // tracer traces the messages send to and from a Backend or Frontend. The format it produces roughly mimics the  // format produced by the libpq C function PQtrace.  type tracer struct { +	TracerOptions + +	mux sync.Mutex  	w   io.Writer  	buf *bytes.Buffer -	TracerOptions  }  // TracerOptions controls tracing behavior. It is roughly equivalent to the libpq function PQsetTraceFlags. @@ -119,278 +122,255 @@ func (t *tracer) traceMessage(sender byte, encodedLen int32, msg Message) {  	case *Terminate:  		t.traceTerminate(sender, encodedLen, msg)  	default: -		t.beginTrace(sender, encodedLen, "Unknown") -		t.finishTrace() +		t.writeTrace(sender, encodedLen, "Unknown", nil)  	}  }  func (t *tracer) traceAuthenticationCleartextPassword(sender byte, encodedLen int32, msg *AuthenticationCleartextPassword) { -	t.beginTrace(sender, encodedLen, "AuthenticationCleartextPassword") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "AuthenticationCleartextPassword", nil)  }  func (t *tracer) traceAuthenticationGSS(sender byte, encodedLen int32, msg *AuthenticationGSS) { -	t.beginTrace(sender, encodedLen, "AuthenticationGSS") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "AuthenticationGSS", nil)  }  func (t *tracer) traceAuthenticationGSSContinue(sender byte, encodedLen int32, msg *AuthenticationGSSContinue) { -	t.beginTrace(sender, encodedLen, "AuthenticationGSSContinue") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "AuthenticationGSSContinue", nil)  }  func (t *tracer) traceAuthenticationMD5Password(sender byte, encodedLen int32, msg *AuthenticationMD5Password) { -	t.beginTrace(sender, encodedLen, "AuthenticationMD5Password") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "AuthenticationMD5Password", nil)  }  func (t *tracer) traceAuthenticationOk(sender byte, encodedLen int32, msg *AuthenticationOk) { -	t.beginTrace(sender, encodedLen, "AuthenticationOk") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "AuthenticationOk", nil)  }  func (t *tracer) traceAuthenticationSASL(sender byte, encodedLen int32, msg *AuthenticationSASL) { -	t.beginTrace(sender, encodedLen, "AuthenticationSASL") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "AuthenticationSASL", nil)  }  func (t *tracer) traceAuthenticationSASLContinue(sender byte, encodedLen int32, msg *AuthenticationSASLContinue) { -	t.beginTrace(sender, encodedLen, "AuthenticationSASLContinue") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "AuthenticationSASLContinue", nil)  }  func (t *tracer) traceAuthenticationSASLFinal(sender byte, encodedLen int32, msg *AuthenticationSASLFinal) { -	t.beginTrace(sender, encodedLen, "AuthenticationSASLFinal") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "AuthenticationSASLFinal", nil)  }  func (t *tracer) traceBackendKeyData(sender byte, encodedLen int32, msg *BackendKeyData) { -	t.beginTrace(sender, encodedLen, "BackendKeyData") -	if t.RegressMode { -		t.buf.WriteString("\t NNNN NNNN") -	} else { -		fmt.Fprintf(t.buf, "\t %d %d", msg.ProcessID, msg.SecretKey) -	} -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "BackendKeyData", func() { +		if t.RegressMode { +			t.buf.WriteString("\t NNNN NNNN") +		} else { +			fmt.Fprintf(t.buf, "\t %d %d", msg.ProcessID, msg.SecretKey) +		} +	})  }  func (t *tracer) traceBind(sender byte, encodedLen int32, msg *Bind) { -	t.beginTrace(sender, encodedLen, "Bind") -	fmt.Fprintf(t.buf, "\t %s %s %d", traceDoubleQuotedString([]byte(msg.DestinationPortal)), traceDoubleQuotedString([]byte(msg.PreparedStatement)), len(msg.ParameterFormatCodes)) -	for _, fc := range msg.ParameterFormatCodes { -		fmt.Fprintf(t.buf, " %d", fc) -	} -	fmt.Fprintf(t.buf, " %d", len(msg.Parameters)) -	for _, p := range msg.Parameters { -		fmt.Fprintf(t.buf, " %s", traceSingleQuotedString(p)) -	} -	fmt.Fprintf(t.buf, " %d", len(msg.ResultFormatCodes)) -	for _, fc := range msg.ResultFormatCodes { -		fmt.Fprintf(t.buf, " %d", fc) -	} -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "Bind", func() { +		fmt.Fprintf(t.buf, "\t %s %s %d", traceDoubleQuotedString([]byte(msg.DestinationPortal)), traceDoubleQuotedString([]byte(msg.PreparedStatement)), len(msg.ParameterFormatCodes)) +		for _, fc := range msg.ParameterFormatCodes { +			fmt.Fprintf(t.buf, " %d", fc) +		} +		fmt.Fprintf(t.buf, " %d", len(msg.Parameters)) +		for _, p := range msg.Parameters { +			fmt.Fprintf(t.buf, " %s", traceSingleQuotedString(p)) +		} +		fmt.Fprintf(t.buf, " %d", len(msg.ResultFormatCodes)) +		for _, fc := range msg.ResultFormatCodes { +			fmt.Fprintf(t.buf, " %d", fc) +		} +	})  }  func (t *tracer) traceBindComplete(sender byte, encodedLen int32, msg *BindComplete) { -	t.beginTrace(sender, encodedLen, "BindComplete") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "BindComplete", nil)  }  func (t *tracer) traceCancelRequest(sender byte, encodedLen int32, msg *CancelRequest) { -	t.beginTrace(sender, encodedLen, "CancelRequest") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "CancelRequest", nil)  }  func (t *tracer) traceClose(sender byte, encodedLen int32, msg *Close) { -	t.beginTrace(sender, encodedLen, "Close") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "Close", nil)  }  func (t *tracer) traceCloseComplete(sender byte, encodedLen int32, msg *CloseComplete) { -	t.beginTrace(sender, encodedLen, "CloseComplete") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "CloseComplete", nil)  }  func (t *tracer) traceCommandComplete(sender byte, encodedLen int32, msg *CommandComplete) { -	t.beginTrace(sender, encodedLen, "CommandComplete") -	fmt.Fprintf(t.buf, "\t %s", traceDoubleQuotedString(msg.CommandTag)) -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "CommandComplete", func() { +		fmt.Fprintf(t.buf, "\t %s", traceDoubleQuotedString(msg.CommandTag)) +	})  }  func (t *tracer) traceCopyBothResponse(sender byte, encodedLen int32, msg *CopyBothResponse) { -	t.beginTrace(sender, encodedLen, "CopyBothResponse") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "CopyBothResponse", nil)  }  func (t *tracer) traceCopyData(sender byte, encodedLen int32, msg *CopyData) { -	t.beginTrace(sender, encodedLen, "CopyData") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "CopyData", nil)  }  func (t *tracer) traceCopyDone(sender byte, encodedLen int32, msg *CopyDone) { -	t.beginTrace(sender, encodedLen, "CopyDone") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "CopyDone", nil)  }  func (t *tracer) traceCopyFail(sender byte, encodedLen int32, msg *CopyFail) { -	t.beginTrace(sender, encodedLen, "CopyFail") -	fmt.Fprintf(t.buf, "\t %s", traceDoubleQuotedString([]byte(msg.Message))) -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "CopyFail", func() { +		fmt.Fprintf(t.buf, "\t %s", traceDoubleQuotedString([]byte(msg.Message))) +	})  }  func (t *tracer) traceCopyInResponse(sender byte, encodedLen int32, msg *CopyInResponse) { -	t.beginTrace(sender, encodedLen, "CopyInResponse") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "CopyInResponse", nil)  }  func (t *tracer) traceCopyOutResponse(sender byte, encodedLen int32, msg *CopyOutResponse) { -	t.beginTrace(sender, encodedLen, "CopyOutResponse") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "CopyOutResponse", nil)  }  func (t *tracer) traceDataRow(sender byte, encodedLen int32, msg *DataRow) { -	t.beginTrace(sender, encodedLen, "DataRow") -	fmt.Fprintf(t.buf, "\t %d", len(msg.Values)) -	for _, v := range msg.Values { -		if v == nil { -			t.buf.WriteString(" -1") -		} else { -			fmt.Fprintf(t.buf, " %d %s", len(v), traceSingleQuotedString(v)) +	t.writeTrace(sender, encodedLen, "DataRow", func() { +		fmt.Fprintf(t.buf, "\t %d", len(msg.Values)) +		for _, v := range msg.Values { +			if v == nil { +				t.buf.WriteString(" -1") +			} else { +				fmt.Fprintf(t.buf, " %d %s", len(v), traceSingleQuotedString(v)) +			}  		} -	} -	t.finishTrace() +	})  }  func (t *tracer) traceDescribe(sender byte, encodedLen int32, msg *Describe) { -	t.beginTrace(sender, encodedLen, "Describe") -	fmt.Fprintf(t.buf, "\t %c %s", msg.ObjectType, traceDoubleQuotedString([]byte(msg.Name))) -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "Describe", func() { +		fmt.Fprintf(t.buf, "\t %c %s", msg.ObjectType, traceDoubleQuotedString([]byte(msg.Name))) +	})  }  func (t *tracer) traceEmptyQueryResponse(sender byte, encodedLen int32, msg *EmptyQueryResponse) { -	t.beginTrace(sender, encodedLen, "EmptyQueryResponse") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "EmptyQueryResponse", nil)  }  func (t *tracer) traceErrorResponse(sender byte, encodedLen int32, msg *ErrorResponse) { -	t.beginTrace(sender, encodedLen, "ErrorResponse") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "ErrorResponse", nil)  }  func (t *tracer) TraceQueryute(sender byte, encodedLen int32, msg *Execute) { -	t.beginTrace(sender, encodedLen, "Execute") -	fmt.Fprintf(t.buf, "\t %s %d", traceDoubleQuotedString([]byte(msg.Portal)), msg.MaxRows) -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "Execute", func() { +		fmt.Fprintf(t.buf, "\t %s %d", traceDoubleQuotedString([]byte(msg.Portal)), msg.MaxRows) +	})  }  func (t *tracer) traceFlush(sender byte, encodedLen int32, msg *Flush) { -	t.beginTrace(sender, encodedLen, "Flush") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "Flush", nil)  }  func (t *tracer) traceFunctionCall(sender byte, encodedLen int32, msg *FunctionCall) { -	t.beginTrace(sender, encodedLen, "FunctionCall") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "FunctionCall", nil)  }  func (t *tracer) traceFunctionCallResponse(sender byte, encodedLen int32, msg *FunctionCallResponse) { -	t.beginTrace(sender, encodedLen, "FunctionCallResponse") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "FunctionCallResponse", nil)  }  func (t *tracer) traceGSSEncRequest(sender byte, encodedLen int32, msg *GSSEncRequest) { -	t.beginTrace(sender, encodedLen, "GSSEncRequest") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "GSSEncRequest", nil)  }  func (t *tracer) traceNoData(sender byte, encodedLen int32, msg *NoData) { -	t.beginTrace(sender, encodedLen, "NoData") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "NoData", nil)  }  func (t *tracer) traceNoticeResponse(sender byte, encodedLen int32, msg *NoticeResponse) { -	t.beginTrace(sender, encodedLen, "NoticeResponse") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "NoticeResponse", nil)  }  func (t *tracer) traceNotificationResponse(sender byte, encodedLen int32, msg *NotificationResponse) { -	t.beginTrace(sender, encodedLen, "NotificationResponse") -	fmt.Fprintf(t.buf, "\t %d %s %s", msg.PID, traceDoubleQuotedString([]byte(msg.Channel)), traceDoubleQuotedString([]byte(msg.Payload))) -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "NotificationResponse", func() { +		fmt.Fprintf(t.buf, "\t %d %s %s", msg.PID, traceDoubleQuotedString([]byte(msg.Channel)), traceDoubleQuotedString([]byte(msg.Payload))) +	})  }  func (t *tracer) traceParameterDescription(sender byte, encodedLen int32, msg *ParameterDescription) { -	t.beginTrace(sender, encodedLen, "ParameterDescription") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "ParameterDescription", nil)  }  func (t *tracer) traceParameterStatus(sender byte, encodedLen int32, msg *ParameterStatus) { -	t.beginTrace(sender, encodedLen, "ParameterStatus") -	fmt.Fprintf(t.buf, "\t %s %s", traceDoubleQuotedString([]byte(msg.Name)), traceDoubleQuotedString([]byte(msg.Value))) -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "ParameterStatus", func() { +		fmt.Fprintf(t.buf, "\t %s %s", traceDoubleQuotedString([]byte(msg.Name)), traceDoubleQuotedString([]byte(msg.Value))) +	})  }  func (t *tracer) traceParse(sender byte, encodedLen int32, msg *Parse) { -	t.beginTrace(sender, encodedLen, "Parse") -	fmt.Fprintf(t.buf, "\t %s %s %d", traceDoubleQuotedString([]byte(msg.Name)), traceDoubleQuotedString([]byte(msg.Query)), len(msg.ParameterOIDs)) -	for _, oid := range msg.ParameterOIDs { -		fmt.Fprintf(t.buf, " %d", oid) -	} -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "Parse", func() { +		fmt.Fprintf(t.buf, "\t %s %s %d", traceDoubleQuotedString([]byte(msg.Name)), traceDoubleQuotedString([]byte(msg.Query)), len(msg.ParameterOIDs)) +		for _, oid := range msg.ParameterOIDs { +			fmt.Fprintf(t.buf, " %d", oid) +		} +	})  }  func (t *tracer) traceParseComplete(sender byte, encodedLen int32, msg *ParseComplete) { -	t.beginTrace(sender, encodedLen, "ParseComplete") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "ParseComplete", nil)  }  func (t *tracer) tracePortalSuspended(sender byte, encodedLen int32, msg *PortalSuspended) { -	t.beginTrace(sender, encodedLen, "PortalSuspended") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "PortalSuspended", nil)  }  func (t *tracer) traceQuery(sender byte, encodedLen int32, msg *Query) { -	t.beginTrace(sender, encodedLen, "Query") -	fmt.Fprintf(t.buf, "\t %s", traceDoubleQuotedString([]byte(msg.String))) -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "Query", func() { +		fmt.Fprintf(t.buf, "\t %s", traceDoubleQuotedString([]byte(msg.String))) +	})  }  func (t *tracer) traceReadyForQuery(sender byte, encodedLen int32, msg *ReadyForQuery) { -	t.beginTrace(sender, encodedLen, "ReadyForQuery") -	fmt.Fprintf(t.buf, "\t %c", msg.TxStatus) -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "ReadyForQuery", func() { +		fmt.Fprintf(t.buf, "\t %c", msg.TxStatus) +	})  }  func (t *tracer) traceRowDescription(sender byte, encodedLen int32, msg *RowDescription) { -	t.beginTrace(sender, encodedLen, "RowDescription") -	fmt.Fprintf(t.buf, "\t %d", len(msg.Fields)) -	for _, fd := range msg.Fields { -		fmt.Fprintf(t.buf, ` %s %d %d %d %d %d %d`, traceDoubleQuotedString(fd.Name), fd.TableOID, fd.TableAttributeNumber, fd.DataTypeOID, fd.DataTypeSize, fd.TypeModifier, fd.Format) -	} -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "RowDescription", func() { +		fmt.Fprintf(t.buf, "\t %d", len(msg.Fields)) +		for _, fd := range msg.Fields { +			fmt.Fprintf(t.buf, ` %s %d %d %d %d %d %d`, traceDoubleQuotedString(fd.Name), fd.TableOID, fd.TableAttributeNumber, fd.DataTypeOID, fd.DataTypeSize, fd.TypeModifier, fd.Format) +		} +	})  }  func (t *tracer) traceSSLRequest(sender byte, encodedLen int32, msg *SSLRequest) { -	t.beginTrace(sender, encodedLen, "SSLRequest") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "SSLRequest", nil)  }  func (t *tracer) traceStartupMessage(sender byte, encodedLen int32, msg *StartupMessage) { -	t.beginTrace(sender, encodedLen, "StartupMessage") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "StartupMessage", nil)  }  func (t *tracer) traceSync(sender byte, encodedLen int32, msg *Sync) { -	t.beginTrace(sender, encodedLen, "Sync") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "Sync", nil)  }  func (t *tracer) traceTerminate(sender byte, encodedLen int32, msg *Terminate) { -	t.beginTrace(sender, encodedLen, "Terminate") -	t.finishTrace() +	t.writeTrace(sender, encodedLen, "Terminate", nil)  } -func (t *tracer) beginTrace(sender byte, encodedLen int32, msgType string) { +func (t *tracer) writeTrace(sender byte, encodedLen int32, msgType string, writeDetails func()) { +	t.mux.Lock() +	defer t.mux.Unlock() +	defer func() { +		if t.buf.Cap() > 1024 { +			t.buf = &bytes.Buffer{} +		} else { +			t.buf.Reset() +		} +	}() +  	if !t.SuppressTimestamps {  		now := time.Now()  		t.buf.WriteString(now.Format("2006-01-02 15:04:05.000000")) @@ -402,17 +382,13 @@ func (t *tracer) beginTrace(sender byte, encodedLen int32, msgType string) {  	t.buf.WriteString(msgType)  	t.buf.WriteByte('\t')  	t.buf.WriteString(strconv.FormatInt(int64(encodedLen), 10)) -} -func (t *tracer) finishTrace() { +	if writeDetails != nil { +		writeDetails() +	} +  	t.buf.WriteByte('\n')  	t.buf.WriteTo(t.w) - -	if t.buf.Cap() > 1024 { -		t.buf = &bytes.Buffer{} -	} else { -		t.buf.Reset() -	}  }  // traceDoubleQuotedString returns t.buf as a double-quoted string without any escaping. It is roughly equivalent to diff --git a/vendor/github.com/jackc/pgx/v5/pgtype/json.go b/vendor/github.com/jackc/pgx/v5/pgtype/json.go index b7a7101ec..d332dd0db 100644 --- a/vendor/github.com/jackc/pgx/v5/pgtype/json.go +++ b/vendor/github.com/jackc/pgx/v5/pgtype/json.go @@ -92,6 +92,23 @@ func (JSONCodec) PlanScan(m *Map, oid uint32, format int16, target any) ScanPlan  	switch target.(type) {  	case *string:  		return scanPlanAnyToString{} + +	case **string: +		// This is to fix **string scanning. It seems wrong to special case **string, but it's not clear what a better +		// solution would be. +		// +		// https://github.com/jackc/pgx/issues/1470 -- **string +		// https://github.com/jackc/pgx/issues/1691 -- ** anything else + +		if wrapperPlan, nextDst, ok := TryPointerPointerScanPlan(target); ok { +			if nextPlan := m.planScan(oid, format, nextDst); nextPlan != nil { +				if _, failed := nextPlan.(*scanPlanFail); !failed { +					wrapperPlan.SetNext(nextPlan) +					return wrapperPlan +				} +			} +		} +  	case *[]byte:  		return scanPlanJSONToByteSlice{}  	case BytesScanner: @@ -104,19 +121,6 @@ func (JSONCodec) PlanScan(m *Map, oid uint32, format int16, target any) ScanPlan  		return &scanPlanSQLScanner{formatCode: format}  	} -	// This is to fix **string scanning. It seems wrong to special case sql.Scanner and pointer to pointer, but it's not -	// clear what a better solution would be. -	// -	// https://github.com/jackc/pgx/issues/1470 -	if wrapperPlan, nextDst, ok := TryPointerPointerScanPlan(target); ok { -		if nextPlan := m.planScan(oid, format, nextDst); nextPlan != nil { -			if _, failed := nextPlan.(*scanPlanFail); !failed { -				wrapperPlan.SetNext(nextPlan) -				return wrapperPlan -			} -		} -	} -  	return scanPlanJSONToJSONUnmarshal{}  } diff --git a/vendor/github.com/jackc/pgx/v5/pgtype/numeric.go b/vendor/github.com/jackc/pgx/v5/pgtype/numeric.go index 62e457873..0e58fd076 100644 --- a/vendor/github.com/jackc/pgx/v5/pgtype/numeric.go +++ b/vendor/github.com/jackc/pgx/v5/pgtype/numeric.go @@ -144,20 +144,20 @@ func (n *Numeric) toBigInt() (*big.Int, error) {  }  func parseNumericString(str string) (n *big.Int, exp int32, err error) { -	parts := strings.SplitN(str, ".", 2) -	digits := strings.Join(parts, "") +	idx := strings.IndexByte(str, '.') -	if len(parts) > 1 { -		exp = int32(-len(parts[1])) -	} else { -		for len(digits) > 1 && digits[len(digits)-1] == '0' && digits[len(digits)-2] != '-' { -			digits = digits[:len(digits)-1] +	if idx == -1 { +		for len(str) > 1 && str[len(str)-1] == '0' && str[len(str)-2] != '-' { +			str = str[:len(str)-1]  			exp++  		} +	} else { +		exp = int32(-(len(str) - idx - 1)) +		str = str[:idx] + str[idx+1:]  	}  	accum := &big.Int{} -	if _, ok := accum.SetString(digits, 10); !ok { +	if _, ok := accum.SetString(str, 10); !ok {  		return nil, 0, fmt.Errorf("%s is not a number", str)  	} diff --git a/vendor/github.com/jackc/pgx/v5/pgtype/pgtype.go b/vendor/github.com/jackc/pgx/v5/pgtype/pgtype.go index 8b636763a..59d833a19 100644 --- a/vendor/github.com/jackc/pgx/v5/pgtype/pgtype.go +++ b/vendor/github.com/jackc/pgx/v5/pgtype/pgtype.go @@ -44,7 +44,7 @@ const (  	MacaddrOID             = 829  	InetOID                = 869  	BoolArrayOID           = 1000 -	QCharArrayOID          = 1003 +	QCharArrayOID          = 1002  	NameArrayOID           = 1003  	Int2ArrayOID           = 1005  	Int4ArrayOID           = 1007 diff --git a/vendor/github.com/jackc/pgx/v5/rows.go b/vendor/github.com/jackc/pgx/v5/rows.go index 055a6645a..1b1c8ac9a 100644 --- a/vendor/github.com/jackc/pgx/v5/rows.go +++ b/vendor/github.com/jackc/pgx/v5/rows.go @@ -306,7 +306,7 @@ func (rows *baseRows) Values() ([]any, error) {  				copy(newBuf, buf)  				values = append(values, newBuf)  			default: -				rows.fatal(errors.New("Unknown format code")) +				rows.fatal(errors.New("unknown format code"))  			}  		} @@ -496,7 +496,8 @@ func (rs *mapRowScanner) ScanRow(rows Rows) error {  }  // RowToStructByPos returns a T scanned from row. T must be a struct. T must have the same number a public fields as row -// has fields. The row and T fields will by matched by position. +// has fields. The row and T fields will by matched by position. If the "db" struct tag is "-" then the field will be +// ignored.  func RowToStructByPos[T any](row CollectableRow) (T, error) {  	var value T  	err := row.Scan(&positionalStructRowScanner{ptrToStruct: &value}) @@ -504,7 +505,8 @@ func RowToStructByPos[T any](row CollectableRow) (T, error) {  }  // RowToAddrOfStructByPos returns the address of a T scanned from row. T must be a struct. T must have the same number a -// public fields as row has fields. The row and T fields will by matched by position. +// public fields as row has fields. The row and T fields will by matched by position. If the "db" struct tag is "-" then +// the field will be ignored.  func RowToAddrOfStructByPos[T any](row CollectableRow) (*T, error) {  	var value T  	err := row.Scan(&positionalStructRowScanner{ptrToStruct: &value}) @@ -545,6 +547,11 @@ func (rs *positionalStructRowScanner) appendScanTargets(dstElemValue reflect.Val  		if sf.Anonymous && sf.Type.Kind() == reflect.Struct {  			scanTargets = rs.appendScanTargets(dstElemValue.Field(i), scanTargets)  		} else if sf.PkgPath == "" { +			dbTag, _ := sf.Tag.Lookup(structTagKey) +			if dbTag == "-" { +				// Field is ignored, skip it. +				continue +			}  			scanTargets = append(scanTargets, dstElemValue.Field(i).Addr().Interface())  		}  	} diff --git a/vendor/github.com/jackc/pgx/v5/tx.go b/vendor/github.com/jackc/pgx/v5/tx.go index 575c17a71..8feeb5123 100644 --- a/vendor/github.com/jackc/pgx/v5/tx.go +++ b/vendor/github.com/jackc/pgx/v5/tx.go @@ -152,7 +152,6 @@ type Tx interface {  // called on the dbTx.  type dbTx struct {  	conn         *Conn -	err          error  	savepointNum int64  	closed       bool  } diff --git a/vendor/modules.txt b/vendor/modules.txt index cb6fb499e..0ce4e52bb 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -338,7 +338,7 @@ github.com/jackc/pgproto3/v2  # github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a  ## explicit; go 1.14  github.com/jackc/pgservicefile -# github.com/jackc/pgx/v5 v5.4.2 +# github.com/jackc/pgx/v5 v5.4.3  ## explicit; go 1.19  github.com/jackc/pgx/v5  github.com/jackc/pgx/v5/internal/anynil  | 
