From ae1339a81e224678c60ae99d6f8731619fe997e6 Mon Sep 17 00:00:00 2001
From: Alexander Tolstoy <a.tolstoy@picodata.io>
Date: Wed, 13 Mar 2024 11:33:56 +0000
Subject: [PATCH] Add procedure description to SQL Commands and Access Control

---
 docs/architecture/system_tables.md    |  31 ++++++++
 docs/images/ebnf/body.svg             | Bin 0 -> 11877 bytes
 docs/images/ebnf/create_procedure.svg | Bin 0 -> 40229 bytes
 docs/images/ebnf/ddl.svg              | Bin 12754 -> 19365 bytes
 docs/images/ebnf/drop_procedure.svg   | Bin 0 -> 24678 bytes
 docs/overview/glossary.md             |  39 ++++++++--
 docs/reference/sql_queries.md         | 108 +++++++++++++++++++++++---
 docs/tutorial/access_control.md       |  37 +++++++++
 8 files changed, 195 insertions(+), 20 deletions(-)
 create mode 100644 docs/images/ebnf/body.svg
 create mode 100644 docs/images/ebnf/create_procedure.svg
 create mode 100644 docs/images/ebnf/drop_procedure.svg

diff --git a/docs/architecture/system_tables.md b/docs/architecture/system_tables.md
index 12be29ac..5a171814 100644
--- a/docs/architecture/system_tables.md
+++ b/docs/architecture/system_tables.md
@@ -81,6 +81,37 @@ Picodata 23.06.0-287-ga98dc6919
 * `id` (unique), parts: `[table_id, id]`
 * `name` (unique), parts: `[table_id, name]`
 
