Skip to content

Commit e255686

Browse files
authored
feat(snowflake): add timeout_secs foreign table option (supabase#534)
* feat(snowflake): add timeout_secs table option * fix: change to use server option and add docs
1 parent d1bdade commit e255686

5 files changed

Lines changed: 23 additions & 5 deletions

File tree

docs/catalog/snowflake.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ The Snowflake Wrapper is a WebAssembly(Wasm) foreign data wrapper which allows y
1717

1818
| Version | Wasm Package URL | Checksum | Required Wrappers Version |
1919
| ------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | ------------------------- |
20+
| 0.2.1 | `https://github.com/supabase/wrappers/releases/download/wasm_snowflake_fdw_v0.2.1/snowflake_fdw.wasm` | `tbd` | >=0.5.0 |
2021
| 0.2.0 | `https://github.com/supabase/wrappers/releases/download/wasm_snowflake_fdw_v0.2.0/snowflake_fdw.wasm` | `921b18a1e9c20c4ef5a09af17b5d76fd6ebe56d41bcfa565b74a530420532437` | >=0.5.0 |
2122
| 0.1.1 | `https://github.com/supabase/wrappers/releases/download/wasm_snowflake_fdw_v0.1.1/snowflake_fdw.wasm` | `7aaafc7edc1726bc93ddc04452d41bda9e1a264a1df2ea9bf1b00b267543b860` | >=0.4.0 |
2223
| 0.1.0 | `https://github.com/supabase/wrappers/releases/download/wasm_snowflake_fdw_v0.1.0/snowflake_fdw.wasm` | `2fb46fd8afa63f3975dadf772338106b609b131861849356e0c09dde032d1af8` | >=0.4.0 |
@@ -75,7 +76,8 @@ We need to provide Postgres with the credentials to connect to Snowflake, and an
7576
account_identifier 'MYORGANIZATION-MYACCOUNT',
7677
user 'MYUSER',
7778
public_key_fingerprint 'SizgPofeFX0jwC8IhbOfGFyOggFgo8oTOS1uPLZhzUQ=',
78-
private_key_id '<key_ID>' -- The Key ID from above.
79+
private_key_id '<key_ID>', -- The Key ID from above.
80+
timeout_secs '60' -- Timeout in seconds for Snowflake statement execution, default is 60, value range is [0, 6048]
7981
);
8082
```
8183

@@ -92,7 +94,8 @@ We need to provide Postgres with the credentials to connect to Snowflake, and an
9294
account_identifier 'MYORGANIZATION-MYACCOUNT',
9395
user 'MYUSER',
9496
public_key_fingerprint 'SizgPofeFX0jwC8IhbOfGFyOggFgo8oTOS1uPLZhzUQ=',
95-
private_key E'-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----'
97+
private_key E'-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----',
98+
timeout_secs '60' -- Timeout in seconds for Snowflake statement execution, default is 60, value range is [0, 6048]
9699
);
97100
```
98101

wasm-wrappers/fdw/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wasm-wrappers/fdw/snowflake_fdw/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "snowflake_fdw"
3-
version = "0.2.0"
3+
version = "0.2.1"
44
edition = { workspace = true }
55
homepage = { workspace = true }
66
rust-version = { workspace = true }

wasm-wrappers/fdw/snowflake_fdw/src/lib.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ struct SnowflakeFdw {
2525
src_rows: Vec<JsonValue>,
2626
src_idx: usize,
2727
rowid_col: String,
28+
timeout_secs: i32,
2829
}
2930

