2
0

Add explicit enum support

This commit is contained in:
Jack Christensen
2020-05-05 13:31:32 -05:00
parent 71fb93a96c
commit f9ce8af5c9
4 changed files with 121 additions and 10 deletions
+100
View File
@@ -14,6 +14,7 @@ import (
"github.com/jackc/pgconn/stmtcache"
"github.com/jackc/pgtype"
"github.com/jackc/pgx/v4"
"github.com/stretchr/testify/require"
)
func BenchmarkMinimalUnpreparedSelectWithoutStatementCache(b *testing.B) {
@@ -849,3 +850,102 @@ func benchmarkMultipleQueriesBatch(b *testing.B, conn *pgx.Conn, queryCount int)
}
}
}
func BenchmarkSelectManyUnknownEnum(b *testing.B) {
conn := mustConnectString(b, os.Getenv("PGX_TEST_DATABASE"))
defer closeConn(b, conn)
ctx := context.Background()
tx, err := conn.Begin(ctx)
require.NoError(b, err)
defer tx.Rollback(ctx)
_, err = tx.Exec(context.Background(), "drop type if exists color;")
require.NoError(b, err)
_, err = tx.Exec(ctx, `create type color as enum ('blue', 'green', 'orange')`)
require.NoError(b, err)
b.ResetTimer()
var x, y, z string
for i := 0; i < b.N; i++ {
rows, err := conn.Query(ctx, "select 'blue'::color, 'green'::color, 'orange'::color from generate_series(1,10)")
if err != nil {
b.Fatal(err)
}
for rows.Next() {
err = rows.Scan(&x, &y, &z)
if err != nil {
b.Fatal(err)
}
if x != "blue" {
b.Fatal("unexpected result")
}
if y != "green" {
b.Fatal("unexpected result")
}
if z != "orange" {
b.Fatal("unexpected result")
}
}
if rows.Err() != nil {
b.Fatal(rows.Err())
}
}
}
func BenchmarkSelectManyRegisteredEnum(b *testing.B) {
conn := mustConnectString(b, os.Getenv("PGX_TEST_DATABASE"))
defer closeConn(b, conn)
ctx := context.Background()
tx, err := conn.Begin(ctx)
require.NoError(b, err)
defer tx.Rollback(ctx)
_, err = tx.Exec(context.Background(), "drop type if exists color;")
require.NoError(b, err)
_, err = tx.Exec(ctx, `create type color as enum ('blue', 'green', 'orange')`)
require.NoError(b, err)
var oid uint32
err = conn.QueryRow(context.Background(), "select oid from pg_type where typname=$1;", "color").Scan(&oid)
require.NoError(b, err)
et := pgtype.NewEnumType("color", []string{"blue", "green", "orange"})
conn.ConnInfo().RegisterDataType(pgtype.DataType{Value: et, Name: "color", OID: oid})
b.ResetTimer()
var x, y, z string
for i := 0; i < b.N; i++ {
rows, err := conn.Query(ctx, "select 'blue'::color, 'green'::color, 'orange'::color from generate_series(1,10)")
if err != nil {
b.Fatal(err)
}
for rows.Next() {
err = rows.Scan(&x, &y, &z)
if err != nil {
b.Fatal(err)
}
if x != "blue" {
b.Fatal("unexpected result")
}
if y != "green" {
b.Fatal("unexpected result")
}
if z != "orange" {
b.Fatal("unexpected result")
}
}
if rows.Err() != nil {
b.Fatal(rows.Err())
}
}
}