+### _pico_routine {: #_pico_routine }
+
+Содержит информацию о пользовательских
+[хранимых процедурах](../reference/sql_queries.md#proc) Picodata.
+
+Поля:
+
+* `id`: (_unsigned_) — идентификатор (тип `u32`, первичный ключ)
+* `name`: (_string_) — имя (уникальный индекс)
+* `kind`: (_string_) — тип хранимого объекта: функция или процедура
+* `params`: (_array_) — таблица с типами параметров объекта, в виде  `[
+  {type: 'int', mode: 'in', default: 42}, {type: 'text'} ]`.
+* `returns`: (_array_) — тип возвращаемого результата. Для процедур это
+  пустой массив `[]`, для функций — массив типов в возвращаемом кортеже
+* `language`: (_string_) — язык тела процедуры (например, `SQL`)
+* `body`: (_string_) — тело основной части хранимой процедуры
+* `security`: (_string_) — режим безопасности, определяющий, от чьего
+  имени будет исполнена процедура (`invoker` — от имени вызывающего,
+  `definer` — от имени стороннего пользователя)
+* `operable`: (_boolean_) —  признак доступности процедуры (для
+  `prepare` — _false_, для `commit` — _true_)
+* `schema_version`: (_unsigned_) — версия схемы данных в Raft на момент
+  изменения хранимой процедуры
+* `owner`: (_unsigned_) — идентификатор владельца (создателя) хранимой
+  процедуры
+
+Индексы:
+
+* `id` (unique), parts: `[id]`
+* `name` (unique), parts: `[name]`
+
 ## Описание свойств кластера {: #cluster_properties }
 
 ### _pico_property {: #_pico_property }
diff --git a/docs/images/ebnf/body.svg b/docs/images/ebnf/body.svg
new file mode 100644
index 0000000000000000000000000000000000000000..132b3b9dafce002c09a665f4a8c6cc5d1b219e58
GIT binary patch
literal 11877
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
aXCM1{Qvc)M&yq2@C4?VdUA*}I(SHE-c~?aM

literal 0
HcmV?d00001

diff --git a/docs/images/ebnf/create_procedure.svg b/docs/images/ebnf/create_procedure.svg
new file mode 100644
index 0000000000000000000000000000000000000000..bf3779bd46a7b51453381d5d572ddec1d6805030
GIT binary patch
literal 40229
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
E0R<LNT>t<8

literal 0
HcmV?d00001

diff --git a/docs/images/ebnf/ddl.svg b/docs/images/ebnf/ddl.svg
index 5e9bb2ad81c492b7f1aacddf6a5470d74c5f5cc8..3069cf8472d06dedd49569d24574cdb38042adb3 100644
GIT binary patch
delta 1149
zcmb7DziSjh6lN1+_BJ_5G*J+eyj(Deusb(zc6N5wm_#CI6$C{s<+xmOK`xhHUNjcL
zN(2$(6jl)}tVOo;2ZC7Gi1-I+t(}%uzS+BI#7gdX`|X==zW2?0v!BXOA3FEX_#(uD
z2LRQ|;zD(OvVbDW-W!XRjhXuO$pQxsL;_maULJ7t_C0-+2^i-IRs^ri^LZZx7h!-H
zi0JuebR2DZ+P=DiX|zA%wD%7qMyx3eu()(}tz25JoG9OzEGWU0NO)*e`&-)hv;C#x
znHT$JDdsySD9(0_Q{3!$LveclJBqnZi$8QG6uaG-oVQvjud}84lIeB(Ox-<B`5kwR
z;(PbB<E6d1@1rIi>U-dIy34Eea%Jw?s`)t7Z@}w3vYV)6rzUfAlZ8@TFxYj-^nmLq
z^Tj)CiZGf_5UPNofChxZl;D^Xo7-?Xuamv`ZvfpjP>LZ6AGu1;ca62RBTvlq$V~bw
z|Jpr}Fpg1@Xg|;_iPMo|TTWgxl}L_$z*!QSox<bRmb2-dk-LtUFsY;;G9IQEyEdHe
zn8{cXowG1XpY=U)4w5Jreh{%31zZ9um<|rFI$MYgwWX4>-d!TY0p+=(vse&HSOHsF
zNFP}kLLit-$bW{3AhpjeGmgnMXNnj${*94o+nhkssccIaCQxdCWJ+q%=j2vL63Da2
zq`9y-RFs$G!17yAQ1>KNY(B}1;?gRIEY`3IHK5BBWlm7-Y1T})vUiRS8<7C@<&k49
z6nnEd`R3Hnl|SSEQ9QS0Z+4aDSqm^GD^L|2Y8d^70VWo&pe0hEf33+}vCYU5_CfpU
z-~<{%?lKyI#hEYx;y3A*-K?;JS$#^hBvd9*wG6GT8;dfFGE<^;%WPyOGrv?LD^4#2
z{;xO*Pgqa?7PmLNRb9}S$xAf|_k0}7rS)oTZsi83ty>s%34uPwK+}-sW^RPOVag7+
WvVl$0<Y;OIC{B4Ni))RADeo6uwG1Ty

delta 549
zcmZXRy-UMD7{-Y;ZLF)HAmWii?a&K%mv2iHDi*B>f{SZOLldO7wIzNm;_6hn!Ci22
z5(k$KF7D!=;2^jNU0n4py|@VB@_V26;eC(i?rx+ve^}eXuB+w&0AUcd!hxqcI4R>O
zIH`6{Jrw~2m<ObKaNLhNN1lqci7{$=YCmpS*F$Fklu&?86f`a0C<B6s4v`HBet5@{
zWYM{)&ox~mHr7qcNwxqG9Ub=lMmJdX*)G@B%zyfsry58zk&bLaFEjIWKXcE9{bWXR
zv4By9j;417<>iW?np_gpk)H*j?2Dl9Y^puwT%nC~RY8WbDd=2T5p=6;Oz81L85iln
z_WA|H2G1rW2(&Rf1VU_a?%^ajmK|>=&K?4gRqW%xHe^ZhA|^)ah#}`>FoRywW)AM2
zZ1|fBF<q|9j-E6_Zg3oa15U|RFad3%185i^gnAk(d#i3^5SsM0z9gCSt8UI>$1P(U
UIAv(iy_o__mZ=%0(yN`tU$^OpMgRZ+

diff --git a/docs/images/ebnf/drop_procedure.svg b/docs/images/ebnf/drop_procedure.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2e429469ec169061b123f0ebbe0dc035b17ef8c4
GIT binary patch
literal 24678
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

literal 0
HcmV?d00001

diff --git a/docs/overview/glossary.md b/docs/overview/glossary.md
index 7a43a0a1..7e84ffcb 100644
--- a/docs/overview/glossary.md
+++ b/docs/overview/glossary.md
@@ -384,18 +384,41 @@ sharding_key:
 
 В этом подразделе собраны определения терминов, встречающихся при работе с распределенным SQL в Picodata.
 
-**Data Definition Language (DDL)**. Язык описания схемы данных. Набор команд для управления таблицами в SQL (создание/удаление таблиц).
+### Data Definition Language (DDL) {: #ddl }
 
-**Data Modification Language (DML)**. Язык модификации данных. Набор команд для изменения данных в таблицах SQL (вставка/обновление/удаление строк).
+Язык описания схемы данных. Набор команд для управления таблицами в SQL (создание/удаление таблиц).
 
-**Data Query Language (DQL)**. Язык получения данных (команда `SELECT` для чтения данных из таблиц).
+### Data Modification Language (DML) {: #dml }
 
-**Команда SQL**. Запрос (и, опционально, значения передаваемых параметров) к базе данных Tarantool на языке SQL.
+Язык модификации данных. Набор команд для изменения данных в таблицах SQL (вставка/обновление/удаление строк).
 
-**План запроса**. Схема и последовательность шагов, требуемая для исполнения запрос. План строится на узле-маршрутизаторе и исполняется во всем кластере.
+### Data Query Language (DQL) {: #dql }
 
-**Проекция**. Фильтрация или модификация столбцов таблицы.
+Язык получения данных (команда `SELECT` для чтения данных из таблиц).
 
-**Ключ шардирования**. Столбец, по которому таблица распределена в кластере.
+### Команда SQL  {: #query }
 
-**Материализация данных**. Один из этапов исполнения распределенного SQL-запроса, при котором на отдельном узле промежуточные данные сохраняются в его памяти.
+Запрос (и, опционально, значения передаваемых параметров) к базе данных Tarantool на языке SQL.
+
+### План запроса {: #execution_plan }
+
+Схема и последовательность шагов, требуемая для исполнения запрос. План строится на узле-маршрутизаторе и исполняется во всем кластере.
+
+### Проекция {: #projection }
+
+Фильтрация или модификация столбцов таблицы.
+
+### Ключ шардирования {: #sharding_key }
+
+Столбец, по которому таблица распределена в кластере.
+
+### Материализация данных {: #data_materialization }
+
+Один из этапов исполнения распределенного SQL-запроса, при котором на отдельном узле промежуточные данные сохраняются в его памяти.
+
+### Хранимая процедура {: #stored_procedure }
+
+Представляет собой набор SQL-инструкций для
+выполнения DML-операций, т.е. изменения данных в таблице. Такой набор
+является отдельным объектом БД и выполняется как единое целое. В простом
+виде он может состоять из нужной пользователю DML-команды.
diff --git a/docs/reference/sql_queries.md b/docs/reference/sql_queries.md
index c31a8abf..bd448484 100644
--- a/docs/reference/sql_queries.md
+++ b/docs/reference/sql_queries.md
@@ -9,15 +9,16 @@ Picodata при работе с распределенной СУБД.
 
 - Data Definition Language (`DDL`): команды для
   [создания](#create_table) и [удаления](#drop_table)
-  [таблиц](../overview/glossary.md#table);
+  [таблиц](../overview/glossary.md#table), а также для работы с
+  [хранимыми процедурами](../overview/glossary.md#stored_procedure);
 - Data Modification Language (`DML`): команды [`INSERT`](#query_insert) для
   добавления данных в таблицы, [`UPDATE`](#query_update) для обновления данных
   и [`DELETE`](#query_delete) для удаления данных;
 - Data Query Language (`DQL`): команда [`SELECT`](#query_select) для получения
   данных из таблиц;
 - Access Control Lists (`ACL`): команды для [управления пользователями](#users) и ролями;
-- команда [`EXPLAIN`](#query_explain) для отображения планов запросов `DML` и
-  `DQL`.
+- команда [`EXPLAIN`](#query_explain) для отображения [планов
+  запросов](../overview/glossary.md#execution_plan) `DML` и `DQL`.
 
 Схемы этих функций на верхнем уровне показаны ниже:
 
@@ -288,6 +289,89 @@ Cхема запроса для удаления таблицы показана
 DROP TABLE "characters";
 ```
 
+## Работа с хранимыми процедурами {: #proc }
+
+[Хранимые процедуры](../overview/glossary.md#stored_procedure) позволяют
+создавать шаблоны команд для более удобного выполнения DML-операций.
+
+### **CREATE PROCEDURE** {: #create_procedure }
+
+![CREATE PROCEDURE](../images/ebnf/create_procedure.svg)
+
+#### **Тело процедуры** {: #body }
+
+![body](../images/ebnf/body.svg)
+
+
+Для примера создадим процедуру по добавлению новых строк в таблицу `characters`:
+
+```sql
+CREATE PROCEDURE proc1(int, text, int)
+AS $$INSERT INTO "characters" VALUES($1, $2, $3)$$
+```
+
+где:
+
+- `proc1` — название хранимой процедуры
+- `int, text, int` — типы колонок
+- `$1, $2, $3`— порядок колонок
+
+Порядок колонок может быть произвольным, но важно, чтобы указанный тип
+совпадал с фактическим типом в целевой таблице. Так, следующая команда
+создаст ту же самую процедуру:
+
+```sql
+CREATE PROCEDURE proc1(int, int, text)
+AS $$INSERT INTO "characters" VALUES($1, $3, $2)$$
+```
+
+NOTE: **Примечание** Пользователь может создавать и затем управлять
+своими процедурами при наличии [соответствующей
+привилегии](../tutorial/access_control.md#proc_access).
+
+Созданная процедура хранится в системной таблице
+[_pico_routine](../architecture/system_tables.md#_pico_routine).
+Посмотреть ее структуру можно следующей командой:
+
+```sql
+SELECT * FROM "_pico_routine" WHERE "name" = 'PROC1';
+```
+
+### Вызов процедуры {: #call_procedure }
+
+Созданную ранее хранимую процедуру можно использовать с помощью команды
+`call`, реализующей RPC-запрос. Пример:
+
+```sql
+CALL proc1(11, 'Pez Cat', 2013)
+```
+
+При условии правильного указания параметров процедуры и отсутствия в
+таблице строки с `id` = 11, данная команда добавит новую строку.
+
+<!--
+### Переименование процедуры  {: #rename_proc }
+
+Ранее созданную процедуру можно переименовать, используя возможности `ALTER`. Пример команды:
+
+```sql
+ALTER PROCEDURE proc1
+RENAME TO proc2
+OPTION ( timeout = 4 )
+```
+-->
+
+### **DROP PROCEDURE** {: #drop_procedure }
+
+![DROP PROCEDURE](../images/ebnf/drop_procedure.svg)
+
+
+Пример удаления существующей хранимой процедуры:
+
+```sql
+DROP PROCEDURE proc1
+```
+
 ## Запрос SELECT {: #query_select }
 
 Запрос `SELECT` используется для получения информации из указанной
@@ -1361,15 +1445,15 @@ WHERE "stock" > 1000;
 вариант перемещения данных между узлами хранения. Существуют следующие
 четыре варианта:
 
-1. **Локальная вставка**. Представляет собой локальную материализацию
-   данных с подсчетом значений `bucket_id` для каждого кортежа
-   (соответственно, кортежи будут сгруппированы по этим бакетам).
-   Перемещения данных на другие узлы хранения через узел-маршрутизатор
-   не происходит. На текущем узле хранения будет локально создана
-   виртуальная таблица из результатов читающего запроса или из
-   переданных `VALUES`, а потом данные из нее будут вставлены локально в
-   целевую таблицу. Планировщик отобразит значение `motion [policy:
-   local segment]`.
+1. **Локальная вставка**. Представляет собой локальную [материализацию
+   данных](../overview/glossary.md#data_materialization) с подсчетом
+   значений `bucket_id` для каждого кортежа (соответственно, кортежи
+   будут сгруппированы по этим бакетам). Перемещения данных на другие
+   узлы хранения через узел-маршрутизатор не происходит. На текущем узле
+   хранения будет локально создана виртуальная таблица из результатов
+   читающего запроса или из переданных `VALUES`, а потом данные из нее
+   будут вставлены локально в целевую таблицу. Планировщик отобразит
+   значение `motion [policy: local segment]`.
 1. **Локальная материализация**. Данный вариант аналогичен предыдущему с
    той разницей, что при материализации данных не происходит вычисление
    `bucket_id`. При таком запросе планировщик отобразит значение `motion
diff --git a/docs/tutorial/access_control.md b/docs/tutorial/access_control.md
index f40db5a6..daaa9636 100644
--- a/docs/tutorial/access_control.md
+++ b/docs/tutorial/access_control.md
@@ -131,6 +131,7 @@ GRANT DROP ROLE TO "admin"
 GRANT CREATE TABLE TO <grantee>
 GRANT CREATE USER TO <grantee>
 GRANT CREATE ROLE TO <grantee>
+GRANT CREATE PROCEDURE TO <grantee>
 ```
 
 Это обеспечивает наличие у администратора БД следующих прав:
@@ -140,6 +141,7 @@ GRANT CREATE ROLE TO <grantee>
 - управлять конфигурацией БД
 - назначать права доступа пользователям БД к объектам доступа БД
 - создавать резервные копии БД и восстанавливать БД из резервной копии
+- создавать, модифицировать и удалять хранимые процедуры
 
 При создании объекта пользователь становится его владельцем и
 автоматически получает на него следующие права (в зависимости от типа
@@ -158,6 +160,10 @@ GRANT DROP ON USER <user name> TO <owner>
 
 -- CREATE ROLE <role name>
 GRANT DROP ON ROLE <role name> TO <owner>
+
+-- CREATE PROCEDURE <procedure name>
+GRANT ALTER ON PROCEDURE <procedure name> TO <owner>
+GRANT DROP ON PROCEDURE <procedure name> TO <owner>
 ```
 
 ### Роли {: #roles }
@@ -403,6 +409,34 @@ GRANT <priv> ON TABLE <table name> TO <grantee>
 REVOKE <priv> ON TABLE <table name> FROM <grantee>
 ```
 
+## Управление доступом к хранимым процедурам {: #proc_access }
+
+Для того, чтобы пользователь в Picodata мог создавать хранимые
+процедуры, ему требуется соответствующая привилегия от Администратора
+СУБД:
+
+```sql
+GRANT CREATE PROCEDURE TO <grantee>
+```
+
+После этого <grantee> сможет не только создавать, но и управлять своими
+хранимыми процедурами. При этом, можно выдать привилегии для отдельных
+действий с процедурами, например на их исполнение и удаление. Это может
+быть полезно для настройки доступа к процедурам, созданным  другими
+пользователями:
+
+```sql
+GRANT EXECUTE PROCEDURE TO <grantee>
+GRANT DROP PROCEDURE TO <grantee>
+```
+
+Как и в остальных случаях, отозвать выданные привилегии можно при помощи команды `REVOKE`:
+
+```sql
+REVOKE EXECUTE PROCEDURE FROM <grantee>
+REVOKE DROP PROCEDURE FROM <grantee>
+```
+
 ## Дополнительные примеры SQL-запросов {: #sql_examples }
 
 ```sql
@@ -439,6 +473,9 @@ GRANT DROP ON TABLE <table name> TO <grantee>
 GRANT DROP ON USER <user name> TO <grantee>
 GRANT DROP ON ROLE <role name> TO <grantee>
 
+GRANT EXECUTE ON PROCEDURE <proc name> TO <grantee>
+GRANT DROP ON PROCEDURE <proc name> TO <grantee>
+
 GRANT <role name> TO <grantee>
 ```
 
-- 
GitLab