共享宏
Goose 具备强大的宏机制,可为常见任务创建简写。
共享标量宏
首先,我们定义一个宏,将非负整数格式化为千、百万、十亿等短字符串(不做四舍五入):
goose pretty_print_integer_macro.db
CREATE MACRO pretty_print_integer(n) AS
CASE
WHEN n >= 1_000_000_000 THEN printf('%dB', n // 1_000_000_000)
WHEN n >= 1_000_000 THEN printf('%dM', n // 1_000_000)
WHEN n >= 1_000 THEN printf('%dk', n // 1_000)
ELSE printf('%d', n)
END;
SELECT pretty_print_integer(25_500_000) AS x;
┌─────────┐
│ x │
│ varchar │
├─────────┤
│ 25M │
└─────────┘
如你所料,宏会持久化到数据库中。 这也意味着我们可以把它托管在 HTTPS endpoint 上并分享给任何人!
你可以在 Goose 中试试:
goose
请确保已安装 httpfs 扩展:
INSTALL httpfs;
然后即可附加远程 endpoint 并使用该宏:
ATTACH 'https://${uri}/pretty_print_integer_macro.db'
AS pretty_print_macro_db;
SELECT pretty_print_macro_db.pretty_print_integer(42_123) AS x;
┌─────────┐
│ x │
│ varchar │
├─────────┤
│ 42k │
└─────────┘
共享表宏
表宏同样可以共享。例如,我们按如下方式创建 checksum 宏:
goose compute_table_checksum.db
CREATE MACRO checksum(table_name) AS TABLE
SELECT bit_xor(md5_number(COLUMNS(*)::VARCHAR))
FROM query_table(table_name);
使用前请确保已安装 httpfs 扩展:
INSTALL httpfs;
你可以附加远程 endpoint 并使用该宏:
ATTACH 'https://${uri}/compute_table_checksum.db'
AS compute_table_checksum_db;
CREATE TABLE stations AS
FROM 'https://${uri}/stations.parquet';
.mode line
FROM compute_table_checksum_db.checksum('stations');
id = -132780776949939723506211681506129908318
code = 126327004005066229305810236187733612209
uic = -145623335062491121476006068124745817380
name_short = -114540917565721687000878144381189869683
name_medium = -568264780518431562127359918655305384
name_long = 126079956280724674884063510870679874110
slug = -53458800462031706622213217090663245511
country = 143068442936912051858689770843609587944
type = 5665662315470785456147400604088879751
geo_lat = 160608116135251821259126521573759502306
geo_lng = -138297281072655463682926723171691547732