diff --git a/website/docs/releases.md b/website/docs/releases.md index a69791a..49b29a0 100644 --- a/website/docs/releases.md +++ b/website/docs/releases.md @@ -24,6 +24,13 @@ In case you are wondering why all our releases start with `0.0`, read [this FAQ ::: +### 0.0.21200 [Jan 17 2025] + +* Support for Microsoft Azure Blob Storage using [`azure_location`](./sql/external/location.md#microsoft-azure-blob-storage) was added. +* Documented [`starts_with`](./sql/scalar_func/string.md) and [`ends_with`](./sql/scalar_func/string.md), as well as negative field positions for [`split_part`](./sql/scalar_func/string.md). +* Fixed double free bug in Java Hyper API (reported in GitHub Issue [#133](https://github.com/tableau/hyper-db/issues/133)). +* Improved performance of distinct aggregates (e.g., `SELECT COUNT(DISTINCT a) from t`). + ### 0.0.20746 [Nov 7 2024] * Support for `array_contains`, `array_position` and `array_positions` was added diff --git a/website/docs/sql/external/location.md b/website/docs/sql/external/location.md index 611ba67..18d525d 100644 --- a/website/docs/sql/external/location.md +++ b/website/docs/sql/external/location.md @@ -9,6 +9,9 @@ s3_location('amazon_s3_uri' [, access_key_id => 'text', secret_access_key => 'text' [, session_token => 'text'] ] [, region => 'text'] ) +azure_location('azure_blob_storage_uri' + [, sas_token => 'sas_token'] +) ARRAY[ [, ...] ] ``` @@ -54,6 +57,31 @@ techniques such as concurrent requests, request hedging and prefetching). For maximum performance, ensure a high network bandwidth to Amazon S3, e.g., by running HyperAPI directly on an AWS EC2 instance. +## Microsoft Azure Blob Storage + +``` +SELECT * FROM external( + azure_location( + 'abfss://container@account.dfs.core.windows.net/products.parquet', sas_token => 'secret-sas-token' + ) +) +``` + +To access data stored on Microsoft Azure Blob Storage, you can use the +`azure_location` syntax. Hyper supports the `DFS` and `BLOB` endpoints and +recognizes all of the following Azure URL formats: +* `abfss://container@account.dfs.core.windows.net/...` +* `https://account.dfs.core.windows.net/container/...` +* `https://account.blob.core.windows.net/container/...` + +Hyper also allows you to enter the non-SSL version of the URLs (`http://` and `abfs://`), +however it will always establish SSL encrypted connections. + +Hyper's Azure support is highly optimized by using techniques such as concurrent +requests, request hedging and prefetching. For maximum performance, ensure that you +have a high network bandwidth to Azure Blob Storage, e.g. by running HyperAPI directly +on Microsoft Azure compute. + ## Multiple files ``` diff --git a/website/docs/sql/scalar_func/string.md b/website/docs/sql/scalar_func/string.md index a2d33f4..fced16c 100644 --- a/website/docs/sql/scalar_func/string.md +++ b/website/docs/sql/scalar_func/string.md @@ -35,6 +35,7 @@ Function|Return Type|Description|Example `concat(str "any" [, str "any" [, ...] ])`|`text`|Concatenate the text representations of all the arguments. NULL arguments are ignored, in contrast to ||.|`concat('abcde', 2, NULL, 22)` → `abcde222` `decode(string text, format text)`|`bytea`|Decode binary data from textual representation in `string`. Options for `format` are same as in `encode`.|`decode('MTIzAAE=', 'base64')` → `\x3132330001` `encode(data bytea, format text)`|`text`|Encode binary data into a textual representation. Supported formats are: `base64`, `hex`, `escape`. `escape` converts zero bytes and high-bit-set bytes to octal sequences (`\```) and doubles backslashes.|`encode('123\000\001', 'base64')` → `MTIzAAE=` +`ends_with(string text, suffix text)`|`boolean`|Return true if `string` ends with `suffix`.|`ends_with('alphabet', 'bet')` → `t` `initcap(string)`|`text`|Convert the first letter of each word to upper case and the rest to lower case. Words are sequences of alphanumeric characters separated by non-alphanumeric characters.|`initcap('hi THOMAS')` → `'Hi Thomas'` `left(str text, n int)`|`text`|Return first `` characters in the string. When `` is negative, return all but last |<n>| characters.|`left('abcde', 2)` → `'ab'` `length(string)`|`int`|Number of characters in `string`|`length('jose')` → `4` @@ -49,7 +50,8 @@ Function|Return Type|Description|Example `right(str text, n int)`|`text`|Return last `` characters in the string. When `` is negative, return all but first |<n>| characters.|`right('abcde', 2)` → `'de'` `rpad(string text, length int , fill text)`|`text`|Fill up the `string` to length `length` by appending the characters `fill` (a space by default). If the `string` is already longer than `length` then it is truncated.|`rpad('hi', 5, 'xy')` → `'hixyx'` `rtrim(string text , characters text)`|`text`|Remove the longest string containing only characters from `characters` (a space by default) from the end of `string`.|`rtrim('testxxzx', 'xyz')` → `'test'` -`split_part(string text, delimiter text, field int)`|`text`|Split `string` on `delimiter` and return the given field (counting from one).|`split_part('abc~@~def~@~ghi', '~@~', 2)` → `'def'` +`split_part(string text, delimiter text, field int)`|`text`|Split `string` on `delimiter` and return the given field (counting from one). When `n` is negative, returns the `|n|`-th-from-last field. |`split_part('abc~@~def~@~ghi', '~@~', 2)` → `'def'` +`starts_with(string text, prefix text)`|`boolean`|Return true if `string` starts with `prefix`.|`starts_with('alphabet', 'alph')` → `t` `strpos(string, substring)`|`int`|Location of specified substring (same as `position(substring in string)`, but note the reversed argument order).|`strpos('high', 'ig')` → `2` `substr(string, from , count)`|`text`|Extract substring (same as `substring(string from from for count)`).|`substr('alphabet', 3, 2)` → `'ph'` `to_hex(number int or bigint)`|`text`|Convert `number` to its equivalent hexadecimal representation.|`to_hex(2147483647)` → `'7fffffff'` diff --git a/website/src/config.ts b/website/src/config.ts index e616470..e64f958 100644 --- a/website/src/config.ts +++ b/website/src/config.ts @@ -1,4 +1,4 @@ -const version_long = '0.0.20746.reac9bd2d'; +const version_long = '0.0.21200.re11c8cb9'; const version_short = version_long.substr(0, version_long.lastIndexOf('.')); const downloadBaseUrl = 'https://downloads.tableau.com/tssoftware/';