mirror of
https://github.com/jackc/pgx.git
synced 2025-05-31 11:42:24 +00:00
SelectValue(s) require exactly one column
This commit is contained in:
parent
3acfffc142
commit
6339e54be4
@ -37,6 +37,15 @@ func (e NotSingleRowError) Error() string {
|
|||||||
return fmt.Sprintf("Expected to find 1 row exactly, instead found %d", e.RowCount)
|
return fmt.Sprintf("Expected to find 1 row exactly, instead found %d", e.RowCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type UnexpectedColumnCountError struct {
|
||||||
|
ExpectedCount int16
|
||||||
|
ActualCount int16
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e UnexpectedColumnCountError) Error() string {
|
||||||
|
return fmt.Sprintf("Expected result to have %d column(s), instead it has %d", e.ExpectedCount, e.ActualCount)
|
||||||
|
}
|
||||||
|
|
||||||
func Connect(parameters ConnectionParameters) (c *Connection, err error) {
|
func Connect(parameters ConnectionParameters) (c *Connection, err error) {
|
||||||
c = new(Connection)
|
c = new(Connection)
|
||||||
|
|
||||||
@ -165,11 +174,16 @@ func (c *Connection) SelectRow(sql string) (row map[string]interface{}, err erro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns a UnexpectedColumnCountError if exactly one column is not found
|
||||||
// Returns a NotSingleRowError if exactly one row is not found
|
// Returns a NotSingleRowError if exactly one row is not found
|
||||||
func (c *Connection) SelectValue(sql string) (v interface{}, err error) {
|
func (c *Connection) SelectValue(sql string) (v interface{}, err error) {
|
||||||
var numRowsFound int64
|
var numRowsFound int64
|
||||||
|
|
||||||
onDataRow := func(r *DataRowReader) error {
|
onDataRow := func(r *DataRowReader) error {
|
||||||
|
if len(r.fields) != 1 {
|
||||||
|
return UnexpectedColumnCountError{ExpectedCount: 1, ActualCount: int16(len(r.fields))}
|
||||||
|
}
|
||||||
|
|
||||||
numRowsFound++
|
numRowsFound++
|
||||||
v = r.ReadValue()
|
v = r.ReadValue()
|
||||||
return nil
|
return nil
|
||||||
@ -183,9 +197,14 @@ func (c *Connection) SelectValue(sql string) (v interface{}, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns a UnexpectedColumnCountError if exactly one column is not found
|
||||||
func (c *Connection) SelectValues(sql string) (values []interface{}, err error) {
|
func (c *Connection) SelectValues(sql string) (values []interface{}, err error) {
|
||||||
values = make([]interface{}, 0, 8)
|
values = make([]interface{}, 0, 8)
|
||||||
onDataRow := func(r *DataRowReader) error {
|
onDataRow := func(r *DataRowReader) error {
|
||||||
|
if len(r.fields) != 1 {
|
||||||
|
return UnexpectedColumnCountError{ExpectedCount: 1, ActualCount: int16(len(r.fields))}
|
||||||
|
}
|
||||||
|
|
||||||
values = append(values, r.ReadValue())
|
values = append(values, r.ReadValue())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -236,6 +236,11 @@ func TestConnectionSelectValue(t *testing.T) {
|
|||||||
if _, ok := err.(NotSingleRowError); !ok {
|
if _, ok := err.(NotSingleRowError); !ok {
|
||||||
t.Error("Multiple matching rows should have returned NotSingleRowError")
|
t.Error("Multiple matching rows should have returned NotSingleRowError")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err = conn.SelectValue("select 'Matthew', 'Mark'")
|
||||||
|
if _, ok := err.(UnexpectedColumnCountError); !ok {
|
||||||
|
t.Error("Multiple columns should have returned UnexpectedColumnCountError")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSelectValues(t *testing.T) {
|
func TestSelectValues(t *testing.T) {
|
||||||
@ -262,4 +267,9 @@ func TestSelectValues(t *testing.T) {
|
|||||||
test("select * from (values ('Matthew'), ('Mark'), ('Luke'), ('John')) t", []interface{}{"Matthew", "Mark", "Luke", "John"})
|
test("select * from (values ('Matthew'), ('Mark'), ('Luke'), ('John')) t", []interface{}{"Matthew", "Mark", "Luke", "John"})
|
||||||
test("select * from (values ('Matthew'), (null)) t", []interface{}{"Matthew", nil})
|
test("select * from (values ('Matthew'), (null)) t", []interface{}{"Matthew", nil})
|
||||||
test("select * from (values (1::int4), (2::int4), (null), (3::int4)) t", []interface{}{int32(1), int32(2), nil, int32(3)})
|
test("select * from (values (1::int4), (2::int4), (null), (3::int4)) t", []interface{}{int32(1), int32(2), nil, int32(3)})
|
||||||
|
|
||||||
|
_, err := conn.SelectValues("select 'Matthew', 'Mark'")
|
||||||
|
if _, ok := err.(UnexpectedColumnCountError); !ok {
|
||||||
|
t.Error("Multiple columns should have returned UnexpectedColumnCountError")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user