Могу ли я использовать команду Snowke Snow sql! Spool для перезаписи существующего файла? - PullRequest
0 голосов
/ 21 апреля 2020

Когда я использую команду! Spool, к целевому файлу добавляются результаты. Пример:

$ touch current.spool
$ cat curr_ts.sql
!spool current.spool
select CURRENT_TIMESTAMP;

$ snowsql -f  curr_ts.sql  <--- 1st execution of the script
* SnowSQL * v1.1.86
Type SQL statements or !help
+-------------------------------+
| CURRENT_TIMESTAMP             |
|-------------------------------|
| 2020-04-21 13:35:59.983 -0400 |
+-------------------------------+
1 Row(s) produced. Time Elapsed: 0.096s
Goodbye!

$ cat current.spool
+-------------------------------+
| CURRENT_TIMESTAMP             |
|-------------------------------|
| 2020-04-21 13:35:59.983 -0400 |
+-------------------------------+

$ snowsql -f  curr_ts.sql  <--- 2nd (supposedly independent) execution of the script
* SnowSQL * v1.1.86
Type SQL statements or !help
+-------------------------------+
| CURRENT_TIMESTAMP             |
|-------------------------------|
| 2020-04-21 13:36:17.629 -0400 |
+-------------------------------+
1 Row(s) produced. Time Elapsed: 0.098s
Goodbye!
[1019] bjs13b@igloo:/home/bjs13b/snowsql $ cat current.spool
+-------------------------------+
| CURRENT_TIMESTAMP             |
|-------------------------------|
| 2020-04-21 13:35:59.983 -0400 |
+-------------------------------+
+-------------------------------+
| CURRENT_TIMESTAMP             |   <--- file NOT replaced by 2nd execution!
|-------------------------------|
| 2020-04-21 13:36:17.629 -0400 |
+-------------------------------+

[править, чтобы надеяться прояснить проблему]

Если каждое выполнение должно создавать почасовой файл, то каждое выполнение ДОБАВЛЯЕТ ДАННЫЕ в почасовой файл ... так много для почасового набора данных.

Я знаю много обходных путей, но это конкретный c вопрос о спуле. Я бы предпочел вариант, который изменяет поведение команды спула. В других системах я привык к тому, что файл перезаписывается, и это продолжает меня кусать!

1 Ответ

0 голосов
/ 07 мая 2020

Dtrace / strace подтверждает, что флаг функции спула всегда открывает файл в и O_APPEND режиме , что ведет к поведению, которое вы наблюдаете. нет задокументированного переопределения к этому поведению на дату публикации.

~> cat test.sql
!spool filename.txt
SELECT 1;

~> dtruss snowsql -f test.sql
…
open("filename.txt\0", 0x1000209, 0x1B6)
                       ^^^^^^^^^
         (Flags include O_CREAT and O_APPEND)
…

~> dtruss snowsql -f test.sql
…
open("filename.txt\0", 0x1000209, 0x1B6)
…

Snow SQL, являясь пользовательским клиентом для Snowflake DB, не следует специфика c, стандартное поведение (например, некоторые другие коннекторы Snowflake DB - JDB C, ODB C, SQL Alchemy (Python) и др. c.). Что касается комментария , сравнивающего его с Oracle SQL* Plus функциями , однако, имеет смысл запросить аналогичную функцию. Если у вас есть учетная запись службы поддержки Snowflake, я бы рекомендовал поднять запрос на добавление функции.

...