Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SNOW-1669514: uuid.UUID Valuer Interface No Longer Honored #1209

Open
AdamDrewsTR opened this issue Sep 17, 2024 · 15 comments
Open

SNOW-1669514: uuid.UUID Valuer Interface No Longer Honored #1209

AdamDrewsTR opened this issue Sep 17, 2024 · 15 comments
Assignees
Labels
bug Erroneous or unexpected behaviour status-fixed_awaiting_release The issue has been fixed, its PR merged, and now awaiting the next release cycle of the connector. status-triage_done Initial triage done, will be further handled by the driver team

Comments

@AdamDrewsTR
Copy link

Please answer these questions before submitting your issue.
In order to accurately debug the issue this information is required. Thanks!

  1. What version of GO driver are you using?
    1.11.1

  2. What operating system and processor architecture are you using?
    Mac, Linux x64 amd and m1

  3. What version of GO are you using?
    1.22.7

4.Server version:* E.g. 1.90.1
8.34.0

  1. What did you do?
    Updated from 10.1 to 11.1.

  2. What did you expect to see?
    Values updated when using an in clause containing a struct that IS a string. We also had to implement a custom serializer to convert UUIDs to strings prior to making their way to sql. It seems like String() isn't honored anymore on struct?

Binding array of structs in a query's IN clause should return results. It seems like something is getting double escaped somewhere. We are using google's UUIDs which would resolve as an driver.Value of array b/c it's driver value is a string. This results in it flowing throug converter.arrayToString:
[SAM CLI:59345] time="2024-09-17T21:03:11Z" level=debug msg="TYPE: uuid.UUID, 51d3526b-bf57-46bb-8258-1344e6e8d910" func="gosnowflake.(*defaultLogger).Debugf" file="log.go:176"

When I run the UUID through arrayToString I get a bingingValue of json, and the value is a quoted string:
{0x1400022b640 json }
"49dbf3b3-7a72-42f2-9183-d6e24d00f292"

Is this then getting double escaped somewhere because it thinks the string is json?

What should have happened and what happened instead?
Queries find the value by string.

  1. Can you set logging to DEBUG and collect the logs?
    [SAM CLI:59345] time="2024-09-17T21:03:11Z" level=info msg="Exec: "UPDATE \"some_table\" SET \"is_read\"=? WHERE \"id\" IN (?) AND \"some_table\".\"deleted_at\" IS NULL AND \"user_id\" = ?", [{ 1 true} { 2 51d3526b-bf57-46bb-8258-1344e6e8d910} { 3 _USERID}]" func="gosnowflake.(*snowflakeConn).ExecContext" file="connection.go:312"

  2. What is your Snowflake account identifier, if any? (Optional)

@AdamDrewsTR AdamDrewsTR added the bug Erroneous or unexpected behaviour label Sep 17, 2024
@github-actions github-actions bot changed the title Struct Strings In Queries/Updates/Etc SNOW-1669514: Struct Strings In Queries/Updates/Etc Sep 17, 2024
@AdamDrewsTR
Copy link
Author

AdamDrewsTR commented Sep 17, 2024

It treats a UUID as an array, which makes sense. It is an alias for an array of bytes that can be written as a string:
https://go.dev/play/p/D8KVUFx1M_z

@AdamDrewsTR AdamDrewsTR changed the title SNOW-1669514: Struct Strings In Queries/Updates/Etc SNOW-1669514: UUID Strings In Queries/Updates/Etc Sep 17, 2024
@sfc-gh-dszmolka sfc-gh-dszmolka self-assigned this Sep 18, 2024
@sfc-gh-dszmolka sfc-gh-dszmolka added status-triage Issue is under initial triage status-information_needed Additional information is required from the reporter labels Sep 18, 2024
@sfc-gh-dszmolka
Copy link
Contributor

hi - thanks for filing this issue with us. do i gather correctly this issue doesn't happen when you use v1.10.1 of the driver, only after upgrading to v1.11.1 ?
if so, do you think you could provide a reproduce program or even a code snippet which is representative of what you're doing , for us to try and reproduce ?