3031
static mut INSTANCE: *mut SnowflakeFdw = std::ptr::null_mut::<SnowflakeFdw>();
@@ -204,7 +205,10 @@ impl SnowflakeFdw {
204205
// make the first SQL query request
205206
fn make_init_request(&mut self, sql: &str) -> FdwResult {
206207
let url = format!("{}?async=false", self.base_url);
207-
let body = format!(r#"{{ "statement": "{sql}", "timeout": 60 }}"#);
208+
let body = format!(
209+
r#"{{ "statement": "{sql}", "timeout": {} }}"#,
210+
self.timeout_secs
211+
);
208212
let (mut resp, mut resp_json) = self.make_post_request(&url, &body)?;
209213

210214
// polling query result
@@ -292,6 +296,14 @@ impl Guest for SnowflakeFdw {
292296
}
293297
};
294298

299+
// parse query timeout from server option
300+
// ref: https://docs.snowflake.com/en/developer-guide/sql-api/reference#label-sql-api-reference-post-statements-request-body
301+
let timeout_secs = opts
302+
.require_or("timeout_secs", "60")
303+
.parse::<i32>()
304+
.map_err(|e| format!("invalid timeout_secs value: {e}"))?
305+
.clamp(0, 6048);
306+
295307
// Snowflake api authentication ref:
296308
// https://docs.snowflake.com/en/developer-guide/sql-api/authenticating#using-key-pair-authentication
297309
let claims = vec![
@@ -322,6 +334,8 @@ impl Guest for SnowflakeFdw {
322334
"KEYPAIR_JWT".to_owned(),
323335
));
324336

337+
this.timeout_secs = timeout_secs;
338+
325339
stats::inc_stats(FDW_NAME, stats::Metric::CreateTimes, 1);
326340

327341
Ok(())

wrappers/src/fdw/wasm_fdw/tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ mod tests {
2525
api_url 'http://localhost:8096/snowflake/{}',
2626
account_identifier 'TEST-ABC1234',
2727
user 'TESTUSER',
28+
timeout_secs '30',
2829
public_key_fingerprint 'WVggEofeFX0jwCdImbOfGFyOggF2o8DT7S1uTLZhCJQ=',
2930
private_key E'-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCOQv0mMe1yElR8\nhiQgduWu7OrMR3iW8xbu+i04LkMDKB/JtdMl1Mq3Gs/XWUB07BOIytcK4L7k1Z/3\nnkTGvib85S5+VLsngBzWltltvCOfnM2uCLWHmVpfMR1WVFrCU1r7NP92U2APpwvN\ncJps39VNyQWTm+TvQN25enqAC2uR6xdvItb86dn4Tab3KcAXj0f0qHompa8SSwBO\nGZFpgAjt7QFPWTniNQyBU7wXTntwV+a2WC/bf1i9MRAf8bqSr+yqijLHVGrmBPSb\njmvo/8bj69DzeY2//gZXAMe1m6cEjXPm2MY/POd66Xg1YZDzYsv95GZ54kJ+EgEF\n9rjsi/J5AgMBAAECggEAAsG9kh3pkgpU5Mzcqlxjew5QRoEkDxjK2vqyIaKT3d3L\nL+d8HgGPpBi66ltqalmgz0fO/wD38gtJvEyu3IMW0lPGoOAXeF59MJNfx0acEh3B\nxpuYmPYZ0DptbRzZXWasHq4aPTrEY8lC60pBU9bKlWVN3FxrBU/mfA+pjA2smflC\n54brJTsSb1/1xAExxsvB2Leb6VcNWKRCaN6Z4gdWd1Qofi080LVWxE3MXhxHpTMj\nVf3KHhKI5DHJXlZPU/w4KXOlp99UH0vnx3EJzD07kI+nR2k7tfh8PxwFzn8g6hEC\nK9Q+HmzUUTxFh1M8eXi7IMRjLRJThVSl/Kbqr6cpeQKBgQC+410aRuHUteQIgJBQ\nbceAOjEh5MetByIEFdXLEgYspl1rSjN/JoIMUguyJ8KZGj5G3NaRaJklNOofYekI\nhIL3SBWZ9U58MJVMnSUVeBdazCu0k9HnOfOFrFJIDoRPBfjnP0UJmC+9ggoVayOX\nVW5psrxGiQXWiG7mho1bshSlNwKBgQC+yX1wFSF8gGsAb41iw60K9W+O5PLVWxAu\nYst8CQTY64RVctvAypWtNTb4nmIBe9aX9k5loe+uv8Zse/t1hgCVGR7n70EyT9Y+\nGNrGqYtVjtZQ+L+dAivrlUKsTDGqzWldUTg7gpOqkFaQbV0O11ytyKJKYXCpTrL2\nwib6V4X9zwKBgQCllTJAxfXFfxZUbblBm0iwKUpPXVX7+LEAHDS9F2B1wMZOeCod\nhLjQmSb+HlFGX6Zf79bMgZA+3xyrplHviorUmBns2AaB4d7Qe4wciHSx1WOgG427\n5uAgNy+Uw8rvhX24koB/Zx0aZT/7/lj8QCYr19hL0zZWNzkEDPl37gzMlwKBgQC3\noOsww8XVNSzH4JZupvOYhp53JHltTRaH7uL3YR7fQd++9qv4JYRmj793D8o4r17e\nKF1QiMpOoZpzs+lVNkK9Ps52YduYdys33WhEqc7H7JDuolya3Ao11xWzDCsJwGdX\nP+MltAo4sm/+1qQosrQrN96sRJjQ/ERYKIqnjTIUFQKBgQC6xaC5SB1UMepFbTVa\n2tuRuYwcrU/NxjeW85SAyeyv2dMg7S+Ot8mnA1Js2O0NHlczUZgRZalYkCuSUE78\nb6rIbezIW2azrw3tqAAPLsB+rhXvaUpICoybu+j6aCiqtZYsDx7zIj/FTD27Tpwx\nYfLx1Erqd3vM/LzOIaIOqlfETw==\n-----END PRIVATE KEY-----'
3031
)"#,

0 commit comments

Comments
 (0)