summaryrefslogtreecommitdiff
path: root/vendor/github.com/jackc/pgx/v5/extended_query_builder.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/jackc/pgx/v5/extended_query_builder.go')
-rw-r--r--vendor/github.com/jackc/pgx/v5/extended_query_builder.go88
1 files changed, 8 insertions, 80 deletions
diff --git a/vendor/github.com/jackc/pgx/v5/extended_query_builder.go b/vendor/github.com/jackc/pgx/v5/extended_query_builder.go
index 9c9de5b2c..526b0e953 100644
--- a/vendor/github.com/jackc/pgx/v5/extended_query_builder.go
+++ b/vendor/github.com/jackc/pgx/v5/extended_query_builder.go
@@ -1,10 +1,8 @@
package pgx
import (
- "database/sql/driver"
"fmt"
- "github.com/jackc/pgx/v5/internal/anynil"
"github.com/jackc/pgx/v5/pgconn"
"github.com/jackc/pgx/v5/pgtype"
)
@@ -23,10 +21,15 @@ type ExtendedQueryBuilder struct {
func (eqb *ExtendedQueryBuilder) Build(m *pgtype.Map, sd *pgconn.StatementDescription, args []any) error {
eqb.reset()
- anynil.NormalizeSlice(args)
-
if sd == nil {
- return eqb.appendParamsForQueryExecModeExec(m, args)
+ for i := range args {
+ err := eqb.appendParam(m, 0, pgtype.TextFormatCode, args[i])
+ if err != nil {
+ err = fmt.Errorf("failed to encode args[%d]: %w", i, err)
+ return err
+ }
+ }
+ return nil
}
if len(sd.ParamOIDs) != len(args) {
@@ -113,10 +116,6 @@ func (eqb *ExtendedQueryBuilder) reset() {
}
func (eqb *ExtendedQueryBuilder) encodeExtendedParamValue(m *pgtype.Map, oid uint32, formatCode int16, arg any) ([]byte, error) {
- if anynil.Is(arg) {
- return nil, nil
- }
-
if eqb.paramValueBytes == nil {
eqb.paramValueBytes = make([]byte, 0, 128)
}
@@ -145,74 +144,3 @@ func (eqb *ExtendedQueryBuilder) chooseParameterFormatCode(m *pgtype.Map, oid ui
return m.FormatCodeForOID(oid)
}
-
-// appendParamsForQueryExecModeExec appends the args to eqb.
-//
-// Parameters must be encoded in the text format because of differences in type conversion between timestamps and
-// dates. In QueryExecModeExec we don't know what the actual PostgreSQL type is. To determine the type we use the
-// Go type to OID type mapping registered by RegisterDefaultPgType. However, the Go time.Time represents both
-// PostgreSQL timestamp[tz] and date. To use the binary format we would need to also specify what the PostgreSQL
-// type OID is. But that would mean telling PostgreSQL that we have sent a timestamp[tz] when what is needed is a date.
-// This means that the value is converted from text to timestamp[tz] to date. This means it does a time zone conversion
-// before converting it to date. This means that dates can be shifted by one day. In text format without that double
-// type conversion it takes the date directly and ignores time zone (i.e. it works).
-//
-// Given that the whole point of QueryExecModeExec is to operate without having to know the PostgreSQL types there is
-// no way to safely use binary or to specify the parameter OIDs.
-func (eqb *ExtendedQueryBuilder) appendParamsForQueryExecModeExec(m *pgtype.Map, args []any) error {
- for _, arg := range args {
- if arg == nil {
- err := eqb.appendParam(m, 0, TextFormatCode, arg)
- if err != nil {
- return err
- }
- } else {
- dt, ok := m.TypeForValue(arg)
- if !ok {
- var tv pgtype.TextValuer
- if tv, ok = arg.(pgtype.TextValuer); ok {
- t, err := tv.TextValue()
- if err != nil {
- return err
- }
-
- dt, ok = m.TypeForOID(pgtype.TextOID)
- if ok {
- arg = t
- }
- }
- }
- if !ok {
- var dv driver.Valuer
- if dv, ok = arg.(driver.Valuer); ok {
- v, err := dv.Value()
- if err != nil {
- return err
- }
- dt, ok = m.TypeForValue(v)
- if ok {
- arg = v
- }
- }
- }
- if !ok {
- var str fmt.Stringer
- if str, ok = arg.(fmt.Stringer); ok {
- dt, ok = m.TypeForOID(pgtype.TextOID)
- if ok {
- arg = str.String()
- }
- }
- }
- if !ok {
- return &unknownArgumentTypeQueryExecModeExecError{arg: arg}
- }
- err := eqb.appendParam(m, dt.OID, TextFormatCode, arg)
- if err != nil {
- return err
- }
- }
- }
-
- return nil
-}