thank you in advance if that's possible

@sfc-gh-dszmolka
Copy link
Contributor

in the meantime, i found your account and query details, and i indeed see that with v1.10.1 of the driver, the binding was sent like {"type":"TEXT","value":"45cc10be-1417-47c2-8814-f3d82940131c"}, and after v1.11.1 , it's send as {"type":"TEXT","value":"\"51d3526b-bf57-46bb-8258-1344e6e8d910\"","fmt":"json"}

i tried to guess how exactly you're approaching the generation of the bind data and passing it to Snowflake, and using this simplistic attempt to repro:

# cat main.go 
package main

import ( 
	//uuid "github.com/google/uuid"
	"context"
	"database/sql"
	"fmt"
	"log"

	sf "github.com/snowflakedb/gosnowflake"
)

type myUuid struct {
    uuid string
}

func newUuid(inUuid string) *myUuid {
    n := myUuid{uuid: inUuid}
    return &n
}

func main() {
	u := "cc95f80a-cf6a-45c2-91ea-a053aa29592f"
    	res := newUuid(u)
	cfg, err := sf.GetConfigFromEnv([]*sf.ConfigParam{
		{Name: "Account", EnvName: "SNOWFLAKE_TEST_ACCOUNT", FailOnMissing: true},
		{Name: "User", EnvName: "SNOWFLAKE_TEST_USER", FailOnMissing: true},
		{Name: "Password", EnvName: "SNOWFLAKE_TEST_PASSWORD", FailOnMissing: true},
	})
	cfg.Tracing = "TRACE"
	cfg.InsecureMode = true
	if err != nil {
		log.Fatalf("failed to create Config, err: %v", err)
	}

	dsn, err := sf.DSN(cfg)
	if err != nil {
		log.Fatalf("failed to create DSN from Config: %v, err: %v", cfg, err)
	}

	db, err := sql.Open("snowflake", dsn)
	if err != nil {
		log.Fatalf("failed to connect. %v, err: %v", dsn, err)
	}
	defer db.Close()

	ctx := context.Background()
	conn, err := db.Conn(ctx)
	if err != nil {
		log.Fatalf("Failed to acquire connection. err: %v", err)
	}
	defer conn.Close()

	query := "update test_db.go.issue1209 set is_read = ? where id in (?); "
	_, err = conn.ExecContext(ctx, query, false, sf.Array(res))
	if err != nil {
		log.Fatalf("failed to run a query. %v, err: %v", query, err)
	}

	fmt.Printf("Congrats! You have successfully run %v with Snowflake DB!\n", query)
}

but since it ends up with

2024/09/19 08:12:48 failed to run a query. update test_db.go.issue1209 set is_read = ? where id in (?); , err: sql: converting argument $2 type: unsupported type main.myUuid, a struct

i'm obviously missing at least one, possibly more steps.

So it would be highly helpful if you could share how you're generating and passing the input data into the bindings and how you use the struct here. Thank you in advance !

@AdamDrewsTR
Copy link
Author

AdamDrewsTR commented Sep 19, 2024

@sfc-gh-dszmolka It is more like below where the google uuid.UUID is the struct type, and the column is declared as a varchar in Snowflake. When binding, the raw uuid.UUID values were passed in. Previously those uuid.UUIDs had been converted to strings, but with the recent changes they are treated like arrays. There is this line in the logs that is comming from arrayToString: DEBU[0001]log.go:176 gosnowflake.(*defaultLogger).Debugf TYPE: uuid.UUID, 31c9364b-cbef-4054-80b2-985cb0fa5d45.

type myUuid struct {
	id uuid.UUID
}

query := "update TESTING_TABLE set is_read = ? where id = ?; "
theId, _ := uuid.Parse("31c9364b-cbef-4054-80b2-985cb0fa5d45")

_, err = conn.ExecContext(ctx, query, true, theId)
if err != nil {
log.Fatalf("failed to run a query. %v, err: %v", query, err)
}

Output:

INFO[0000]driver.go:38 gosnowflake.SnowflakeDriver.OpenWithConfig OpenWithConfig                               
INFO[0000]log.go:182 gosnowflake.(*defaultLogger).Infof Trying to initialize Easy Logging            
DEBU[0000]log.go:176 gosnowflake.(*defaultLogger).Debugf No client config found in directory: /var/folders/57/3wg0hdrn19g4r32_pyr6rqmc0000gq/T/go-build1336869291/b001/exe 
DEBU[0000]log.go:176 gosnowflake.(*defaultLogger).Debugf No client config found in directory: /Users/adam 
INFO[0000]log.go:244 gosnowflake.(*defaultLogger).Info No client config file found in default directories 
INFO[0000]log.go:244 gosnowflake.(*defaultLogger).Info Easy Logging is disabled as no config has been found 
INFO[0000]driver.go:47 gosnowflake.SnowflakeDriver.OpenWithConfig Connecting to GLOBAL Snowflake domain        
INFO[0000]auth.go:540 gosnowflake.authenticateWithConfig Authenticating via SNOWFLAKE                 
INFO[0000]auth.go:356 gosnowflake.authenticate PARAMS for Auth: &map[databaseName:[DB_QA] roleName:[DBROLE] schemaName:{SNIP}
INFO[0000]retry.go:299 gosnowflake.(*retryHTTP).execute retryHTTP.totalTimeout: 30s                  
DEBU[0000]retry.go:309 gosnowflake.(*retryHTTP).execute retry count: 0                               
INFO[0000]auth.go:446 gosnowflake.createRequestBody Username and password                        
INFO[0001]auth.go:383 gosnowflake.authenticate Authentication SUCCESS                       
INFO[0001]connection_util.go:164 gosnowflake.(*snowflakeConn).populateSessionParameters params: []gosnowflake.nameValueParameter{gosnowflake.nameValueParameter{Name:"TIMESTAMP_OUTPUT_FORMAT", Value:"YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM"}, gosnowflake.nameValueParameter{Name:"CLIENT_PREFETCH_THREADS", Value:4}, gosnowflake.nameValueParameter{Name:"TIME_OUTPUT_FORMAT", Value:"HH24:MI:SS"}, gosnowflake.nameValueParameter{Name:"TIMESTAMP_TZ_OUTPUT_FORMAT", Value:""}, gosnowflake.nameValueParameter{Name:"CLIENT_RESULT_CHUNK_SIZE", Value:160}, gosnowflake.nameValueParameter{Name:"CLIENT_SESSION_KEEP_ALIVE", Value:false}, gosnowflake.nameValueParameter{Name:"QUERY_CONTEXT_CACHE_SIZE", Value:5}, gosnowflake.nameValueParameter{Name:"CLIENT_METADATA_USE_SESSION_DATABASE", Value:false}, gosnowflake.nameValueParameter{Name:"CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED", Value:false}, gosnowflake.nameValueParameter{Name:"ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1", Value:false}, gosnowflake.nameValueParameter{Name:"TIMESTAMP_NTZ_OUTPUT_FORMAT", Value:"YYYY-MM-DD HH24:MI:SS.FF3"}, gosnowflake.nameValueParameter{Name:"CLIENT_RESULT_PREFETCH_THREADS", Value:1}, gosnowflake.nameValueParameter{Name:"CLIENT_METADATA_REQUEST_USE_CONNECTION_CTX", Value:false}, gosnowflake.nameValueParameter{Name:"CLIENT_HONOR_CLIENT_TZ_FOR_TIMESTAMP_NTZ", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_MEMORY_LIMIT", Value:1536}, gosnowflake.nameValueParameter{Name:"CLIENT_TIMESTAMP_TYPE_MAPPING", Value:"TIMESTAMP_LTZ"}, gosnowflake.nameValueParameter{Name:"TIMEZONE", Value:"America/Los_Angeles"}, gosnowflake.nameValueParameter{Name:"CLIENT_RESULT_PREFETCH_SLOTS", Value:2}, gosnowflake.nameValueParameter{Name:"CLIENT_TELEMETRY_ENABLED", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_USE_V1_QUERY_API", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_DISABLE_INCIDENTS", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_RESULT_COLUMN_CASE_INSENSITIVE", Value:false}, gosnowflake.nameValueParameter{Name:"CSV_TIMESTAMP_FORMAT", Value:""}, gosnowflake.nameValueParameter{Name:"BINARY_OUTPUT_FORMAT", Value:"HEX"}, gosnowflake.nameValueParameter{Name:"CLIENT_ENABLE_LOG_INFO_STATEMENT_PARAMETERS", Value:false}, gosnowflake.nameValueParameter{Name:"CLIENT_TELEMETRY_SESSIONLESS_ENABLED", Value:true}, gosnowflake.nameValueParameter{Name:"DATE_OUTPUT_FORMAT", Value:"YYYY-MM-DD"}, gosnowflake.nameValueParameter{Name:"CLIENT_CONSENT_CACHE_ID_TOKEN", Value:false}, gosnowflake.nameValueParameter{Name:"CLIENT_FORCE_PROTECT_ID_TOKEN", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_STAGE_ARRAY_BINDING_THRESHOLD", Value:65280}, gosnowflake.nameValueParameter{Name:"CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY", Value:3600}, gosnowflake.nameValueParameter{Name:"AUTOCOMMIT", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_SESSION_CLONE", Value:false}, gosnowflake.nameValueParameter{Name:"TIMESTAMP_LTZ_OUTPUT_FORMAT", Value:""}} 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIMESTAMP_OUTPUT_FORMAT, value: YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_PREFETCH_THREADS, value: 4 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIME_OUTPUT_FORMAT, value: HH24:MI:SS 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIMESTAMP_TZ_OUTPUT_FORMAT, value:  
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_RESULT_CHUNK_SIZE, value: 160 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_SESSION_KEEP_ALIVE, value: false 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: QUERY_CONTEXT_CACHE_SIZE, value: 5 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_METADATA_USE_SESSION_DATABASE, value: false 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED, value: false 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1, value: false 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIMESTAMP_NTZ_OUTPUT_FORMAT, value: YYYY-MM-DD HH24:MI:SS.FF3 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_RESULT_PREFETCH_THREADS, value: 1 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_METADATA_REQUEST_USE_CONNECTION_CTX, value: false 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_HONOR_CLIENT_TZ_FOR_TIMESTAMP_NTZ, value: true 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_MEMORY_LIMIT, value: 1536 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_TIMESTAMP_TYPE_MAPPING, value: TIMESTAMP_LTZ 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIMEZONE, value: America/Los_Angeles 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_RESULT_PREFETCH_SLOTS, value: 2 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_TELEMETRY_ENABLED, value: true 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_USE_V1_QUERY_API, value: true 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_DISABLE_INCIDENTS, value: true 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_RESULT_COLUMN_CASE_INSENSITIVE, value: false 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CSV_TIMESTAMP_FORMAT, value:  
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: BINARY_OUTPUT_FORMAT, value: HEX 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_ENABLE_LOG_INFO_STATEMENT_PARAMETERS, value: false 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_TELEMETRY_SESSIONLESS_ENABLED, value: true 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: DATE_OUTPUT_FORMAT, value: YYYY-MM-DD 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_CONSENT_CACHE_ID_TOKEN, value: false 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_FORCE_PROTECT_ID_TOKEN, value: true 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_STAGE_ARRAY_BINDING_THRESHOLD, value: 65280 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY, value: 3600 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: AUTOCOMMIT, value: true     
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_SESSION_CLONE, value: false 
DEBU[0001]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIMESTAMP_LTZ_OUTPUT_FORMAT, value:  
DEBU[0001]log.go:176 gosnowflake.(*defaultLogger).Debugf sending 1 logs to telemetry. inband telemetry payload being sent: {"logs":[{"timestamp":1726755900128,"message":{"DriverType":"Go","DriverVersion":"1.11.1","GolangVersion":"go1.22.2","autocommit":"true","binary_output_format":"HEX","client_consent_cache_id_token":"false","client_disable_incidents":"true","client_enable_log_info_statement_parameters":"false","client_force_protect_id_token":"true","client_honor_client_tz_for_timestamp_ntz":"true","client_memory_limit":"1536","client_metadata_request_use_connection_ctx":"false","client_metadata_use_session_database":"false","client_out_of_band_telemetry_enabled":"false","client_prefetch_threads":"4","client_result_chunk_size":"160","client_result_column_case_insensitive":"false","client_result_prefetch_slots":"2","client_result_prefetch_threads":"1","client_session_clone":"false","client_session_keep_alive":"false","client_session_keep_alive_heartbeat_frequency":"3600","client_stage_array_binding_threshold":"65280","client_telemetry_enabled":"true","client_telemetry_sessionless_enabled":"true","client_timestamp_type_mapping":"TIMESTAMP_LTZ","client_use_v1_query_api":"true","csv_timestamp_format":"","date_output_format":"YYYY-MM-DD","enable_stage_s3_privatelink_for_us_east_1":"false","query_context_cache_size":"5","source":"golang_driver","time_output_format":"HH24:MI:SS","timestamp_ltz_output_format":"","timestamp_ntz_output_format":"YYYY-MM-DD HH24:MI:SS.FF3","timestamp_output_format":"YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM","timestamp_tz_output_format":"","timezone":"America/Los_Angeles","type":"client_connection_parameters"}}]} 
INFO[0001]retry.go:299 gosnowflake.(*retryHTTP).execute retryHTTP.totalTimeout: 10s                  
DEBU[0001]retry.go:309 gosnowflake.(*retryHTTP).execute retry count: 0                               
DEBU[0001]log.go:238 gosnowflake.(*defaultLogger).Debug successfully uploaded metrics to telemetry   
INFO[0001]connection.go:312 gosnowflake.(*snowflakeConn).ExecContext Exec: "update TESTING_TABLE set is_read = ? where id = ?; ", [{ 1 true} { 2 31c9364b-cbef-4054-80b2-985cb0fa5d45}] 
DEBU[0001]log.go:176 gosnowflake.(*defaultLogger).Debugf empty qcc                                    
INFO[0001]connection.go:117 gosnowflake.(*snowflakeConn).exec parameters: map[]                            
DEBU[0001]log.go:176 gosnowflake.(*defaultLogger).Debugf TYPE: bool, true                             
DEBU[0001]log.go:176 gosnowflake.(*defaultLogger).Debugf TYPE: uuid.UUID, 31c9364b-cbef-4054-80b2-985cb0fa5d45 
INFO[0001]connection.go:126 gosnowflake.(*snowflakeConn).exec bindings: map[1:{BOOLEAN 0x14000e81f60  <nil>} 2:{TEXT 0x14000dc4090 json <nil>}] 
INFO[0001]restful.go:236 gosnowflake.postRestfulQueryHelper params: &map[]                               
INFO[0001]retry.go:299 gosnowflake.(*retryHTTP).execute retryHTTP.totalTimeout: 0s                   
DEBU[0001]retry.go:309 gosnowflake.(*retryHTTP).execute retry count: 0                               
INFO[0002]restful.go:253 gosnowflake.postRestfulQueryHelper postQuery: resp: &{200 OK 200 HTTP/1.1 1 1 map[Cache-Control:[no-cache, no-store] Connection:[keep-alive] Content-Type:[application/json] Date:[Thu, 19 Sep 2024 14:25:01 GMT] Expect-Ct:[enforce, max-age=3600] Strict-Transport-Security:[max-age=31536000] Vary:[Accept-Encoding, User-Agent] X-Content-Type-Options:[nosniff] X-Country:[United States] X-Frame-Options:[deny] X-Xss-Protection:[1; mode=block]] 0x140006a4820 -1 [] false true map[] 0x14000ea7200 0x140012f60b0} 
INFO[0002]connection.go:156 gosnowflake.(*snowflakeConn).exec Success: true, Code: -1                      
DEBU[0002]log.go:176 gosnowflake.(*defaultLogger).Debugf adding query context: {0 1726755901299437 0 } 
INFO[0002]connection.go:190 gosnowflake.(*snowflakeConn).exec Exec/Query SUCCESS                           
INFO[0002]connection_util.go:164 gosnowflake.(*snowflakeConn).populateSessionParameters params: []gosnowflake.nameValueParameter{gosnowflake.nameValueParameter{Name:"TIMESTAMP_OUTPUT_FORMAT", Value:"YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM"}, gosnowflake.nameValueParameter{Name:"CLIENT_PREFETCH_THREADS", Value:4}, gosnowflake.nameValueParameter{Name:"TIME_OUTPUT_FORMAT", Value:"HH24:MI:SS"}, gosnowflake.nameValueParameter{Name:"TIMESTAMP_TZ_OUTPUT_FORMAT", Value:""}, gosnowflake.nameValueParameter{Name:"CLIENT_RESULT_CHUNK_SIZE", Value:160}, gosnowflake.nameValueParameter{Name:"CLIENT_SESSION_KEEP_ALIVE", Value:false}, gosnowflake.nameValueParameter{Name:"QUERY_CONTEXT_CACHE_SIZE", Value:5}, gosnowflake.nameValueParameter{Name:"CLIENT_METADATA_USE_SESSION_DATABASE", Value:false}, gosnowflake.nameValueParameter{Name:"CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED", Value:false}, gosnowflake.nameValueParameter{Name:"ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1", Value:false}, gosnowflake.nameValueParameter{Name:"TIMESTAMP_NTZ_OUTPUT_FORMAT", Value:"YYYY-MM-DD HH24:MI:SS.FF3"}, gosnowflake.nameValueParameter{Name:"CLIENT_RESULT_PREFETCH_THREADS", Value:1}, gosnowflake.nameValueParameter{Name:"CLIENT_METADATA_REQUEST_USE_CONNECTION_CTX", Value:false}, gosnowflake.nameValueParameter{Name:"CLIENT_HONOR_CLIENT_TZ_FOR_TIMESTAMP_NTZ", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_MEMORY_LIMIT", Value:1536}, gosnowflake.nameValueParameter{Name:"CLIENT_TIMESTAMP_TYPE_MAPPING", Value:"TIMESTAMP_LTZ"}, gosnowflake.nameValueParameter{Name:"TIMEZONE", Value:"America/Los_Angeles"}, gosnowflake.nameValueParameter{Name:"CLIENT_RESULT_PREFETCH_SLOTS", Value:2}, gosnowflake.nameValueParameter{Name:"CLIENT_TELEMETRY_ENABLED", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_USE_V1_QUERY_API", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_DISABLE_INCIDENTS", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_RESULT_COLUMN_CASE_INSENSITIVE", Value:false}, gosnowflake.nameValueParameter{Name:"CSV_TIMESTAMP_FORMAT", Value:""}, gosnowflake.nameValueParameter{Name:"BINARY_OUTPUT_FORMAT", Value:"HEX"}, gosnowflake.nameValueParameter{Name:"CLIENT_ENABLE_LOG_INFO_STATEMENT_PARAMETERS", Value:false}, gosnowflake.nameValueParameter{Name:"CLIENT_TELEMETRY_SESSIONLESS_ENABLED", Value:true}, gosnowflake.nameValueParameter{Name:"DATE_OUTPUT_FORMAT", Value:"YYYY-MM-DD"}, gosnowflake.nameValueParameter{Name:"CLIENT_CONSENT_CACHE_ID_TOKEN", Value:false}, gosnowflake.nameValueParameter{Name:"CLIENT_FORCE_PROTECT_ID_TOKEN", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_STAGE_ARRAY_BINDING_THRESHOLD", Value:65280}, gosnowflake.nameValueParameter{Name:"CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY", Value:3600}, gosnowflake.nameValueParameter{Name:"AUTOCOMMIT", Value:true}, gosnowflake.nameValueParameter{Name:"CLIENT_SESSION_CLONE", Value:false}, gosnowflake.nameValueParameter{Name:"TIMESTAMP_LTZ_OUTPUT_FORMAT", Value:""}}  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIMESTAMP_OUTPUT_FORMAT, value: YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_PREFETCH_THREADS, value: 4  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIME_OUTPUT_FORMAT, value: HH24:MI:SS  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIMESTAMP_TZ_OUTPUT_FORMAT, value:   LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_RESULT_CHUNK_SIZE, value: 160  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_SESSION_KEEP_ALIVE, value: false  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: QUERY_CONTEXT_CACHE_SIZE, value: 5  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_METADATA_USE_SESSION_DATABASE, value: false  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED, value: false  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1, value: false  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIMESTAMP_NTZ_OUTPUT_FORMAT, value: YYYY-MM-DD HH24:MI:SS.FF3  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_RESULT_PREFETCH_THREADS, value: 1  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_METADATA_REQUEST_USE_CONNECTION_CTX, value: false  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_HONOR_CLIENT_TZ_FOR_TIMESTAMP_NTZ, value: true  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_MEMORY_LIMIT, value: 1536  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_TIMESTAMP_TYPE_MAPPING, value: TIMESTAMP_LTZ  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIMEZONE, value: America/Los_Angeles  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_RESULT_PREFETCH_SLOTS, value: 2  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_TELEMETRY_ENABLED, value: true  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_USE_V1_QUERY_API, value: true  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_DISABLE_INCIDENTS, value: true  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_RESULT_COLUMN_CASE_INSENSITIVE, value: false  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CSV_TIMESTAMP_FORMAT, value:   LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: BINARY_OUTPUT_FORMAT, value: HEX  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_ENABLE_LOG_INFO_STATEMENT_PARAMETERS, value: false  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_TELEMETRY_SESSIONLESS_ENABLED, value: true  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: DATE_OUTPUT_FORMAT, value: YYYY-MM-DD  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_CONSENT_CACHE_ID_TOKEN, value: false  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_FORCE_PROTECT_ID_TOKEN, value: true  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_STAGE_ARRAY_BINDING_THRESHOLD, value: 65280  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY, value: 3600  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: AUTOCOMMIT, value: true      LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: CLIENT_SESSION_CLONE, value: false  LOG_SESSION_ID=4974753626156026
DEBU[0002]connection_util.go:185 gosnowflake.(*snowflakeConn).populateSessionParameters parameter. name: TIMESTAMP_LTZ_OUTPUT_FORMAT, value:   LOG_SESSION_ID=4974753626156026
DEBU[0002]connection.go:349 gosnowflake.(*snowflakeConn).ExecContext number of updated rows: 0                    
Congrats! You have successfully run update TESTING_TABLE set is_read = ? where id = ?;  with Snowflake DB!
INFO[0002]connection.go:279 gosnowflake.(*snowflakeConn).Close Close                                         LOG_SESSION_ID=4974753626156026
DEBU[0002]log.go:238 gosnowflake.(*defaultLogger).Debug nothing to send to telemetry                 
INFO[0002]restful.go:327 gosnowflake.closeSession close session                                 LOG_SESSION_ID=4974753626156026
INFO[0002]retry.go:299 gosnowflake.(*retryHTTP).execute retryHTTP.totalTimeout: 5s                    LOG_SESSION_ID=4974753626156026
DEBU[0002]retry.go:309 gosnowflake.(*retryHTTP).execute retry count: 0                                LOG_SESSION_ID=4974753626156026
DEBU[0002]connection.go:270 gosnowflake.(*snowflakeConn).cleanup Snowflake connection closing.                 LOG_SESSION_ID=4974753626156026

@AdamDrewsTR
Copy link
Author

You'll also see that if you change the UUID to a string, it will update the row:

_, err = conn.ExecContext(ctx, query, true, theId.String())

@AdamDrewsTR
Copy link
Author

AdamDrewsTR commented Sep 19, 2024

Updating this: https://go.dev/play/p/iLBnvDe-3ES

My colleague also just pointed out that uuid.UUID implements Valuer that returns the db.Value back; that isn't being honored anymore. https://pkg.go.dev/database/sql/driver#Valuer

@AdamDrewsTR AdamDrewsTR changed the title SNOW-1669514: UUID Strings In Queries/Updates/Etc SNOW-1669514: uuid.UUID Valuer Interface No Longer Honored Sep 19, 2024
ChronosMasterOfAllTime added a commit to ChronosMasterOfAllTime/gosnowflake that referenced this issue Sep 19, 2024
@ChronosMasterOfAllTime
Copy link
Contributor

ChronosMasterOfAllTime commented Sep 19, 2024

Opened PR to try and solve this. It should work for both your UUID package and the google's uuid.UUID package.

@ChronosMasterOfAllTime
Copy link
Contributor

@sfc-gh-dszmolka I pinged Mike Wies as he is our enterprise support technical person. Hoping to get some eyes on PR #1211

@sfc-gh-dszmolka
Copy link
Contributor

great, thank you @AdamDrewsTR for the details and @ChronosMasterOfAllTime for the contribution here !

@sfc-gh-dszmolka sfc-gh-dszmolka added status-pr_pending_merge A PR is made and is under review status-triage_done Initial triage done, will be further handled by the driver team and removed status-triage Issue is under initial triage status-information_needed Additional information is required from the reporter labels Sep 23, 2024
@sfc-gh-dszmolka sfc-gh-dszmolka removed their assignment Sep 23, 2024
@ChronosMasterOfAllTime
Copy link
Contributor

great, thank you @AdamDrewsTR for the details and @ChronosMasterOfAllTime for the contribution here !

@sfc-gh-dszmolka Anytime; how do you run the tests locally without setting SKIP_TESTS?

@sfc-gh-dszmolka
Copy link
Contributor

Tests do not run automatically when submitted from external contributors. We'll take a look once we get there and take care of the PR and fix. Again, thank you for your contribution!

ChronosMasterOfAllTime added a commit to ChronosMasterOfAllTime/gosnowflake that referenced this issue Oct 8, 2024
ChronosMasterOfAllTime added a commit to ChronosMasterOfAllTime/gosnowflake that referenced this issue Oct 10, 2024
ChronosMasterOfAllTime added a commit to ChronosMasterOfAllTime/gosnowflake that referenced this issue Nov 19, 2024
ChronosMasterOfAllTime added a commit to ChronosMasterOfAllTime/gosnowflake that referenced this issue Nov 21, 2024
ChronosMasterOfAllTime added a commit to ChronosMasterOfAllTime/gosnowflake that referenced this issue Nov 22, 2024
ChronosMasterOfAllTime added a commit to ChronosMasterOfAllTime/gosnowflake that referenced this issue Dec 2, 2024
ChronosMasterOfAllTime added a commit to ChronosMasterOfAllTime/gosnowflake that referenced this issue Dec 6, 2024
@ChronosMasterOfAllTime
Copy link
Contributor

With @sfc-gh-pfus 's help we have the PR in the place that's ready for kicking off the GHA's @sfc-gh-dszmolka

ChronosMasterOfAllTime added a commit to ChronosMasterOfAllTime/gosnowflake that referenced this issue Dec 9, 2024
@sfc-gh-dszmolka
Copy link
Contributor

apparently PR is merged :) but reopening this issue to be able to properly keep track of the release

@sfc-gh-dszmolka sfc-gh-dszmolka added status-fixed_awaiting_release The issue has been fixed, its PR merged, and now awaiting the next release cycle of the connector. and removed status-pr_pending_merge A PR is made and is under review labels Dec 10, 2024
@ChronosMasterOfAllTime
Copy link
Contributor

apparently PR is merged :) but reopening this issue to be able to properly keep track of the release

I saw that! Thanks for the collab @sfc-gh-pfus. Enjoyed working on the driver as it gave me a much better understanding of how it works.

@sfc-gh-pfus
Copy link
Collaborator

Thanks @ChronosMasterOfAllTime for aligning with all our requirements :) It was a pleasure working with you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Erroneous or unexpected behaviour status-fixed_awaiting_release The issue has been fixed, its PR merged, and now awaiting the next release cycle of the connector. status-triage_done Initial triage done, will be further handled by the driver team
Projects
None yet
Development

No branches or pull requests

5 participants