Skip to content

Commit d59b5b2

Browse files
authored
feat(bigquery): add support for explicit query parameter type (#6596)
Allow users to pass query parameter with an explicit data types instead of relying just on type inference. Resolves #4704
1 parent ad01de9 commit d59b5b2

File tree

4 files changed

+360
-30
lines changed

4 files changed

+360
-30
lines changed

bigquery/integration_test.go

Lines changed: 155 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,6 +1808,7 @@ func TestIntegration_QueryParameters(t *testing.T) {
18081808
dtm := civil.DateTime{Date: d, Time: tm}
18091809
ts := time.Date(2016, 3, 20, 15, 04, 05, 0, time.UTC)
18101810
rat := big.NewRat(13, 10)
1811+
bigRat := big.NewRat(12345, 10e10)
18111812

18121813
type ss struct {
18131814
String string
@@ -1828,73 +1829,73 @@ func TestIntegration_QueryParameters(t *testing.T) {
18281829
}{
18291830
{
18301831
"SELECT @val",
1831-
[]QueryParameter{{"val", 1}},
1832+
[]QueryParameter{{Name: "val", Value: 1}},
18321833
[]Value{int64(1)},
18331834
int64(1),
18341835
},
18351836
{
18361837
"SELECT @val",
1837-
[]QueryParameter{{"val", 1.3}},
1838+
[]QueryParameter{{Name: "val", Value: 1.3}},
18381839
[]Value{1.3},
18391840
1.3,
18401841
},
18411842
{
18421843
"SELECT @val",
1843-
[]QueryParameter{{"val", rat}},
1844+
[]QueryParameter{{Name: "val", Value: rat}},
18441845
[]Value{rat},
18451846
rat,
18461847
},
18471848
{
18481849
"SELECT @val",
1849-
[]QueryParameter{{"val", true}},
1850+
[]QueryParameter{{Name: "val", Value: true}},
18501851
[]Value{true},
18511852
true,
18521853
},
18531854
{
18541855
"SELECT @val",
1855-
[]QueryParameter{{"val", "ABC"}},
1856+
[]QueryParameter{{Name: "val", Value: "ABC"}},
18561857
[]Value{"ABC"},
18571858
"ABC",
18581859
},
18591860
{
18601861
"SELECT @val",
1861-
[]QueryParameter{{"val", []byte("foo")}},
1862+
[]QueryParameter{{Name: "val", Value: []byte("foo")}},
18621863
[]Value{[]byte("foo")},
18631864
[]byte("foo"),
18641865
},
18651866
{
18661867
"SELECT @val",
1867-
[]QueryParameter{{"val", ts}},
1868+
[]QueryParameter{{Name: "val", Value: ts}},
18681869
[]Value{ts},
18691870
ts,
18701871
},
18711872
{
18721873
"SELECT @val",
1873-
[]QueryParameter{{"val", []time.Time{ts, ts}}},
1874+
[]QueryParameter{{Name: "val", Value: []time.Time{ts, ts}}},
18741875
[]Value{[]Value{ts, ts}},
18751876
[]interface{}{ts, ts},
18761877
},
18771878
{
18781879
"SELECT @val",
1879-
[]QueryParameter{{"val", dtm}},
1880+
[]QueryParameter{{Name: "val", Value: dtm}},
18801881
[]Value{civil.DateTime{Date: d, Time: rtm}},
18811882
civil.DateTime{Date: d, Time: rtm},
18821883
},
18831884
{
18841885
"SELECT @val",
1885-
[]QueryParameter{{"val", d}},
1886+
[]QueryParameter{{Name: "val", Value: d}},
18861887
[]Value{d},
18871888
d,
18881889
},
18891890
{
18901891
"SELECT @val",
1891-
[]QueryParameter{{"val", tm}},
1892+
[]QueryParameter{{Name: "val", Value: tm}},
18921893
[]Value{rtm},
18931894
rtm,
18941895
},
18951896
{
18961897
"SELECT @val",
1897-
[]QueryParameter{{"val", s{ts, []string{"a", "b"}, ss{"c"}, []ss{{"d"}, {"e"}}}}},
1898+
[]QueryParameter{{Name: "val", Value: s{ts, []string{"a", "b"}, ss{"c"}, []ss{{"d"}, {"e"}}}}},
18981899
[]Value{[]Value{ts, []Value{"a", "b"}, []Value{"c"}, []Value{[]Value{"d"}, []Value{"e"}}}},
18991900
map[string]interface{}{
19001901
"Timestamp": ts,
@@ -1908,7 +1909,7 @@ func TestIntegration_QueryParameters(t *testing.T) {
19081909
},
19091910
{
19101911
"SELECT @val.Timestamp, @val.SubStruct.String",
1911-
[]QueryParameter{{"val", s{Timestamp: ts, SubStruct: ss{"a"}}}},
1912+
[]QueryParameter{{Name: "val", Value: s{Timestamp: ts, SubStruct: ss{"a"}}}},
19121913
[]Value{ts, "a"},
19131914
map[string]interface{}{
19141915
"Timestamp": ts,
@@ -1917,6 +1918,147 @@ func TestIntegration_QueryParameters(t *testing.T) {
19171918
"SubStructArray": nil,
19181919
},
19191920
},
1921+
{
1922+
"SELECT @val",
1923+
[]QueryParameter{
1924+
{
1925+
Name: "val",
1926+
Value: &QueryParameterValue{
1927+
Type: StandardSQLDataType{
1928+
TypeKind: "BIGNUMERIC",
1929+
},
1930+
Value: BigNumericString(bigRat),
1931+
},
1932+
},
1933+
},
1934+
[]Value{bigRat},
1935+
bigRat,
1936+
},
1937+
{
1938+
"SELECT @val",
1939+
[]QueryParameter{
1940+
{
1941+
Name: "val",
1942+
Value: &QueryParameterValue{
1943+
ArrayValue: []QueryParameterValue{
1944+
{Value: "a"},
1945+
{Value: "b"},
1946+
},
1947+
Type: StandardSQLDataType{
1948+
ArrayElementType: &StandardSQLDataType{
1949+
TypeKind: "STRING",
1950+
},
1951+
},
1952+
},
1953+
},
1954+
},
1955+
[]Value{[]Value{"a", "b"}},
1956+
[]interface{}{"a", "b"},
1957+
},
1958+
{
1959+
"SELECT @val",
1960+
[]QueryParameter{
1961+
{
1962+
Name: "val",
1963+
Value: &QueryParameterValue{
1964+
StructValue: map[string]QueryParameterValue{
1965+
"Timestamp": {
1966+
Value: ts,
1967+
},
1968+
"BigNumericArray": {
1969+
ArrayValue: []QueryParameterValue{
1970+
{Value: BigNumericString(bigRat)},
1971+
{Value: BigNumericString(rat)},
1972+
},
1973+
},
1974+
"ArraySingleValueStruct": {
1975+
ArrayValue: []QueryParameterValue{
1976+
{StructValue: map[string]QueryParameterValue{
1977+
"Number": {
1978+
Value: int64(42),
1979+
},
1980+
}},
1981+
{StructValue: map[string]QueryParameterValue{
1982+
"Number": {
1983+
Value: int64(43),
1984+
},
1985+
}},
1986+
},
1987+
},
1988+
"SubStruct": {
1989+
StructValue: map[string]QueryParameterValue{
1990+
"String": {
1991+
Value: "c",
1992+
},
1993+
},
1994+
},
1995+
},
1996+
Type: StandardSQLDataType{
1997+
StructType: &StandardSQLStructType{
1998+
Fields: []*StandardSQLField{
1999+
{
2000+
Name: "Timestamp",
2001+
Type: &StandardSQLDataType{
2002+
TypeKind: "TIMESTAMP",
2003+
},
2004+
},
2005+
{
2006+
Name: "BigNumericArray",
2007+
Type: &StandardSQLDataType{
2008+
ArrayElementType: &StandardSQLDataType{
2009+
TypeKind: "BIGNUMERIC",
2010+
},
2011+
},
2012+
},
2013+
{
2014+
Name: "ArraySingleValueStruct",
2015+
Type: &StandardSQLDataType{
2016+
ArrayElementType: &StandardSQLDataType{
2017+
StructType: &StandardSQLStructType{
2018+
Fields: []*StandardSQLField{
2019+
{
2020+
Name: "Number",
2021+
Type: &StandardSQLDataType{
2022+
TypeKind: "INT64",
2023+
},
2024+
},
2025+
},
2026+
},
2027+
},
2028+
},
2029+
},
2030+
{
2031+
Name: "SubStruct",
2032+
Type: &StandardSQLDataType{
2033+
StructType: &StandardSQLStructType{
2034+
Fields: []*StandardSQLField{
2035+
{
2036+
Name: "String",
2037+
Type: &StandardSQLDataType{
2038+
TypeKind: "STRING",
2039+
},
2040+
},
2041+
},
2042+
},
2043+
},
2044+
},
2045+
},
2046+
},
2047+
},
2048+
},
2049+
},
2050+
},
2051+
[]Value{[]Value{ts, []Value{bigRat, rat}, []Value{[]Value{int64(42)}, []Value{int64(43)}}, []Value{"c"}}},
2052+
map[string]interface{}{
2053+
"Timestamp": ts,
2054+
"BigNumericArray": []interface{}{bigRat, rat},
2055+
"ArraySingleValueStruct": []interface{}{
2056+
map[string]interface{}{"Number": int64(42)},
2057+
map[string]interface{}{"Number": int64(43)},
2058+
},
2059+
"SubStruct": map[string]interface{}{"String": "c"},
2060+
},
2061+
},
19202062
}
19212063
for _, c := range testCases {
19222064
q := client.Query(c.query)

0 commit comments

Comments
 (0)