Date: 07.03.2024 19:06:56
SQL-фaйл PostgesSQL-БД: roamer55_ru_pg_funcs
==========================

--
-- PostgreSQL database dump
--

-- Dumped from database version 9.5.6
-- Dumped by pg_dump version 9.5.6

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: roamer55_ru_pg_funcs; Type: COMMENT; Schema: -; Owner: postgres
--

COMMENT ON DATABASE roamer55_ru_pg_funcs IS 'PostgreSQL. Полезные функции.
Для сайта roamer55.ru.
Начато: 2021.12.07';


--
-- Name: tmp; Type: SCHEMA; Schema: -; Owner: postgres
--

CREATE SCHEMA tmp;


ALTER SCHEMA tmp OWNER TO postgres;

--
-- Name: SCHEMA tmp; Type: COMMENT; Schema: -; Owner: postgres
--

COMMENT ON SCHEMA tmp IS 'Временная...';


--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: 
--

CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;


--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


SET search_path = public, pg_catalog;

--
-- Name: t_float; Type: DOMAIN; Schema: public; Owner: postgres
--

CREATE DOMAIN t_float AS double precision;


ALTER DOMAIN t_float OWNER TO postgres;

--
-- Name: DOMAIN t_float; Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON DOMAIN t_float IS 'Вещественное число (double precision). Используется в интерпретаторе скриптов';


--
-- Name: bigint_as_str(bigint); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION bigint_as_str(v bigint) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
BEGIN
  -- Конвертировать bigint в строку
  -- select * from bigint_as_str(12);
  -- select * from bigint_as_str(-999999999);
  res = '0';
  v = bigint_is_null(v);
  res = cast(v as character varying);
  res = str_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.bigint_as_str(v bigint) OWNER TO postgres;

--
-- Name: FUNCTION bigint_as_str(v bigint); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION bigint_as_str(v bigint) IS 'Конвертировать bigint в строку';


--
-- Name: bigint_is_null(bigint, bigint); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION bigint_is_null(sx bigint, sdef bigint DEFAULT 0) RETURNS bigint
    LANGUAGE plpgsql
    AS $$
BEGIN
  -- Контроль значения типа bigint (проверка на NULL и замена NULL на значение по умочанию)
  /*
     select * from bigint_is_null(null, -5);
     select * from bigint_is_null(null);
     select * from bigint_is_null(0, -5);
  */
  IF (sx is NULL) THEN
      IF (sdef is NULL) THEN sdef=0; END IF;
      RETURN sdef;
  ELSE
    RETURN sx;
  END IF;
END;
$$;


ALTER FUNCTION public.bigint_is_null(sx bigint, sdef bigint) OWNER TO postgres;

--
-- Name: FUNCTION bigint_is_null(sx bigint, sdef bigint); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION bigint_is_null(sx bigint, sdef bigint) IS 'Контроль значения типа bigint (проверка на NULL и замена NULL на значение по умочанию)';


--
-- Name: bool_as_str(boolean, integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION bool_as_str(v boolean, nr integer DEFAULT 0) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE res character varying;
BEGIN
  /* 
    Конвертировать логическое значение в строку
    select * from bool_as_str(true);
    select * from bool_as_str(true, 1);
    select * from bool_as_str(true, 2);
    select * from bool_as_str(true, 3);
    select * from bool_as_str(true, 4);
  */
  res = '';
  v = bool_is_null(v);
  nr = int_is_null(nr);
  IF (nr<0) THEN nr=0; END IF;
  IF (nr>4) THEN nr=4; END IF;
  IF (v = true) THEN
     IF (nr=0) THEN res = 'True' ; END IF;
     IF (nr=1) THEN res = 'T' ; END IF;
     IF (nr=2) THEN res = '1' ; END IF;
     IF (nr=3) THEN res = 'Истина' ; END IF;
     IF (nr=4) THEN res = 'Да' ; END IF;
  ELSE
     IF (nr=0) THEN res = 'False' ; END IF;
     IF (nr=1) THEN res = 'F' ; END IF;
     IF (nr=2) THEN res = '0' ; END IF;
     IF (nr=3) THEN res = 'Фальш' ; END IF;
     IF (nr=4) THEN res = 'Нет' ; END IF;
  END IF;
  res = str_is_null(res);  
  RETURN res;
END;
$$;


ALTER FUNCTION public.bool_as_str(v boolean, nr integer) OWNER TO postgres;

--
-- Name: FUNCTION bool_as_str(v boolean, nr integer); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION bool_as_str(v boolean, nr integer) IS 'Конвертировать логическое значение в строку';


--
-- Name: bool_is_null(boolean, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION bool_is_null(sx boolean, sdef boolean DEFAULT false) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
BEGIN
  -- Контроль значения типа boolean (проверка на NULL и замена NULL на значение по умочанию)
  /*
    select * from bool_is_null(null);
    select * from bool_is_null(null, true);
    select * from bool_is_null(null, null);
  */
  IF (sx is NULL) THEN
      IF (sdef is NULL) THEN sdef=false; END IF;
      RETURN sdef;
  ELSE
    RETURN sx;
  END IF;
END;
$$;


ALTER FUNCTION public.bool_is_null(sx boolean, sdef boolean) OWNER TO postgres;

--
-- Name: FUNCTION bool_is_null(sx boolean, sdef boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION bool_is_null(sx boolean, sdef boolean) IS 'Контроль значения типа boolean (проверка на NULL и замена NULL на значение по умочанию)';


--
-- Name: exec_select(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION exec_select(query text) RETURNS SETOF record
    LANGUAGE plpgsql
    AS $$
begin
  /*
  Выполнить запрос (SELECT ) заданный во входном параметре типа text.
  Пример: 
    select * from exec_select('code, name_max::t_namemax from public.props_types where code>0') as ds(code integer, name_max t_namemax);
    select * from exec_select('code::integer, name_max::t_namemax from public.props_types where code>0') as ds(code integer, name_max t_namemax);
    select * from exec_select('code, name_max::t_namemax from public.props_types where upper(mnemocode)=' || upper(chr(39) || 'time' || chr(39))  ) as ds(code integer, name_max t_namemax);    
    select * from exec_select('code, name_max::t_namemax from public.props_types where upper(mnemocode)=' || upper(q39_add_lr('time'))) as ds(code integer, name_max t_namemax);    
    select * from exec_select('code, name_max::text from public.props_types where code>0') as ds(code integer, name_max text);
  */ 
  return query execute 'select ' || query;
end;
$$;


ALTER FUNCTION public.exec_select(query text) OWNER TO postgres;

--
-- Name: FUNCTION exec_select(query text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION exec_select(query text) IS 'Выполнить запрос (SELECT ) заданный во входном параметре типа text';


--
-- Name: exec_sql_select(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION exec_sql_select(query text) RETURNS SETOF record
    LANGUAGE plpgsql
    AS $$
begin
  /*
  Пример: 
    Выполнить запрос SELECT заданный во входном параметре типа text
    select * from exec_select('code, name_max::t_namemax from public.props_types where code>0') as ds(code integer, name_max t_namemax);
    select * from exec_select('code::integer, name_max::t_namemax from public.props_types where code>0') as ds(code integer, name_max t_namemax);
    select * from exec_select('code, name_max::t_namemax from public.props_types where upper(mnemocode)=' || upper(chr(39) || 'time' || chr(39))  ) as ds(code integer, name_max t_namemax);    
    select * from exec_select('code, name_max::t_namemax from public.props_types where upper(mnemocode)=' || upper(q39_add_lr('time'))) as ds(code integer, name_max t_namemax);    
    select * from exec_select('code, name_max::text from public.props_types where code>0') as ds(code integer, name_max text);
    select * from exec_select('code, name_max::text from public.props_types where mnemocode=' ||  q39_lr(null)) as ds(code integer, name_max text);
    select * from exec_select('code, name_max::text from public.props_types where code > ' || '0') as ds(code integer, name_max text);
  */ 
  return query execute query;
end;
$$;


ALTER FUNCTION public.exec_sql_select(query text) OWNER TO postgres;

--
-- Name: FUNCTION exec_sql_select(query text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION exec_sql_select(query text) IS 'Выполнить запрос SELECT заданный во входном параметре типа text';


--
-- Name: exec_sql_text(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION exec_sql_text(sql text) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE res boolean;
begin
  /*
  Выполнить команду execute.
  sql - текст соответствующего SQL-запроса
  */ 
  res = false;
  sql = str_is_null(sql);
  IF (sql <> '') THEN
     execute sql;
     res = true;
  END IF;
  RETURN res;
end;
$$;


ALTER FUNCTION public.exec_sql_text(sql text) OWNER TO postgres;

--
-- Name: FUNCTION exec_sql_text(sql text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION exec_sql_text(sql text) IS 'Выполнить команду execute';


--
-- Name: exec_to_bigint(text, bigint); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION exec_to_bigint(sql text, sval bigint DEFAULT 0) RETURNS bigint
    LANGUAGE plpgsql
    AS $$
DECLARE 
  res bigint;
  sres text;
begin
  /*
  Выполнить команду execute с возвратом значения типа bigint
  */ 
  sval = bigint_is_null(sval);
  res = sval;
  sql = str_is_null(sql);
  IF (sql <> '') THEN
     execute sql into sres;
     sres = str_is_null(sres);
     IF (its_bigint(sres) = true) THEN
        res = str_as_bigint(sres, sval); 
        res = bigint_is_null(res);
     END IF;
  END IF;
  RETURN res;
end;
$$;


ALTER FUNCTION public.exec_to_bigint(sql text, sval bigint) OWNER TO postgres;

--
-- Name: FUNCTION exec_to_bigint(sql text, sval bigint); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION exec_to_bigint(sql text, sval bigint) IS 'Выполнить команду execute с возвратом значения типа bigint';


--
-- Name: exec_to_bool(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION exec_to_bool(sql text) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE 
  res boolean;
  sres text;
begin
  /*
  Выполнить команду execute с возвратом значения типа boolean
  */ 
  res = false;
  sql = str_is_null(sql);
  IF (sql <> '') THEN
     execute sql into sres;
     sres = str_is_null(sres);
     res = str_as_bool(sres); 
     res = bool_is_null(res);
  END IF;
  RETURN res;
end;
$$;


ALTER FUNCTION public.exec_to_bool(sql text) OWNER TO postgres;

--
-- Name: FUNCTION exec_to_bool(sql text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION exec_to_bool(sql text) IS 'Выполнить команду execute с возвратом значения типа boolean';


--
-- Name: exec_to_double_precision(text, double precision); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION exec_to_double_precision(sql text, sval double precision DEFAULT 0.0) RETURNS double precision
    LANGUAGE plpgsql
    AS $$
DECLARE 
  res double precision;
  sres text;
begin
  /*
  Выполнить команду execute с возвратом значения типа exec_to_double_precision
  */ 
  sval = float_is_null(sval);
  res = sval;
  sql = str_is_null(sql);
  IF (sql <> '') THEN
     execute sql into sres;
     sres = str_is_null(sres);
     IF (its_float(sres) = true) THEN
        res = str_as_float(sres, sval); 
        res = float_is_null(res);
     END IF;
  END IF;
  RETURN res;
end;
$$;


ALTER FUNCTION public.exec_to_double_precision(sql text, sval double precision) OWNER TO postgres;

--
-- Name: FUNCTION exec_to_double_precision(sql text, sval double precision); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION exec_to_double_precision(sql text, sval double precision) IS 'Выполнить команду execute с возвратом значения типа exec_to_double_precision';


--
-- Name: exec_to_integer(text, integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION exec_to_integer(sql text, sval integer DEFAULT 0) RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE 
  res integer;
  sres text;
begin
  /*
  Выполнить команду execute с возвратом значения типа integer
  */ 
  sval = int_is_null(sval);
  res = sval;
  sql = str_is_null(sql);
  IF (sql <> '') THEN
     execute sql into sres;
     sres = str_is_null(sres);
     IF (its_integer(sres) = true) THEN
        res = str_as_int(sres, sval); 
        res = int_is_null(res);
     END IF;
  END IF;
  RETURN res;
end;
$$;


ALTER FUNCTION public.exec_to_integer(sql text, sval integer) OWNER TO postgres;

--
-- Name: FUNCTION exec_to_integer(sql text, sval integer); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION exec_to_integer(sql text, sval integer) IS 'Выполнить команду execute с возвратом значения типа integer';


--
-- Name: exec_to_str(text, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION exec_to_str(sql text, sval character varying DEFAULT ''::character varying) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE res character varying;
begin
  /*
  Выполнить команду execute с возвратом значения типа character varying
  Пример:
    select * from exec_to_str('select * from proptype_name_get(5);');
    SELECT (select * from exec_to_str('select * from proptype_name_get(5); ')), (select * from exec_to_str('select * from proptype_name_get(1);'));
    SELECT (select * from exec_to_str('select * from proptype_name_get(5); ')) || ' : ' || (select * from exec_to_str('select * from proptype_name_get(1);'));
  */
  sval = str_is_null(sval);
  res = sval;
  sql = str_is_null(sql);
  IF (sql <> '') THEN
     execute sql into res;
     res = str_is_null(res, sval);
  END IF;
  RETURN res;
end;
$$;


ALTER FUNCTION public.exec_to_str(sql text, sval character varying) OWNER TO postgres;

--
-- Name: FUNCTION exec_to_str(sql text, sval character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION exec_to_str(sql text, sval character varying) IS 'Выполнить команду execute с возвратом значения типа character varying';


--
-- Name: exec_to_text(text, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION exec_to_text(sql text, sval text DEFAULT ''::text) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE res text;
begin
  /*
  Выполнить команду execute с возвратом значения типа text
  Пример: 
    select * from exec_to_text('select * from proptype_name_get(5);'); 
    SELECT (select * from exec_to_text('select * from proptype_name_get(5); ')), (select * from exec_to_text('select * from proptype_name_get(1);')); 
    SELECT (select * from exec_to_text('select * from proptype_name_get(5); ')) ||' : ' || (select * from exec_to_text('select * from proptype_name_get(1);')); 
  */ 
  sval = str_is_null(sval);
  res = sval;
  sql = str_is_null(sql);
  IF (sql <> '') THEN
     execute sql into res;
     res = str_is_null(res, sval);
  END IF;
  RETURN res;
end;
$$;


ALTER FUNCTION public.exec_to_text(sql text, sval text) OWNER TO postgres;

--
-- Name: FUNCTION exec_to_text(sql text, sval text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION exec_to_text(sql text, sval text) IS 'Выполнить команду execute с возвратом значения типа text';


--
-- Name: float_as_str(double precision); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION float_as_str(v double precision) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
BEGIN
  -- Конвертировать double precision в строку
  -- select * from float_as_str(12.5);
  -- select * from float_as_str(12);
  -- select * from float_as_str(-99999.99999);
  res = 0;
  v = float_is_null(v);
  res = cast(v as character varying);
  res = str_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.float_as_str(v double precision) OWNER TO postgres;

--
-- Name: FUNCTION float_as_str(v double precision); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION float_as_str(v double precision) IS 'Конвертировать double precision в строку';


--
-- Name: float_is_null(double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION float_is_null(sx double precision, sdef double precision DEFAULT 0.0) RETURNS double precision
    LANGUAGE plpgsql
    AS $$
BEGIN
  -- Контроль значения типа double precision (проверка на NULL и замена NULL на значение по умочанию)
  /*
   select * from public.float_is_null(5, 20); -- 5
   select * from public.float_is_null(null, 20); -- 20
   select * from public.float_is_null(null, -20); --  -20
   select * from public.float_is_null(null); -- 0
  */
  IF (sx is NULL) THEN
      IF (sdef is NULL) THEN sdef=0.0; END IF;
      RETURN sdef;
  ELSE
    RETURN sx;
  END IF;
END;
$$;


ALTER FUNCTION public.float_is_null(sx double precision, sdef double precision) OWNER TO postgres;

--
-- Name: FUNCTION float_is_null(sx double precision, sdef double precision); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION float_is_null(sx double precision, sdef double precision) IS 'Контроль значения типа double precision (проверка на NULL и замена NULL на значение по умочанию)';


--
-- Name: float_str_normal(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION float_str_normal(sx character varying, ch_point character varying DEFAULT '.'::character varying) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
  k integer;
BEGIN
  -- Нормализовать строку, как float
  /*
   Примеры: 
    select * from float_str_normal('12.5');
    select * from float_str_normal('12,5');
    select * from float_str_normal('12,5',',');
    select * from float_str_normal('12');
    select * from float_str_normal('12',',');
  */  
  res = str_is_null(sx);
  ch_point = str_is_null(ch_point);
  IF (ch_point = '') THEN ch_point = '.'; END IF;
  IF (its_float(res, ch_point)  = false) THEN res = '0'; END IF;
  k = position(ch_point in res);
  IF (k<=0) THEN res = res || ch_point || '0'; END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.float_str_normal(sx character varying, ch_point character varying) OWNER TO postgres;

--
-- Name: FUNCTION float_str_normal(sx character varying, ch_point character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION float_str_normal(sx character varying, ch_point character varying) IS 'Нормализовать строку, как float';


--
-- Name: fn_calc_as_float(text, t_float); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION fn_calc_as_float(sexpr text, val_def t_float DEFAULT 0) RETURNS t_float
    LANGUAGE plpgsql
    AS $$
  DECLARE res t_float;
  stext text;
begin
  /*
  Вычисление арифметического выражения заданного строкой символов
  Пример: 
    select * from fn_calc_as_float('2 + 2 * 2'); -- 6
    select * from fn_calc_as_float('(2 + 2) * 2'); -- 8
    select * from fn_calc_as_float('(1*3.003+2+5.0/3)*4'); -- 26.6786666666667
    select * from fn_calc_as_float('(a*3.003+2+5.0/3)*4'); -- ошибка (а - не определено)
  */ 
  val_def = float_is_null(val_def);
  res = val_def;
  sexpr = str_is_null(sexpr);
  IF (sexpr <> '') THEN
     execute 'select 1.0*(' || sexpr || ');' into stext;
     stext = str_is_null(stext, cast(val_def as character varying));
     res = cast(stext as t_float);
  END IF;
  RETURN res;
end;
$$;


ALTER FUNCTION public.fn_calc_as_float(sexpr text, val_def t_float) OWNER TO postgres;

--
-- Name: FUNCTION fn_calc_as_float(sexpr text, val_def t_float); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION fn_calc_as_float(sexpr text, val_def t_float) IS 'Вычисление арифметического выражения заданного строкой символов';


--
-- Name: if_then(boolean, text, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION if_then(v boolean, syes text DEFAULT 'TRUE'::text, sno text DEFAULT 'FALSE'::text) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE res text;
BEGIN
  -- Конвертация значений типа boolean в заданную строку символов
  sno = str_is_null(sno);
  IF (sno = '') THEN sno = 'FALSE'; END IF;
  v = bool_is_null(v);
  if (v = TRUE) THEN
     syes = str_is_null(syes);
     IF (syes = '') THEN syes  = 'TRUE'; END IF;
     res = syes;
  ELSE
     res = sno ;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.if_then(v boolean, syes text, sno text) OWNER TO postgres;

--
-- Name: FUNCTION if_then(v boolean, syes text, sno text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION if_then(v boolean, syes text, sno text) IS 'Конвертация значений типа boolean в заданную строку символов';


--
-- Name: int_as_str(integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION int_as_str(v integer) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
BEGIN
  -- Конвертировать integer в строку
  -- select * from int_as_str(12);
  -- select * from int_as_str(-22759881);
  res = '0';
  v = int_is_null(v);
  res = cast(v as character varying);
  res = str_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.int_as_str(v integer) OWNER TO postgres;

--
-- Name: FUNCTION int_as_str(v integer); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION int_as_str(v integer) IS 'Конвертировать integer в строку';


--
-- Name: int_is_null(integer, integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION int_is_null(sx integer, sdef integer DEFAULT 0) RETURNS integer
    LANGUAGE plpgsql
    AS $$
BEGIN
  -- Контроль значения типа integer (проверка на NULL и замена NULL на значение по умочанию)
  /*
     select * from int_is_null(null, -5);
     select * from int_is_null(null);
     select * from int_is_null(0, -5);
  */
  IF (sx is NULL) THEN
      IF (sdef is NULL) THEN sdef=0; END IF;
      RETURN sdef;
  ELSE
    RETURN sx;
  END IF;
END;
$$;


ALTER FUNCTION public.int_is_null(sx integer, sdef integer) OWNER TO postgres;

--
-- Name: FUNCTION int_is_null(sx integer, sdef integer); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION int_is_null(sx integer, sdef integer) IS 'Контроль значения типа integer (проверка на NULL и замена NULL на значение по умочанию)';


--
-- Name: its_bigint(character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION its_bigint(sx character varying, yes_sign boolean DEFAULT true) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  v float;
  b boolean;
BEGIN
/*
    Проверка, что строка - это целое число (bigint)
    sx - тестируемая строка
    yes_sign - флаг. Если >0, то учитывать знак (+/-)
    Пример вызова:
       select * from its_bigint('-127739.',true); -- false
       select * from its_bigint('-127.739',true); -- false
       select * from its_bigint('-127739',true);  -- true
       select * from its_bigint('-127739',false); -- false
       select * from its_bigint('127739',false);  -- true
  */
  res = false;
  sx = str_is_null(sx);
  IF (sx <> '') THEN
     IF (position('.' in sx)<=0) THEN
        IF (position(',' in sx)<=0) THEN
           b = its_float(sx,'',yes_sign,false,false);
           IF (b=TRUE) THEN
              res = true;
              V = CAST(sx as float);
              IF (v < -9223372036854775808) THEN
                 res = false;
              ELSE
                 IF (v > 9223372036854775807) THEN
                    res = false;
                 END IF;
              END IF;
           END IF;
        END IF;
     END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.its_bigint(sx character varying, yes_sign boolean) OWNER TO postgres;

--
-- Name: FUNCTION its_bigint(sx character varying, yes_sign boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION its_bigint(sx character varying, yes_sign boolean) IS 'Проверка, что строка - это целое число (bigint)';


--
-- Name: its_bool(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION its_bool(v character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE res boolean;
BEGIN
  -- Проверка, что строка - это логическое значение (boolean)
  -- select * from its_bool('9');
  -- select * from its_bool('ФальшЬ');
  -- select * from its_bool('Y');
  -- select * from its_bool('Д');
  -- select * from its_bool('N');
  -- select * from its_bool('Nt');
  -- select * from its_bool('Н');
  -- select * from its_bool('.t.');  
  res = false;
  v = upper(str_is_null(v));
  if (v = '.T.') THEN res = true; END IF;
  if (v = 'T') THEN res = true; END IF;
  if (v = 'TRUE') THEN res = true; END IF;
  if (v = '.F.') THEN res = true; END IF;
  if (v = 'F') THEN res = true; END IF;
  if (v = 'FALSE') THEN res = true; END IF;
  if (v = 'Y') THEN res = true; END IF;
  if (v = 'YES') THEN res = true; END IF;
  if (v = 'YE') THEN res = true; END IF;
  if (v = 'N') THEN res = true; END IF;
  if (v = 'NOT') THEN res = true; END IF;
  if (v = 'NO') THEN res = true; END IF;
  if (v = '1') THEN res = true; END IF;
  if (v = '0') THEN res = true; END IF;
  if (v = '+') THEN res = true; END IF;
  if (v = '-') THEN res = true; END IF;
  if (v = 'OK') THEN res = true; END IF;
  if (v = 'CANCEL') THEN res = true; END IF;
  if (v = 'Д') THEN res = true; END IF;
  if (v = 'ДА') THEN res = true; END IF;
  if (v = 'Н') THEN res = true; END IF;
  if (v = 'НЕ') THEN res = true; END IF;
  if (v = 'НЕТ') THEN res = true; END IF;
  if (v = 'ИСТИНА') THEN res = true; END IF;
  if (v = 'И') THEN res = true; END IF;  
  if (v = 'ФАЛЬШ') THEN res = true; END IF;
  if (v = 'ФАЛЬШЬ') THEN res = true; END IF;
  if (v = 'Ф') THEN res = true; END IF;  
  RETURN res;
END;
$$;


ALTER FUNCTION public.its_bool(v character varying) OWNER TO postgres;

--
-- Name: FUNCTION its_bool(v character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION its_bool(v character varying) IS 'роверка, что строка - это логическое значение (boolean)?';


--
-- Name: its_float(character varying, character varying, boolean, boolean, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION its_float(sx character varying, ch_point character varying DEFAULT '.,'::character varying, yes_sign boolean DEFAULT true, yes_point_start boolean DEFAULT false, yes_point_end boolean DEFAULT false) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
   i integer;  
   m integer;
   ch varchar(1);
   c integer;
   cp integer;
   ch_ok varchar(20);
   v float;
   res boolean;
BEGIN
  /*
    Проверка, что строка - это число (float)
    sx - тестируемая строка
    ch_point - строка символов-разделителей целой и дробной части числа (точка и запятая)...
    yes_sign - флаг. Если >0, то учитывать знак (+/-)
    yes_point_start - если true, то точка может быть первым символом
    yes_point_end - если true, то точка может быть последним символом
    Пример вызова:
       select * from its_float('-127739.','.',true,false,false);
       select * from its_float('-127739.','.',true,false,true);
       select * from its_float('-1277.39','.',true);  -- Результат:  true
       select * from its_float('-1277.39','.',true);  -- Результат:  true
       select * from its_float('12773,99','.',true,false,true);
       select * from its_float('12773,99',',.',true,false,true); //допустимы два разделителя
       select * from its_float('12773.99','.',true,false,true);
       select * from its_float('0.12773','.',true,false,true);
       select * from its_float('.12773','.',true,false,true);
       select * from its_float('.12773','.',true,true,true);
       select * from its_float('.12773.','.',true,true,true);
  */
  res = false;
  sx = str_is_null(sx); 
  c = CHAR_LENGTH(sx);
  IF (c >0) THEN
     ch_point = str_is_null(ch_point);
     IF (ch_point = '') THEN ch_point = '.,'; END IF;
     yes_sign = bool_is_null(yes_sign, true);
     yes_point_start = bool_is_null(yes_point_start);
     yes_point_end = bool_is_null(yes_point_end);
     cp = 0;
     ch_ok = '0123456789' || ch_point;
     IF (yes_sign = true) THEN
         ch_ok = ch_ok || '+-';
     END IF;
     res = true;
     i = 0;
     WHILE (i < c) LOOP
       i =  i + 1;
       ch = substring(sx,i,1);
       IF (POSITION(ch in ch_point)>0) THEN
          cp = cp + 1;
          /* ......................................... */
          -- контроль корректности в контексте точки в начале
          IF (yes_point_start = false) THEN
              IF (i = 1) THEN
                 res=false;
                 i = c + 1; /* exit */
              END IF;
          END IF;
          /* ......................................... */
          /* ......................................... */
          -- контроль корректности в контексте точки в конце
          IF (yes_point_end = false) THEN
              IF (i = c) THEN
                 res=false;
                 i = c + 1; /* exit */
              END IF;
          END IF;
          /* ......................................... */
        END IF;
       m = POSITION(ch in ch_ok);
       IF (m <= 0) THEN
          /* встретился запрещенный символ */
          res=false;
          i = c + 1; /* exit */
       ELSE
         /* проверяем знак +/- */                        
         IF (yes_sign = TRUE) THEN
            m = POSITION(ch in '+-');
            IF (m > 0) THEN
               IF (i > 1) THEN
                  /* знак +/- не на своем месте */
                  res=false;
                  i = c + 1; /* exit */
               END IF; 
            END IF; 
         END IF; 
       END IF;         
     END LOOP;
     IF (cp > 1) THEN res = false; END IF;
  END IF; 
  RETURN res;
END;
$$;


ALTER FUNCTION public.its_float(sx character varying, ch_point character varying, yes_sign boolean, yes_point_start boolean, yes_point_end boolean) OWNER TO postgres;

--
-- Name: FUNCTION its_float(sx character varying, ch_point character varying, yes_sign boolean, yes_point_start boolean, yes_point_end boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION its_float(sx character varying, ch_point character varying, yes_sign boolean, yes_point_start boolean, yes_point_end boolean) IS 'Проверка, что строка - это число (float)';


--
-- Name: its_integer(character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION its_integer(sx character varying, yes_sign boolean DEFAULT true) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  v float;
  -- k integer;
  b boolean;
BEGIN
/*
    Проверка, что строка - это целое число (integer)
    sx - тестируемая строка
    yes_sign - флаг. Если >0, то учитывать знак (+/-)
    Пример вызова:
       select * from its_integer('-127739.',true); -- false
       select * from its_integer('-127.739',true); -- false
       select * from its_integer('-127739',true);  -- true
       select * from its_integer('-127739',false); -- false
       select * from its_integer('127739',false);  -- true
  */
  res = false;
  sx = str_is_null(sx);
  IF (sx <> '') THEN
     IF (position('.' in sx)<=0) THEN
        IF (position(',' in sx)<=0) THEN
           b = its_float(sx,'',yes_sign,false,false);
           IF (b=TRUE) THEN
              res = true;
              V = CAST(sx as float);
              IF (v < -2147483648) THEN
                 res = false;
              ELSE
                 IF (v > 2147483647) THEN
                    res = false;
                 END IF;
              END IF;
           END IF;
        END IF;
     END IF;
  END IF;
  RETURN res; 
END;
$$;


ALTER FUNCTION public.its_integer(sx character varying, yes_sign boolean) OWNER TO postgres;

--
-- Name: FUNCTION its_integer(sx character varying, yes_sign boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION its_integer(sx character varying, yes_sign boolean) IS 'Проверка, что строка - это целое число (integer)';


--
-- Name: q39_dub(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION q39_dub(sx text) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
  res text;
BEGIN
  /*
  Продублировать одинарные кавычки к строке (text)
  Пример:
    select ('абв ' || chr(39) || 'гд' || chr(39));
    select * from q39_dub('абв ' || chr(39) || 'гд' || chr(39));
    select * from q39_dub(null);
  */
  res = str_is_null(sx, '', false);
  res = replace(res, chr(39), chr(39) || chr(39));
  return res;
END;
$$;


ALTER FUNCTION public.q39_dub(sx text) OWNER TO postgres;

--
-- Name: FUNCTION q39_dub(sx text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION q39_dub(sx text) IS 'Продублировать одинарные кавычки к строке (text)';


--
-- Name: q39_lr(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION q39_lr(sx text) RETURNS text
    LANGUAGE plpgsql
    AS $$
BEGIN
  /*
  Добавить одинарные кавычки к строке (text) слева и справа. Контроль NULL. Удаление пробелов во входной строке (text) слева и справа
  Пример:
    select * from q39_lr('абвгд');
    select * from q39_lr(null);
  */
  return chr(39) || str_is_null(sx)  || chr(39);
END;
$$;


ALTER FUNCTION public.q39_lr(sx text) OWNER TO postgres;

--
-- Name: FUNCTION q39_lr(sx text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION q39_lr(sx text) IS 'Добавить одинарные кавычки к строке (text) слева и справа. Контроль NULL. Удаление пробелов во входной строке (text) слева и справа';


--
-- Name: q39_lr(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION q39_lr(sx character varying) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
BEGIN
  /*
  Добавить одинарные кавычки к строке слева и справа. Контроль NULL. Удаление пробелов во входной строке слева и справа
  Пример:
    select * from q39_lr('абвгд');
    select * from q39_lr(null);
  */
  return chr(39) || str_is_null(sx)  || chr(39);
END;
$$;


ALTER FUNCTION public.q39_lr(sx character varying) OWNER TO postgres;

--
-- Name: FUNCTION q39_lr(sx character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION q39_lr(sx character varying) IS 'Добавить одинарные кавычки к строке слева и справа';


--
-- Name: script_pg_execute(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_execute(scr text) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  b  boolean; 
  yes_next boolean;
  yes_done boolean;
  v_name character varying;
  v_expr text;
  v_val character varying;
  v_tmp t_float;
  scom text;
  s_left text /*character varying*/;
  s_right text /*character varying*/;
  code_op integer;
  --cline integer;
  --iline integer;
  k integer;
  k1 integer;
  k2 integer;
  iline integer;                                                
  lines_count integer;
  n_rec integer;
  n1_block integer;
  n2_block integer;
  slt integer;
  v t_float;
  v_left t_float;
  v_right t_float;
      
BEGIN
  -- Выполнить pg-скрипт
/*
-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from script_pg_execute
('
m:=0;
');
select * from scr_pg_vars_tt999 order by var_name;
-- select * from scr_pg_000_tt999 order by n;
-- select * from script_pg_vars_table_tmp_drop();
-- ................................................

-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from script_pg_execute
('
m:=0;
s:=0;
z:=0;
j:=0;
WHILE z<10 do
  z := z + 1;
  j:=0;
  WHILE j<10 do
    j := j + 1;
    s := s+1; 
    if s <= 3 then
       m:=m+1;
    else
       m := m+10;   
    end_if;
    a:=333.4;
    b := 444;
    d:=55;
    x:=(a + b) / (a - b) * d + 17.5;
    IF X>99 THEN
       b := x-5;
       IF b>3 THEN
          d:=34;
       ELSE
          d:= 72;   
       END_IF;
    END_IF;
  END_WHILE;
END_WHILE;
');
select * from scr_pg_vars_tt999 order by var_name;
-- select * from scr_pg_000_tt999 order by n;
-- select * from script_pg_vars_table_tmp_drop();
-- ................................................

-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from scr_pg_vars_tt999 order by var_name;
select * from script_pg_execute
    (
    '
    a:=333.4;
    b := 444;
    d:=55;
    x:=(a + b) / (a - b) * d + 17.5;
    '
    );
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop(); 
-- ................................................

-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from scr_pg_vars_tt999 order by var_name;
select * from public.script_pg_execute
    (
    '
    a:=333.4;
    Перем_Строка:="Привет, как дела?";
    '
    );
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop(); 
-- ................................................

-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from scr_pg_vars_tt999 order by var_name;
select * from public.script_pg_execute
    (
    '
    Npp:=ТаблицаПолеЗначениеКакЧислоПолучить("tmp.docs_list", "npp", "id=2");
    note:=ТаблицаПолеЗначениеКакСтрокаПолучить("tmp.docs_list", "note", "id=2");
    doc_name:=ТаблицаПолеЗначениеКакСтрокаПолучить("tmp.docs_list", "doc_name", "id=2");
    B:=ТаблицаПолеЗначениеКакЛогическоеПолучить("tmp.docs_list", "its_actual", "id=2");
    Сум_Npp:=ТаблицаПолеЗначениеКакЧислоПолучить("tmp.docs_list", "sum(npp)", "id>0");
    '
    );
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop(); 
-- ................................................

-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from scr_pg_vars_tt999 order by var_name;
select * from public.script_pg_execute
    (
    '
    ФИО:=ТаблицаПолеЗначениеКакСтрокаПолучить("tmp.fio_list", "fio", "code=106");
    ФИО_изм := "Некто Новый...";
    Результат_Записи_ФИО:=ТаблицаПолеЗначениеКакСтрокаЗаписать("tmp.fio_list", "fio", "code=106", ФИО_изм);
    Оклад := ТаблицаПолеЗначениеКакЧислоПолучить("tmp.fio_list", "oklad", "code=106");
    Оклад_Расчетный := (Оклад + 100) * 1.8;
    Результат_Записи_Оклада:=ТаблицаПолеЗначениеКакЧислоЗаписать("tmp.fio_list", "oklad", "code=106", Оклад_Расчетный);
    Активность:=ТаблицаПолеЗначениеКакЛогическоеПолучить("tmp.fio_list", "yes_active", "code=106");
    Результат_Записи_Активности:=ТаблицаПолеЗначениеКакСтрокаЗаписать("tmp.fio_list", "yes_active", "code=106", "True");
    Результат_Записи_Даты1:=ТаблицаПолеЗначениеКакСтрокаЗаписать("tmp.fio_list", "d1", "code=106", "2022-07-01");
    Результат_Записи_Даты2:=ТаблицаПолеЗначениеКакСтрокаЗаписать("tmp.fio_list", "d2", "code=106", "2022-07-31");
    Результат_Записи_Прим:=ТаблицаПолеЗначениеКакСтрокаЗаписать("tmp.fio_list", "note", "code=106", "Примечание какое-то");
    
    '
    );
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop(); 
-- ................................................
*/  



/*
301 ТаблицаПолеЗначениеКакЧислоПолучить
302 ТаблицаПолеЗначениеКакСтрокаПолучить
303 ТаблицаПолеЗначениеКакЛогическоеПолучить
331 ТаблицаПолеЗначениеКакЧислоЗаписать
332 ТаблицаПолеЗначениеКакСтрокаЗаписать
333 ТаблицаПолеЗначениеКакЛогическоеЗаписать
*/



  res = false;
  scr= str_is_null(scr);
  IF (scr <> '') THEN
     b = script_pg_table_tmp_000_create();
     lines_count = script_pg_parse(scr);
     IF (lines_count>0) THEN
        iline = 0;
        WHILE (iline<lines_count) LOOP
          iline = iline + 1;
          select
            n, -- номер строки (команды) скрипта
            sline_type, -- тип строки скрипта. 0-"обычная", 1-формула, 2-IF, 3-ELSE, 4-END_IF, 5-WHILE, 6-END_WHILE
            block_n1, -- начало блока (номер строки) 
            block_n2, -- конец блока (номер строки)
            sline -- текст строки (команды) скрипта
          into
            n_rec, slt, n1_block, n2_block, scom              
          from
            scr_pg_000_tt999
          where
            n = iline;                                                                           

          scom = str_is_null(scom );
          res = true;
          n_rec = int_is_null(n_rec);                                                        
          n1_block = int_is_null(n1_block);                                                        
          n2_block = int_is_null(n2_block);                                                        
          slt = int_is_null(slt);
          yes_done = false;

          -- ............................................................
          IF ((slt = 1) or  (slt between 100 and 999)) THEN  -- формула или спец.функции
            k1 = position(':=' in scom );
            IF (k1>0) THEN
                v_name = substr(scom, 1, k1-1);
                v_name = str_is_null(v_name);
                IF (v_name <> '') THEN
                   v_expr = substr(scom, k1+2, char_length(scom));
                   v_expr = str_is_null(v_expr);
                   IF (v_expr <> '') THEN
                      yes_next = true;
                   END IF;
                END IF;
            END IF;
            IF (yes_next = true) THEN
               k1 = position('"' in v_expr);
               IF (k1<=0) THEN k1 = position(chr(39) in v_expr); END IF;
               IF (slt = 1) THEN  -- формула
                  --v_tmp = 0.0;                
                  IF (k1<=0) THEN 
                     v_tmp = script_pg_line_as_formula_execute(v_expr); 
                     b = script_pg_var_as_float_set(v_name, v_tmp);
                  ELSE
                     v_expr = str_char1_trim(v_expr, '"', true);
                     b = script_pg_var_as_str_set(v_name, v_expr);
                  END IF;
               ELSE -- спец.функции
                  v_expr = script_pg_spec_func_execute(slt, v_expr); 
                  IF (its_float(v_expr)=true) THEN
                     b = script_pg_var_as_float_set(v_name, str_as_float(v_expr, 0.0));
                  ELSE
                     b = script_pg_var_as_str_set(v_name, v_expr);
                  END IF;
               END IF;
            END IF;
          END IF; 
          -- ............................................................
         
          -- ............................................................
          IF (slt = 3) THEN  -- ELSE
             iline = n2_block; -- переходим ЗА "свой" END_IF
          END IF; 
          -- ............................................................
        
          -- ............................................................
          IF (slt = 4) THEN -- END_IF
             -- ничего не делаем 
          END IF; 
          -- ............................................................

          -- ............................................................
          IF (slt = 6) THEN -- END_WHILE
             iline = n1_block-1; -- возвращаемся на "свой" WHILE                                                                                                             
          END IF; 
          -- ............................................................

          -- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                                                                                                                                                                                                                                                    
          IF (slt in (2,5)) THEN  -- IF, WHILE
             s_left='';
             s_right='';
             code_op = 0;

             IF (slt = 5) THEN
                -- PERFORM debuglog_add( 'script_pg_execute', 'WHILE', 'scom ', iline, scom, '');
             END IF;

             -- ........................................
             -- порядок не менять!!!
             k1 = 0;
             IF (k1<=0) THEN k1=position('><' in upper(scom)); END IF;
             IF (k1<=0) THEN k1=position('=>' in upper(scom)); END IF;
             IF (k1<=0) THEN k1=position('=<' in upper(scom)); END IF;
             IF (k1<=0) THEN k1=position('==' in upper(scom)); END IF;
             IF (k1<=0) THEN k1=position('>>' in upper(scom)); END IF;
             IF (k1<=0) THEN k1=position('<<' in upper(scom)); END IF;

             IF (k1<=0) THEN 
                k1=position('<>' in upper(scom));
                IF (k1>0) THEN
                   code_op = 1;
                   s_left = substring(scom , 1, k1-1);
                   s_left = str_is_null(s_left);
                   s_right = substring(scom , k1+char_length('<>'), char_length(scom ));
                   s_right = str_is_null(s_right);
                END IF;                 
             END IF;
             
             IF (k1<=0) THEN 
                k1=position('<=' in upper(scom)); 
                IF (k1>0) THEN
                   code_op = 2;
                   s_left = substring(scom , 1, k1-1);
                   s_left = str_is_null(s_left);
                   s_right = substring(scom , k1+char_length('<='), char_length(scom ));
                   s_right = str_is_null(s_right);
                END IF;                 
             END IF;

             IF (k1<=0) THEN 
                k1=position('>=' in upper(scom)); 
                IF (k1>0) THEN
                   code_op = 3;
                   s_left = substring(scom , 1, k1-1);
                   s_left = str_is_null(s_left);
                   s_right = substring(scom , k1+char_length('>='), char_length(scom ));
                   s_right = str_is_null(s_right);
                END IF;                 
             END IF;

             IF (k1<=0) THEN 
                k1=position('=' in upper(scom)); 
                IF (k1>0) THEN
                   code_op = 4;
                   s_left = substring(scom , 1, k1-1);
                   s_left = str_is_null(s_left);
                   s_right = substring(scom , k1+char_length('='), char_length(scom ));
                   s_right = str_is_null(s_right);
                END IF;                 
             END IF;

             IF (k1<=0) THEN 
                k1=position('<' in upper(scom)); 
                IF (k1>0) THEN
                   code_op = 5;
                   s_left = substring(scom , 1, k1-1);
                   s_left = str_is_null(s_left);
                   s_right = substring(scom , k1+char_length('<'), char_length(scom ));
                   s_right = str_is_null(s_right);
                END IF;                 
                
             END IF;

             IF (k1<=0) THEN 
                k1=position('>' in upper(scom)); 
                IF (k1>0) THEN
                   code_op = 6;
                   s_left = substring(scom , 1, k1-1);
                   s_left = str_is_null(s_left);
                   s_right = substring(scom , k1+char_length('>'), char_length(scom ));
                   s_right = str_is_null(s_right);
                END IF;                 
             END IF;
             -- ........................................

             -- ****************************************************                                                                                                                                    
             IF (code_op>0) THEN
                v_left = 0;
                v_right = 0;
                IF (s_left <> '') THEN
                   IF (its_float(s_left) = false) THEN
                      v_left = script_pg_var_as_float_get(s_left);
                   ELSE      
                     v_left = str_as_float(s_left);                               
                   END IF;
                ELSE
                  res = false;
                  EXIT;
                END IF;                        
                IF (s_right <> '') THEN
                   IF (its_float(s_right) = false) THEN
                      v_right = script_pg_var_as_float_get(s_right);
                   ELSE      
                     v_right = str_as_float(s_right);                               
                   END IF;
                ELSE
                  res = false;
                  EXIT;
                END IF;                        

                -- ........................................
                IF (slt in (2, 5)) THEN  -- IF или WHILE
                   IF (code_op = 1) THEN   -- <>
                      IF (v_left = v_right) THEN -- условие НЕ выполнено
                         iline = n2_block;  -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
                      END IF;                       
                   END IF;                                    
                   IF (code_op = 2) THEN   -- <=
                      IF (v_left > v_right) THEN -- условие НЕ выполнено
                         iline = n2_block;  -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
                      END IF;                       
                   END IF;                                    
                   IF (code_op = 3) THEN   -- >=
                      IF (v_left < v_right) THEN -- условие НЕ выполнено
                         iline = n2_block;  -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
                      END IF;                       
                   END IF;                                    

                   IF (code_op = 4) THEN   -- =
                      IF (v_left <> v_right) THEN -- условие НЕ выполнено
                         iline = n2_block;  -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
                      END IF;                       
                   END IF;
                   
                   IF (code_op = 5) THEN   -- <
                      IF (v_left >= v_right) THEN -- условие НЕ выполнено
                         iline = n2_block;  -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
                      END IF;                       
                   END IF;                                    
                   IF (code_op = 6) THEN   -- >
                      IF (v_left <= v_right) THEN -- условие НЕ выполнено
                         iline = n2_block;  -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
                      END IF;                       
                   END IF;                                    
                END IF;                                    
                -- ........................................
                    
             ELSE
               -- Выход с ошибкой
               res = false;
               EXIT;
             END IF;
             -- ****************************************************                                                                                                                                    

          END IF; 
          -- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                                                                                                                                                                                                                                                    
            
        END LOOP;
     END IF;
     b = script_pg_table_tmp_000_drop();
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_execute(scr text) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_execute(scr text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_execute(scr text) IS 'Выполнить pg-скрипт';


--
-- Name: script_pg_line_as_formula_execute(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_line_as_formula_execute(scr text) RETURNS t_float
    LANGUAGE plpgsql
    AS $$
DECLARE
  res t_float;
  
BEGIN
  -- Вычислить строку-формулу (pg-скрипт)
  /*
    select * from public.script_pg_line_as_formula_execute('(1+2) / (3-5)');
    select * from public.script_pg_line_as_formula_execute('(1.23+7)/(325-22)');
    -- ................................................
    select * from script_pg_vars_table_tmp_create();
    select * from script_pg_var_as_float_set('A',2);
    select * from script_pg_var_as_float_set('Б',1);
    select * from script_pg_var_as_float_set('d',3.5);
    select * from scr_pg_001_tt999 order by var_name;
    select * from script_pg_var_as_float_get('A');
    select * from script_pg_var_as_float_get('Б');
    select * from public.script_pg_line_as_formula_execute('(a + б) / (a - б) * d');
    select * from script_pg_vars_table_tmp_drop();
    -- ................................................
    
  */  
  res = 0;
  scr= str_is_null(scr);
  IF (scr <> '') THEN
     -- Парсинг scr с заменой переменных на их значения
     scr = script_pg_line_as_formula_parse(scr);
     res = fn_calc_as_float(scr);
  END IF;
  res = float_is_null(res);  
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_line_as_formula_execute(scr text) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_line_as_formula_execute(scr text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_line_as_formula_execute(scr text) IS 'Вычислить строку-формулу (pg-скрипт)';


--
-- Name: script_pg_line_as_formula_parse(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_line_as_formula_parse(scr text) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
  res text;
  opers character varying;
  sw character varying;
  yes_inword boolean;
  ch_op char;
  ch char;
  cch integer;
  k integer;
  ich integer;
  cw integer;
  iw integer;
  v t_float;
  
BEGIN
  -- Парсинг строки-формулы (pg-скрипт). Замена переменных на их значения (t_float) 
  /*
    select * from public.script_pg_line_as_formula_parse('(1.23+7)/(325-22)');
    select * from public.script_pg_line_as_formula_parse(' ( 1.23 + 7 ) / ( 325 - 22 ) ');
    select * from public.script_pg_line_as_formula_parse('1.23+7/(325-22) - 99');
    select * from public.script_pg_line_as_formula_parse('-5 + 7 - 99');
    select * from public.script_pg_line_as_formula_parse('- 5 + 7 - 99');
    -- ................................................
    select * from script_pg_table_tmp_001_create();
    select * from script_pg_var_as_float_set('A',3.348);
    select * from script_pg_var_as_float_set('Б',77);
    select * from scr_pg_001_tt999 order by var_name;
    select * from script_pg_var_as_float_get('A');
    select * from public.script_pg_line_as_formula_parse('(a + 2) - (б/2)');
    select * from script_pg_table_tmp_001_drop();
    -- ................................................
  */  
  res = '';
  scr= str_is_null(scr);
  IF (scr <> '') THEN
     -- ......................................
     -- возможно это лишнее
     scr = str_is_null(scr);
     scr =replace(scr, chr(10),' ');
     scr =replace(scr, chr(13),' ');
     scr =replace(scr, chr(9),' ');
     scr = str_is_null(scr);
     -- ......................................
  END IF;

  IF (scr <> '') THEN
     -- res = scr;
     opers = '/\*+-()';
     --scr = replace( scr,' ','|');
     cch = char_length(scr);
     yes_inword = false;
     ch_op = ' ';
     sw = '';
     
     ich = 0;
     WHILE (ich < cch) LOOP
      ich = ich + 1;     
      ch = substring(scr, ich, 1);
      k = position(ch in opers);
      IF (k>0) THEN
         -- Операция 
         ch_op = ch;
         sw = str_is_null(sw);
         IF (sw <> '') THEN
            IF (its_float(sw) = false) THEN
               v =  script_pg_var_as_float_get(sw);
               sw = float_as_str(v);           
            END IF;
            sw = float_str_normal(sw);
            res = res || sw;
         END IF;
         res = res || ch_op;

         yes_inword = false;
         sw = '';
         ch_op = ' ';
      ELSE
         -- Переменная или значение
         yes_inword = true;
         sw = sw || ch;
      END IF;
     
     END LOOP;  

     IF (sw <> '') THEN
        IF (its_float(sw) = false) THEN
           v =  script_pg_var_as_float_get(sw);
           sw = float_as_str(v);           
        END IF;
        sw = float_str_normal(sw);
        res = res || sw;
     END IF;

  END IF;
  res = str_is_null(res);  
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_line_as_formula_parse(scr text) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_line_as_formula_parse(scr text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_line_as_formula_parse(scr text) IS 'Парсинг строки-формулы (pg-скрипт). Замена переменных на их значения (t_float) ';


--
-- Name: script_pg_parse(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_parse(scr text) RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
  res integer;
  b boolean;
  yes_777 boolean; 
  yes_next boolean;
  yes_done boolean;
  scommand text;
  sline_ text;
  cline integer;
  iline integer;
  its_comm_end boolean;
  sline_type_ integer;
  s_if text;
  s_while text;
  k integer;
  k1 integer;
  k2 integer;
  n0 integer;                           
  n1 integer;
  n2 integer;

  c_tt999 CURSOR FOR
    select
     n, -- номер строки (команды) скрипта
     sline_type, -- тип строки скрипта:
                 -- 0-"обычная", 1-формула, 2-IF, 3-ELSE, 4-END_IF, 5-WHILE, 6-END_WHILE,
                 -- 
     block_n1, -- начало блока (номер строки) 
     block_n2, -- конец блока (номер строки)
     sline -- текст строки (команды) скрипта
    from
      scr_pg_000_tt999
    order by n;                 
  
  
  
BEGIN
  -- Парсер скрипта (переписывает скрипт во временную таблицу scr_pg_000_tt999)
/*
-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse
('
s:=0;
');
select * from scr_pg_000_tt999 order by n;
-- select * from script_pg_table_tmp_000_drop();
-- ................................................


-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse
('
s:=0;
Знач_1 := ОбъектСвойствоЗначениеПолучить();
Сумма_1 := ОбъектыСвойствоЗначениеСуммаПолучить();
Средн_1 := ОбъектыСвойствоЗначениеСреднееПолучить();
Колво_1 := ОбъектыСвойствоКоличествоПолучить();
z:=0;
j:=0;
WHILE z<10 do
  z := z + 1;
  j:=0;
  WHILE j<10 do
    j := j + 1;
    s := s+1; 
    a:=333.4;
    b := 444;
    d:=55;
    x:=(a + b) / (a - b) * d + 17.5;
    IF X>99 THEN
       b := x-5;
       IF b>3 THEN
          d:=34;
       ELSE
          d:= 72;   
       END_IF;
    END_IF;
  END_WHILE;
END_WHILE;
');
select * from scr_pg_000_tt999 order by n;
select * from script_pg_table_tmp_000_drop();
-- ................................................

-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse
(
'
a:=333.4;
b := 444;
d:=55;
x:=(a + b) / (a - b) * d + 17.5;
'
);
select * from scr_pg_000_tt999 order by n;
select * from script_pg_table_tmp_000_drop();
-- ................................................
*/  

/*
301 ТаблицаПолеЗначениеКакЧислоПолучить
302 ТаблицаПолеЗначениеКакСтрокаПолучить
303 ТаблицаПолеЗначениеКакЛогическоеПолучить
331 ТаблицаПолеЗначениеКакЧислоЗаписать
332 ТаблицаПолеЗначениеКакСтрокаЗаписать
333 ТаблицаПолеЗначениеКакЛогическоеЗаписать
*/


  res = 0;
  scr= str_is_null(scr);
  IF (scr <> '') THEN
    cline = str_words_count(scr, chr(10));
    IF (cline > 0) THEN
       scommand = '';
       its_comm_end = false;
       
       iline = 0;
       WHILE (iline < cline) LOOP
        iline = iline + 1;
        sline_ = str_word_by_num(scr, iline, chr(10));
        sline_ = str_is_null(sline_);
        sline_ =replace(sline_, chr(10),' ');
        sline_ =replace(sline_, chr(13),' ');
        sline_ =replace(sline_, chr(9),' ');
        sline_ = str_is_null(sline_);
        yes_next = false;
        IF (sline_ <> '') THEN
           yes_next = true;
           IF (substring(sline_,1,1) = '*') THEN yes_next = false; END IF; -- строка-примечание
           IF (substring(sline_,1,2) = '--') THEN yes_next = false; END IF; -- строка-примечание              
           /*
           IF (substring(sline_,1,1) <> '*') THEN -- строка-примечание
              yes_next = true;
           END IF;
           */
        END IF;

        IF (yes_next = true) THEN
           its_comm_end = false;
           IF (substring(sline_,char_length(sline_),1) = ';') THEN -- конец команды
              sline_ = substring(sline_,1, char_length(sline_)-1);
	      its_comm_end = true;
           ELSE 
              IF ('ELSE' = upper(sline_)) THEN -- конец команды
                 its_comm_end = true; 
              END IF;               
              k = position('THEN' in upper(sline_));
              IF (k = (char_length(sline_)-char_length('THEN') +1)) THEN its_comm_end = true; END IF; -- конец команды
              k = position('DO' in upper(sline_));
              IF (k = (char_length(sline_)-char_length('DO') +1)) THEN its_comm_end = true; END IF; -- конец команды
           END IF;
           
           IF (its_comm_end = true) THEN
              sline_ = str_is_null(sline_);
              scommand = scommand || ' ' || sline_;
              res = res + 1;
              sline_type_ = 0;
              scommand = str_is_null(scommand);

              k = position(':=' in scommand); -- формула или какая-то спец команда
              IF (k>1) THEN 
                 yes_777 = false;
                 
                 -- .................................
                 IF (yes_777 = false) THEN 
                    k1 = position(upper('ТаблицаПолеЗначениеКакЧислоПолучить') in upper(scommand)); -- спец команда:
                    IF (k1<=0) THEN
                       k1 = position(upper('TableFieldValueAsFloatGet') in upper(scommand)); -- спец команда:
                    END IF;
                    IF (k1>(k+1)) THEN
                        yes_777 = true; 
                        sline_type_ = 301;
                    END IF;  
                 END IF;  
                 -- .................................                 
                 -- .................................
                 IF (yes_777 = false) THEN 
                    k1 = position(upper('ТаблицаПолеЗначениеКакСтрокаПолучить') in upper(scommand)); -- спец команда:
                    IF (k1<=0) THEN
                       k1 = position(upper('TableFieldValueAsStrGet') in upper(scommand)); -- спец команда:
                    END IF;
                    IF (k1>(k+1)) THEN
                        yes_777 = true; 
                        sline_type_ = 302;
                    END IF;  
                 END IF;  
                 -- .................................                 
                 -- .................................
                 IF (yes_777 = false) THEN 
                    k1 = position(upper('ТаблицаПолеЗначениеКакЛогическоеПолучить') in upper(scommand)); -- спец команда:
                    IF (k1<=0) THEN
                       k1 = position(upper('TableFieldValueAsBoolGet') in upper(scommand)); -- спец команда:
                    END IF;
                    IF (k1>(k+1)) THEN
                        yes_777 = true; 
                        sline_type_ = 303;
                    END IF;  
                 END IF;  
                 -- .................................                 
                 -- .................................
                 IF (yes_777 = false) THEN 
                    k1 = position(upper('ТаблицаПолеЗначениеКакЧислоЗаписать') in upper(scommand)); -- спец команда:
                    IF (k1<=0) THEN
                       k1 = position(upper('TableFieldValueAsFloatSet') in upper(scommand)); -- спец команда:
                    END IF;
                    IF (k1>(k+1)) THEN
                        yes_777 = true; 
                        sline_type_ = 331;
                    END IF;  
                 END IF;  
                 -- .................................                 
                 -- .................................
                 IF (yes_777 = false) THEN 
                    k1 = position(upper('ТаблицаПолеЗначениеКакСтрокаЗаписать') in upper(scommand)); -- спец команда:
                    IF (k1<=0) THEN
                       k1 = position(upper('TableFieldValueAsStrSet') in upper(scommand)); -- спец команда:
                    END IF;
                    IF (k1>(k+1)) THEN
                        yes_777 = true; 
                        sline_type_ = 332;
                    END IF;  
                 END IF;  
                 -- .................................                 
                 -- .................................
                 IF (yes_777 = false) THEN 
                    k1 = position(upper('ТаблицаПолеЗначениеКакЛогическоеЗаписать') in upper(scommand)); -- спец команда:
                    IF (k1<=0) THEN
                       k1 = position(upper('TableFieldValueAsBoolSet') in upper(scommand)); -- спец команда:
                    END IF;
                    IF (k1>(k+1)) THEN
                        yes_777 = true; 
                        sline_type_ = 333;
                    END IF;  
                 END IF;  
                 -- .................................                 

                 -- .................................
                 IF (yes_777 = false) THEN -- если "ничего", то формула
                    sline_type_ = 1; 
                 END IF; 
                 -- .................................
              END IF; 

              k = position('IF' in upper(scommand));
              IF (k=1) THEN -- IF
                 sline_type_ = 2; 
                 scommand = substring(scommand, char_length('IF')+1, char_length(scommand));
                 scommand = str_is_null(scommand);
                 k1 = position('THEN' in upper(scommand));
                 IF (k1>0) THEN 
                    scommand = substring(scommand, 1, char_length(scommand)-4);
                    scommand = str_is_null(scommand);
                 END IF; 

                 
              END IF; 
              
              k = position('ELSE' in upper(scommand));
              IF (k=1) THEN sline_type_ = 3; END IF; -- ELSE

              k = position('END_IF' in upper(scommand));
              IF (k=1) THEN sline_type_ = 4; END IF; -- END_IF
              
              k = position('WHILE' in upper(scommand));
              IF (k=1) THEN -- WHILE
                 sline_type_ = 5; 
                 scommand = substring(scommand, char_length('WHILE')+1, char_length(scommand));
                 scommand = str_is_null(scommand);
                 k1 = position('DO' in upper(scommand));
                 IF (k1>0) THEN 
                    scommand = substring(scommand, 1, char_length(scommand)-2);
                    scommand = str_is_null(scommand);
                 END IF; 
              END IF; 
              
              k = position('END_WHILE' in upper(scommand));
              IF (k=1) THEN -- END_WHILE
                 sline_type_ = 6; 
              END IF; 

              b = script_pg_table_tmp_000_add(res, sline_type_, 0, 0, scommand);
              scommand = '';
           ELSE 
              scommand = scommand || ' ' || sline_;
           END IF;

        END IF;

       END LOOP;  

       -- ======================================================
       -- IF
       b = script_pg_table_tmp_000_stack_if_create();

       OPEN c_tt999;
       LOOP  
         FETCH c_tt999 INTO n0, sline_type_, n1, n2, sline_;         
         IF NOT FOUND THEN EXIT; END IF;
         sline_ = str_is_null(sline_);
         IF (sline_ <> '') THEN
            --res = true;
            n0 = int_is_null(n0);                                                        
            n1 = int_is_null(n1);                                                        
            n2 = int_is_null(n2);                                                        
            sline_type_ = int_is_null(sline_type_);
              
            IF (sline_type_ = 2) THEN  -- IF
               b = script_pg_table_tmp_000_n1_set(n0, n0); 
               b = script_pg_table_tmp_000_stack_if_add(n0);
            END IF; 
            
            IF (sline_type_ = 3) THEN  -- ELSE
               k = script_pg_table_tmp_000_stack_if_last_get(); 
               IF (k>0) THEN
                  b = script_pg_table_tmp_000_n2_set(k, n0); 
                  b = script_pg_table_tmp_000_n1_set(n0, k);
                  b = script_pg_table_tmp_000_n2_set(n0, n0);
               END IF;
               b = script_pg_table_tmp_000_stack_if_last_del();
 
               b = script_pg_table_tmp_000_n1_set(n0, n0); 
               b = script_pg_table_tmp_000_stack_if_add(n0);
               
            END IF; 
            
            IF (sline_type_ = 4) THEN -- END_IF
               k = script_pg_table_tmp_000_stack_if_last_get(); 
               IF (k>0) THEN
                  b = script_pg_table_tmp_000_n2_set(k, n0); 
                  b = script_pg_table_tmp_000_n1_set(n0, k);
                  b = script_pg_table_tmp_000_n2_set(n0, n0);
               END IF;
               b = script_pg_table_tmp_000_stack_if_last_del();
            END IF; 
            
                 
                  
         END IF;
       END LOOP;
       CLOSE c_tt999;

       b = script_pg_table_tmp_000_stack_if_drop();
       -- ======================================================

       -- ======================================================
       -- WHILE
       b = script_pg_table_tmp_000_stack_if_create();

       OPEN c_tt999;
       LOOP  
         FETCH c_tt999 INTO n0, sline_type_, n1, n2, sline_;         
         IF NOT FOUND THEN EXIT; END IF;
         sline_ = str_is_null(sline_);
         IF (sline_ <> '') THEN
            --res = true;
            n0 = int_is_null(n0);                                                        
            n1 = int_is_null(n1);                                                        
            n2 = int_is_null(n2);                                                        
            sline_type_ = int_is_null(sline_type_);
              
            IF (sline_type_ = 5) THEN  -- WHILE
               b = script_pg_table_tmp_000_n1_set(n0, n0); 
               b = script_pg_table_tmp_000_stack_if_add(n0);
            END IF; 
            
            IF (sline_type_ = 6) THEN -- END_WHILE
               k = script_pg_table_tmp_000_stack_if_last_get(); 
               IF (k>0) THEN
                  b = script_pg_table_tmp_000_n2_set(k, n0); 
                  b = script_pg_table_tmp_000_n1_set(n0, k);
                  b = script_pg_table_tmp_000_n2_set(n0, n0);
               END IF;
               b = script_pg_table_tmp_000_stack_if_last_del();
            END IF; 
            
                 
                  
         END IF;
       END LOOP;
       CLOSE c_tt999;

       b = script_pg_table_tmp_000_stack_if_drop();
       -- ======================================================


    END IF;
  END IF;
  
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_parse(scr text) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_parse(scr text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_parse(scr text) IS 'Парсер скрипта (переписывает скрипт во временную таблицу scr_pg_000_tt999)';


--
-- Name: script_pg_parse_zzz(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_parse_zzz(scr text) RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
  res integer;
  b boolean;
  yes_777 boolean; 
  yes_next boolean;
  yes_done boolean;
  scommand text;
  sline_ text;
  cline integer;
  iline integer;
  its_comm_end boolean;
  sline_type_ integer;
  s_if text;
  s_while text;
  k integer;
  k1 integer;
  k2 integer;
  n0 integer;                           
  n1 integer;
  n2 integer;

  c_tt999 CURSOR FOR
    select
     n, -- номер строки (команды) скрипта
     sline_type, -- тип строки скрипта:
                 -- 0-"обычная", 1-формула, 2-IF, 3-ELSE, 4-END_IF, 5-WHILE, 6-END_WHILE,
                 -- 
     block_n1, -- начало блока (номер строки) 
     block_n2, -- конец блока (номер строки)
     sline -- текст строки (команды) скрипта
    from
      scr_pg_000_tt999
    order by n;                 
  
  
  
BEGIN
  -- Парсер скрипта (переписывает скрипт во временную таблицу scr_pg_000_tt999)
/*
-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse_ZZZ
('
s:=0;
');
select * from scr_pg_000_tt999 order by n;
-- select * from script_pg_table_tmp_000_drop();
-- ................................................


-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse_ZZZ
('
s:=0;
Знач_1 := ОбъектСвойствоЗначениеПолучить();
Сумма_1 := ОбъектыСвойствоЗначениеСуммаПолучить();
Средн_1 := ОбъектыСвойствоЗначениеСреднееПолучить();
Колво_1 := ОбъектыСвойствоКоличествоПолучить();
z:=0;
j:=0;
WHILE z<10 do
  z := z + 1;
  j:=0;
  WHILE j<10 do
    j := j + 1;
    s := s+1; 
    a:=333.4;
    b := 444;
    d:=55;
    x:=(a + b) / (a - b) * d + 17.5;
    IF X>99 THEN
       b := x-5;
       IF b>3 THEN
          d:=34;
       ELSE
          d:= 72;   
       END_IF;
    END_IF;
  END_WHILE;
END_WHILE;
');
select * from scr_pg_000_tt999 order by n;
select * from script_pg_table_tmp_000_drop();
-- ................................................

-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse_ZZZ
(
'
a:=333.4;
b := 444;
d:=55;
x:=(a + b) / (a - b) * d + 17.5;
'
);
select * from scr_pg_000_tt999 order by n;
select * from script_pg_table_tmp_000_drop();
-- ................................................
*/  

/*
301 ТаблицаПолеЗначениеКакЧислоПолучить
302 ТаблицаПолеЗначениеКакСтрокаПолучить
303 ТаблицаПолеЗначениеКакЛогическоеПолучить
*/


  res = 0;
  scr= str_is_null(scr);
  IF (scr <> '') THEN
    cline = str_words_count(scr, chr(10));
    IF (cline > 0) THEN
       scommand = '';
       its_comm_end = false;
       
       iline = 0;
       WHILE (iline < cline) LOOP
        iline = iline + 1;
        sline_ = str_word_by_num(scr, iline, chr(10));
        sline_ = str_is_null(sline_);
        sline_ =replace(sline_, chr(10),' ');
        sline_ =replace(sline_, chr(13),' ');
        sline_ =replace(sline_, chr(9),' ');
        sline_ = str_is_null(sline_);
        yes_next = false;
        IF (sline_ <> '') THEN
           yes_next = true;
           IF (substring(sline_,1,1) = '*') THEN yes_next = false; END IF; -- строка-примечание
           IF (substring(sline_,1,2) = '--') THEN yes_next = false; END IF; -- строка-примечание              
           /*
           IF (substring(sline_,1,1) <> '*') THEN -- строка-примечание
              yes_next = true;
           END IF;
           */
        END IF;

        IF (yes_next = true) THEN
           its_comm_end = false;
           IF (substring(sline_,char_length(sline_),1) = ';') THEN -- конец команды
              sline_ = substring(sline_,1, char_length(sline_)-1);
	      its_comm_end = true;
           ELSE 
              IF ('ELSE' = upper(sline_)) THEN -- конец команды
                 its_comm_end = true; 
              END IF;               
              k = position('THEN' in upper(sline_));
              IF (k = (char_length(sline_)-char_length('THEN') +1)) THEN its_comm_end = true; END IF; -- конец команды
              k = position('DO' in upper(sline_));
              IF (k = (char_length(sline_)-char_length('DO') +1)) THEN its_comm_end = true; END IF; -- конец команды
           END IF;
           
           IF (its_comm_end = true) THEN
              sline_ = str_is_null(sline_);
              scommand = scommand || ' ' || sline_;
              res = res + 1;
              sline_type_ = 0;
              scommand = str_is_null(scommand);

              k = position(':=' in scommand); -- формула или какая-то спец команда
              IF (k>1) THEN 
                 yes_777 = false;
                 
                 -- .................................
                 IF (yes_777 = false) THEN 
                    k1 = position(upper('ТаблицаПолеЗначениеКакЧислоПолучить') in upper(scommand)); -- спец команда:
                    IF (k1<=0) THEN
                       k1 = position(upper('TableFieldValueAsFloatGet') in upper(scommand)); -- спец команда:
                    END IF;
                    IF (k1>(k+1)) THEN
                        yes_777 = true; 
                        sline_type_ = 301;
                    END IF;  
                 END IF;  
                 -- .................................                 
                 -- .................................
                 IF (yes_777 = false) THEN 
                    k1 = position(upper('ТаблицаПолеЗначениеКакСтрокаПолучить') in upper(scommand)); -- спец команда:
                    IF (k1<=0) THEN
                       k1 = position(upper('TableFieldValueAsStrGet') in upper(scommand)); -- спец команда:
                    END IF;
                    IF (k1>(k+1)) THEN
                        yes_777 = true; 
                        sline_type_ = 302;
                    END IF;  
                 END IF;  
                 -- .................................                 
                 -- .................................
                 IF (yes_777 = false) THEN 
                    k1 = position(upper('ТаблицаПолеЗначениеКакЛогическоеПолучить') in upper(scommand)); -- спец команда:
                    IF (k1<=0) THEN
                       k1 = position(upper('TableFieldValueAsBoolGet') in upper(scommand)); -- спец команда:
                    END IF;
                    IF (k1>(k+1)) THEN
                        yes_777 = true; 
                        sline_type_ = 303;
                    END IF;  
                 END IF;  
                 -- .................................                 
                 -- .................................
                 IF (yes_777 = false) THEN -- если "ничего", то формула
                    sline_type_ = 1; 
                 END IF; 
                 -- .................................
              END IF; 

              k = position('IF' in upper(scommand));
              IF (k=1) THEN -- IF
                 sline_type_ = 2; 
                 scommand = substring(scommand, char_length('IF')+1, char_length(scommand));
                 scommand = str_is_null(scommand);
                 k1 = position('THEN' in upper(scommand));
                 IF (k1>0) THEN 
                    scommand = substring(scommand, 1, char_length(scommand)-4);
                    scommand = str_is_null(scommand);
                 END IF; 

                 
              END IF; 
              
              k = position('ELSE' in upper(scommand));
              IF (k=1) THEN sline_type_ = 3; END IF; -- ELSE

              k = position('END_IF' in upper(scommand));
              IF (k=1) THEN sline_type_ = 4; END IF; -- END_IF
              
              k = position('WHILE' in upper(scommand));
              IF (k=1) THEN -- WHILE
                 sline_type_ = 5; 
                 scommand = substring(scommand, char_length('WHILE')+1, char_length(scommand));
                 scommand = str_is_null(scommand);
                 k1 = position('DO' in upper(scommand));
                 IF (k1>0) THEN 
                    scommand = substring(scommand, 1, char_length(scommand)-2);
                    scommand = str_is_null(scommand);
                 END IF; 
              END IF; 
              
              k = position('END_WHILE' in upper(scommand));
              IF (k=1) THEN -- END_WHILE
                 sline_type_ = 6; 
              END IF; 

              b = script_pg_table_tmp_000_add(res, sline_type_, 0, 0, scommand);
              scommand = '';
           ELSE 
              scommand = scommand || ' ' || sline_;
           END IF;

        END IF;

       END LOOP;  

       -- ======================================================
       -- IF
       b = script_pg_table_tmp_000_stack_if_create();

       OPEN c_tt999;
       LOOP  
         FETCH c_tt999 INTO n0, sline_type_, n1, n2, sline_;         
         IF NOT FOUND THEN EXIT; END IF;
         sline_ = str_is_null(sline_);
         IF (sline_ <> '') THEN
            --res = true;
            n0 = int_is_null(n0);                                                        
            n1 = int_is_null(n1);                                                        
            n2 = int_is_null(n2);                                                        
            sline_type_ = int_is_null(sline_type_);
              
            IF (sline_type_ = 2) THEN  -- IF
               b = script_pg_table_tmp_000_n1_set(n0, n0); 
               b = script_pg_table_tmp_000_stack_if_add(n0);
            END IF; 
            
            IF (sline_type_ = 3) THEN  -- ELSE
               k = script_pg_table_tmp_000_stack_if_last_get(); 
               IF (k>0) THEN
                  b = script_pg_table_tmp_000_n2_set(k, n0); 
                  b = script_pg_table_tmp_000_n1_set(n0, k);
                  b = script_pg_table_tmp_000_n2_set(n0, n0);
               END IF;
               b = script_pg_table_tmp_000_stack_if_last_del();
 
               b = script_pg_table_tmp_000_n1_set(n0, n0); 
               b = script_pg_table_tmp_000_stack_if_add(n0);
               
            END IF; 
            
            IF (sline_type_ = 4) THEN -- END_IF
               k = script_pg_table_tmp_000_stack_if_last_get(); 
               IF (k>0) THEN
                  b = script_pg_table_tmp_000_n2_set(k, n0); 
                  b = script_pg_table_tmp_000_n1_set(n0, k);
                  b = script_pg_table_tmp_000_n2_set(n0, n0);
               END IF;
               b = script_pg_table_tmp_000_stack_if_last_del();
            END IF; 
            
                 
                  
         END IF;
       END LOOP;
       CLOSE c_tt999;

       b = script_pg_table_tmp_000_stack_if_drop();
       -- ======================================================

       -- ======================================================
       -- WHILE
       b = script_pg_table_tmp_000_stack_if_create();

       OPEN c_tt999;
       LOOP  
         FETCH c_tt999 INTO n0, sline_type_, n1, n2, sline_;         
         IF NOT FOUND THEN EXIT; END IF;
         sline_ = str_is_null(sline_);
         IF (sline_ <> '') THEN
            --res = true;
            n0 = int_is_null(n0);                                                        
            n1 = int_is_null(n1);                                                        
            n2 = int_is_null(n2);                                                        
            sline_type_ = int_is_null(sline_type_);
              
            IF (sline_type_ = 5) THEN  -- WHILE
               b = script_pg_table_tmp_000_n1_set(n0, n0); 
               b = script_pg_table_tmp_000_stack_if_add(n0);
            END IF; 
            
            IF (sline_type_ = 6) THEN -- END_WHILE
               k = script_pg_table_tmp_000_stack_if_last_get(); 
               IF (k>0) THEN
                  b = script_pg_table_tmp_000_n2_set(k, n0); 
                  b = script_pg_table_tmp_000_n1_set(n0, k);
                  b = script_pg_table_tmp_000_n2_set(n0, n0);
               END IF;
               b = script_pg_table_tmp_000_stack_if_last_del();
            END IF; 
            
                 
                  
         END IF;
       END LOOP;
       CLOSE c_tt999;

       b = script_pg_table_tmp_000_stack_if_drop();
       -- ======================================================


    END IF;
  END IF;
  
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_parse_zzz(scr text) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_parse_zzz(scr text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_parse_zzz(scr text) IS 'Парсер скрипта (переписывает скрипт во временную таблицу scr_pg_000_tt999)';


--
-- Name: script_pg_spec_func_execute(integer, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_spec_func_execute(code integer, scr text) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
  v_tmp t_float;
  b_tmp boolean;
  k1 integer;
  sx character varying;
  ch char;
  s character varying;
  yesnext boolean;
  tn character varying;
  fn character varying;
  /*
  itsdir boolean;
  idguid_prop character varying;
  obj_idguid character varying;
  obj_prop_idguid character varying;
  -- sval character varying;
  */
  sfilter text;
  sval text;


BEGIN
  -- Вычислить спец. функцию (pg-скрипт)
  /*
   301 ТаблицаПолеЗначениеКакЧислоПолучить
   302 ТаблицаПолеЗначениеКакСтрокаПолучить
   303 ТаблицаПолеЗначениеКакЛогическоеПолучить
   331 ТаблицаПолеЗначениеКакЧислоЗаписать
   332 ТаблицаПолеЗначениеКакСтрокаЗаписать
   333 ТаблицаПолеЗначениеКакЛогическоеЗаписать
  */
  res = '';
  code = int_is_null(code);
  IF (code>0) THEN

     scr= str_is_null(scr);
     IF (scr <> '') THEN
        -- здесь - реализация
        yesnext = true;
        sx = '';
        -- .......................................................
        -- Выделить аргумены функции
        -- sx = str_is_null(str_word_by_num(scr, 2, '()'));
        sx = scr;
        ch = substr(sx, char_length(sx), 1);
        IF (ch = ';') THEN sx = btrim(substr(sx, 1, char_length(sx)-1)); END IF;
        IF (sx <> '') THEN 
           k1 = position('(' in sx);
           IF (k1>0) THEN 
              sx = btrim(substr(sx, k1+1, char_length(sx)));
              IF (sx<>'') THEN
                 ch = substr(sx, char_length(sx), 1);
                 IF (ch = ')') THEN
                     sx = btrim(substr(sx, 1, char_length(sx)-1));               
                 END IF;
              END IF;
           END IF;
        END IF;
        -- .......................................................

        IF (sx = '') THEN yesnext = false; END IF;

        sfilter = '';
        sval = '';

        IF (code between 300 and 399) THEN  -- "табличные" спец.функции
            -- ..........................................
            IF (yesnext = true) THEN -- имя таблицы
               yesnext = false;
               tn = str_is_null(str_word_by_num(sx, 1, ','));
               IF (tn <> '') THEN
                  tn = str_is_null(script_pg_value_as_str_get(tn));
                  IF (tn <> '') THEN
                      yesnext = true;
                  END IF;
               END IF;
            END IF;
            -- ..........................................
            -- ..........................................
            IF (yesnext = true) THEN -- имя поля
                yesnext = false;
                fn = str_is_null(str_word_by_num(sx, 2, ','));
                IF (fn <> '') THEN
                   fn = str_is_null(script_pg_value_as_str_get(fn));
                   IF (fn <> '') THEN
                       yesnext = true;
                   END IF;
                END IF;
            END IF;
            -- ..........................................
            -- ..........................................
            IF (yesnext = true) THEN -- sfilter
                sfilter = str_is_null(str_word_by_num(sx, 3, ','));
                sfilter = str_is_null(script_pg_value_as_str_get(sfilter));
                IF (sfilter <> '') THEN
                   yesnext = true;
                END IF;
            END IF;
            -- ..........................................
        END IF;
        IF (yesnext = true) THEN
            IF (code between 330 and 359) THEN  -- "табличные" спец.функции (запись значения поля)
                /* 
                331 ТаблицаПолеЗначениеКакЧислоЗаписать
                332 ТаблицаПолеЗначениеКакСтрокаЗаписать
                333 ТаблицаПолеЗначениеКакЛогическоеЗаписать
                */
                -- ..........................................
                yesnext = false;
                sval = str_is_null(str_word_by_num(sx, 4, ','));
                sval = str_is_null(script_pg_value_as_str_get(sval));
                IF (sval <> '') THEN -- какое-то значение должно быть!
                                     -- позже озаботиться тем, что добавить отдельную функцию очистки значения поля 
                   yesnext = true;
                END IF;
                -- ..........................................
            END IF;
        END IF;


        /* ******************************************************************* */
        /* ******************************************************************* */

        /* ******************************************************************* */
        /* ******************************************************************* */
        /* Выполняем функции                                                   */
        IF (yesnext = true) THEN
           IF (code between 300 and 399) THEN
              -- .......................................................................
              IF (code = 301) THEN -- ТаблицаПолеЗначениеКакЧислоПолучить
                 v_tmp = table_field_value_as_float_get(tn, fn, sfilter);
                 -- res = float_is_null(res);
                res = float_as_str(v_tmp);
              END IF;
              -- .......................................................................
              -- .......................................................................
              IF (code = 302) THEN -- ТаблицаПолеЗначениеКакСтрокаПолучить
                 res = table_field_value_as_str_get(tn, fn, sfilter);
                 --res = float_as_str(v_tmp);
              END IF;
              -- .......................................................................
              -- .......................................................................
              IF (code = 303) THEN -- ТаблицаПолеЗначениеКакЛогическоеПолучить
                 b_tmp = table_field_value_as_bool_get(tn, fn, sfilter);
                 -- res = float_is_null(res);
                res = bool_as_str(b_tmp);
                 --res = float_as_str(v_tmp);
              END IF;
              -- .......................................................................
              -- .......................................................................
              IF (code = 331) THEN -- ТаблицаПолеЗначениеКакЧислоЗаписать
                 res = table_field_value_as_float_set(tn, fn, sfilter, str_as_float(sval));
              END IF;
              -- .......................................................................
              -- .......................................................................
              IF (code = 332) THEN -- ТаблицаПолеЗначениеКакСтрокаЗаписать
                 res = table_field_value_as_text_set(tn, fn, sfilter, q39_lr(q39_dub(sval)));
              END IF;
              -- .......................................................................
              -- .......................................................................
              IF (code = 333) THEN -- ТаблицаПолеЗначениеКакЛогическоеЗаписать
                 res = table_field_value_as_bool_set(tn, fn, sfilter, str_as_bool(sval));
              END IF;
              -- .......................................................................              
           END IF;
        END IF;
        /* ******************************************************************* */
        /* ******************************************************************* */


     END IF;
  END IF;
  --res = float_is_null(res);
  res = str_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_spec_func_execute(code integer, scr text) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_spec_func_execute(code integer, scr text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_spec_func_execute(code integer, scr text) IS 'Вычислить спец. функцию (pg-скрипт)';


--
-- Name: script_pg_table_tmp_000_add(integer, integer, integer, integer, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_add(n_ integer, sline_type_ integer, block_n1_ integer, block_n2_ integer, sline_ text) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  
BEGIN
  -- Добавить строку (команду) во временную таблицу scr_pg_000_tt999
  /*
  */  

  res = false;
  sline_ = str_is_null(sline_);
  IF (sline_ <> '') THEN
    n_ = int_is_null(n_ );
    sline_type_ = int_is_null(sline_type_ );
    block_n2_ = int_is_null(block_n2_ );
    insert into scr_pg_000_tt999
    (
      n,
      sline_type,
      block_n1,
      block_n2,
      sline
     )
     values
     (
      n_ ,
      sline_type_ ,
      block_n1_ ,
      block_n2_ ,
      sline_ 
     );
     res = true;
  END IF;
  
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_add(n_ integer, sline_type_ integer, block_n1_ integer, block_n2_ integer, sline_ text) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_add(n_ integer, sline_type_ integer, block_n1_ integer, block_n2_ integer, sline_ text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_add(n_ integer, sline_type_ integer, block_n1_ integer, block_n2_ integer, sline_ text) IS 'Добавить строку (команду) во временную таблицу scr_pg_000_tt999';


--
-- Name: script_pg_table_tmp_000_create(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_create() RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
  /*
    Создать ВРЕМЕННУЮ таблицу scr_pg_000_tt999 (текст скрипта), используемую в интерпретаторе скриптов (для скриптов типа pg)                                                                                                            
     select * from public.script_pg_table_tmp_000_create();
     select * from scr_pg_000_tt999;
  */
  res = false;
  PERFORM public.script_pg_table_tmp_000_drop();
  CREATE temporary TABLE IF NOT EXISTS scr_pg_000_tt999 -- (текст скрипта)            
      (
        n integer, -- номер строки (команды) скрипта                                                        
        sline_type integer, -- тип строки скрипта. 0-"обычная", 1-формула, 2-IF, 3-ELSE, 4-END_IF, 5-WHILE, 6-END_WHILE
        block_n1 integer, -- начало блока (номер строки)                                                                                                                                     
        block_n2 integer, -- конец блока (номер строки)                                                                                                                                     
        sline text -- текст строки (команды) скрипта                                                       
      )
      WITHOUT OIDS;
   CREATE INDEX scr_pg_000_tt999_n ON scr_pg_000_tt999(n); 
  res = true;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_create() OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_create(); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_create() IS 'Создать ВРЕМЕННУЮ таблицу scr_pg_000_tt999 (текст скрипта), используемую в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_table_tmp_000_drop(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_drop() RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
  -- Удалить ВРЕМЕННУЮ таблицу scr_pg_000_tt999 (текст скрипта), используемую в интерпретаторе скриптов (для скриптов типа pg)
  -- select * from public.script_pg_table_tmp_000_drop();

  res = false;
  drop table if exists scr_pg_000_tt999;
  res = true;

  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_drop() OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_drop(); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_drop() IS 'Удалить ВРЕМЕННУЮ таблицу scr_pg_000_tt999 (текст скрипта), используемую в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_table_tmp_000_n1_set(integer, integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_n1_set(n_ integer, block_n1_ integer) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  
BEGIN
  -- Обновить "начало блока" во временной таблице scr_pg_000_tt999

  res = false;
  n_ = int_is_null(n_);
  IF (n_ > 0) THEN
    block_n1_ = int_is_null(block_n1_ );
    update scr_pg_000_tt999
    SET
      block_n1 = block_n1_
    WHERE
      n = n_;  
    res = true;
  END IF;
  
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_n1_set(n_ integer, block_n1_ integer) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_n1_set(n_ integer, block_n1_ integer); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_n1_set(n_ integer, block_n1_ integer) IS 'Обновить "начало блока" во временной таблице scr_pg_000_tt999';


--
-- Name: script_pg_table_tmp_000_n2_set(integer, integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_n2_set(n_ integer, block_n2_ integer) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  
BEGIN
  -- Обновить "конец блока" во временной таблице scr_pg_000_tt999

  res = false;
  n_ = int_is_null(n_);
  IF (n_ > 0) THEN
    block_n2_ = int_is_null(block_n2_ );
    update scr_pg_000_tt999
    SET
      block_n2 = block_n2_
    WHERE
      n = n_;  
    res = true;
  END IF;
  
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_n2_set(n_ integer, block_n2_ integer) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_n2_set(n_ integer, block_n2_ integer); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_n2_set(n_ integer, block_n2_ integer) IS 'Обновить "конец блока" во временной таблице scr_pg_000_tt999';


--
-- Name: script_pg_table_tmp_000_stack_if_add(integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_stack_if_add(n_ integer) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
  res = false;
  /*
    Добавить строку в таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)
    select * from public.script_pg_table_tmp_000_stack_if_add(20);
  */

  insert into scr_pg_000_stack_if_tt999(n) values(int_is_null(n_));                             

  res = true;

  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_add(n_ integer) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_add(n_ integer); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_add(n_ integer) IS 'Получить значение поля n из последней строки таблицы scr_pg_000_stack_if_tt999 (стек IF), используемой в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_table_tmp_000_stack_if_clear(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_stack_if_clear() RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
  -- Очистить ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)
  -- select * from public.script_pg_table_tmp_000_stack_if_clear();

  res = false;
  delete from scr_pg_000_stack_if_tt999;
  res = true;

  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_clear() OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_clear(); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_clear() IS 'Очистить ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_table_tmp_000_stack_if_create(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_stack_if_create() RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  b boolean;
BEGIN
  /*
    Создать ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)
    select * from public.script_pg_table_tmp_000_stack_if_create();
  */
  res = false;
  b = public.script_pg_table_tmp_000_stack_if_drop();
  CREATE temporary TABLE IF NOT EXISTS scr_pg_000_stack_if_tt999 -- (текст скрипта)
      (
        -- id serial, -- id     
        n integer  -- номер строки IF                                                                                                                     
      )
      WITHOUT OIDS;
   CREATE INDEX scr_pg_000_stack_if_tt999_n ON scr_pg_000_stack_if_tt999(n);
  res = true;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_create() OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_create(); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_create() IS 'Создать ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_table_tmp_000_stack_if_drop(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_stack_if_drop() RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
  -- Удалить ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)
  -- select * from public.script_pg_table_tmp_000_stack_if_drop();

  res = false;
  drop table if exists scr_pg_000_stack_if_tt999;
  res = true;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_drop() OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_drop(); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_drop() IS 'Удалить ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_table_tmp_000_stack_if_last_del(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_stack_if_last_del() RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  nlast integer;                                     
BEGIN
  res = false;
  /*
    Удалить последнюю строку из таблицы scr_pg_000_stack_if_tt999 (стек IF), используемой в интерпретаторе скриптов (для скриптов типа pg)
     select * from public.script_pg_table_tmp_000_stack_if_last_del();
  */

  select max(n) into nlast from scr_pg_000_stack_if_tt999;
  nlast =int_is_null(nlast);
  IF (nlast > 0) THEN
     delete from scr_pg_000_stack_if_tt999 where n = nlast;
     res = true;                        
  END IF;                   
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_last_del() OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_last_del(); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_last_del() IS 'Удалить последнюю строку из таблицы scr_pg_000_stack_if_tt999 (стек IF), используемой в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_table_tmp_000_stack_if_last_get(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_table_tmp_000_stack_if_last_get() RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
  res integer;
BEGIN
  res = 0;
  /*
    Получить значение поля n из последней строки таблицы scr_pg_000_stack_if_tt999 (стек IF), используемой в интерпретаторе скриптов (для скриптов типа pg)
     select * from public.script_pg_table_tmp_000_stack_if_last_get();
  */
  select max(n) into res from scr_pg_000_stack_if_tt999;                                                                             
  res =int_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_last_get() OWNER TO postgres;

--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_last_get(); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_last_get() IS 'Получить значение поля n из последней строки таблицы scr_pg_000_stack_if_tt999 (стек IF), используемой в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_value_as_str_get(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_value_as_str_get(vname_or_vval character varying) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
  ch char;
  itsval boolean;
    
BEGIN
  /*
  Получить строковое значение параметра vname_or_vval. 
  Вх. параметры:
    vname_or_vval - может быть или именем переменной или строковым значением.
                    Если обрамлено двойными кавычками, то интерпретируется, как значение. В противном случае - как имя переменной.
    Примеры: "a123" - значение; a123 - имя переменной.
  Возвр значение: 
    Если vname_or_vval - переменная, то возвращается значение переменной из таблицы scr_pg_vars_tt999 (или пустая строка в случае отсутствия такой переменной).
    Если vname_or_vval - значение, то возвращается это же значение без обрамляющих двойных кавычек.
  Важно! Возвр значение НЕ содержит обрамляющих пробелов.  

  select * from script_pg_vars_table_tmp_create();
  select * from public.script_pg_var_as_str_set('a123', '"Привет, как дела?"');
  select * from public.script_pg_var_as_str_set('a124', 'Привет, как дела?');
  select * from public.script_pg_value_as_str_get('a123');
  select * from public.script_pg_value_as_str_get('"a123"');
  select * from public.script_pg_value_as_str_get('a124');
  select * from public.script_pg_value_as_str_get('"a124"');
  select * from scr_pg_vars_tt999 order by var_name;
  -- select * from script_pg_vars_table_tmp_drop();
  */  
  res = str_is_null(vname_or_vval);
  IF (res <> '') THEN
     itsval = false;
     ch = substring(res , 1, 1);
     IF (ch = '"') THEN 
         itsval = true;
         res = btrim(substr(res, 2, char_length(res)));
     END IF;
     IF (res <> '') THEN
         ch = substr(res , char_length(res), 1);
         IF (ch = '"') THEN 
            itsval = true;
            res = btrim(substr(res, 1, char_length(res)-1));
         END IF;
     END IF;
     IF (itsval = false) THEN
        res = public.script_pg_vars_table_tmp_val_get(res);
     END IF;
  END IF;
  res = str_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_value_as_str_get(vname_or_vval character varying) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_value_as_str_get(vname_or_vval character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_value_as_str_get(vname_or_vval character varying) IS 'Получить строковое значение параметра vname_or_vval.';


--
-- Name: script_pg_var_as_bool_get(character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_var_as_bool_get(v_name character varying, v_def boolean DEFAULT false) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  v character varying;
    
BEGIN
  -- Получить значение переменной v_name (как boolean) из таблицы scr_pg_vars_tt999
  /*
  select * from script_pg_vars_table_tmp_create();
  select * from public.script_pg_var_as_bool_set('А', true);
  select * from public.script_pg_var_as_bool_set('Б', false);
  select * from public.script_pg_var_as_bool_set('d', 'true');
  select * from public.script_pg_var_as_bool_get('А');
  select * from public.script_pg_var_as_bool_get('Б');
  select * from public.script_pg_var_as_bool_get('d');
  select * from scr_pg_001_tt999 order by var_name;
  -- select * from script_pg_vars_table_tmp_drop(); 
  */  
  v_def = bool_is_null(v_def);
  res = v_def;
  v = script_pg_vars_table_tmp_val_get(v_name, bool_as_str(v_def));
  res = str_as_bool(v);
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_var_as_bool_get(v_name character varying, v_def boolean) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_var_as_bool_get(v_name character varying, v_def boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_var_as_bool_get(v_name character varying, v_def boolean) IS 'Прочитать значение переменной v_name (как boolean) из таблицы scr_pg_001_tt999';


--
-- Name: script_pg_var_as_bool_set(character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_var_as_bool_set(v_name character varying, v_val boolean) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sx character varying;
  
BEGIN
  -- Добавить (обновить) переменную v_name типа boolean в таблицу scr_pg_001_tt999
  /*
  select * from script_pg_vars_table_tmp_create();
  select * from public.script_pg_var_as_bool_set('А', true);
  select * from public.script_pg_var_as_bool_set('Б', false);
  select * from public.script_pg_var_as_bool_set('d', 'true');
  select * from scr_pg_vars_tt999 order by var_name;
  -- select * from script_pg_vars_table_tmp_drop(); 
  */  

  res = false;
  v_name = str_is_null(v_name);
  IF (v_name <> '') THEN
     sx = bool_as_str(v_val);
     res = script_pg_vars_table_tmp_var_add(v_name, sx, 1);
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_var_as_bool_set(v_name character varying, v_val boolean) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_var_as_bool_set(v_name character varying, v_val boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_var_as_bool_set(v_name character varying, v_val boolean) IS 'Добавить (обновить) переменную v_name типа boolean в таблицу scr_pg_vars_tt999';


--
-- Name: script_pg_var_as_float_get(character varying, t_float); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_var_as_float_get(v_name character varying, v_def t_float DEFAULT 0) RETURNS t_float
    LANGUAGE plpgsql
    AS $$
DECLARE
  res t_float;
  v character varying;
    
BEGIN
  -- Получить значение переменной v_name (как t_float) из таблицы scr_pg_vars_tt999
  /*
  Примеры:
    select * from script_pg_vars_table_tmp_create();
    select * from public.script_pg_var_as_float_get('А');
    select * from public.script_pg_var_as_float_get('Б');
    select * from public.script_pg_var_as_float_get('Ы', 123.78);
    select * from scr_pg_vars_tt999 order by var_name;
    -- select * from script_pg_vars_table_tmp_drop(); 
  */  
  v_def = float_is_null(v_def);
  res = v_def;
  v = script_pg_vars_table_tmp_val_get(v_name, float_as_str(v_def));
  IF (its_float(v)) THEN 
     res = cast(v as t_float);
  END IF;
  res = float_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_var_as_float_get(v_name character varying, v_def t_float) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_var_as_float_get(v_name character varying, v_def t_float); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_var_as_float_get(v_name character varying, v_def t_float) IS 'Прочитать значение переменной v_name (как t_float) из таблицы scr_pg_vars_tt999';


--
-- Name: script_pg_var_as_float_set(character varying, t_float); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_var_as_float_set(v_name character varying, v_val t_float) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sx character varying;
  
BEGIN
  -- Добавить (обновить) переменную v_name типа t_float в таблицу scr_pg_vars_tt999
  /*
  select * from public.script_pg_var_as_float_set('А', 123);
  select * from public.script_pg_var_as_float_set('Б', 12.777);
  select * from scr_pg_vars_tt999 order by var_name;
  */  

  res = false;
  v_name = str_is_null(v_name);
  IF (v_name <> '') THEN
     sx = float_as_str(v_val);
     res = script_pg_vars_table_tmp_var_add(v_name, sx, 2);
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_var_as_float_set(v_name character varying, v_val t_float) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_var_as_float_set(v_name character varying, v_val t_float); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_var_as_float_set(v_name character varying, v_val t_float) IS 'Добавить (обновить) переменную v_name типа t_float в таблицу scr_pg_vars_tt999';


--
-- Name: script_pg_var_as_str_get(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_var_as_str_get(v_name character varying, v_def character varying DEFAULT ''::character varying) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
BEGIN
  -- Получить значение переменной v_name (как character varying) из таблицы scr_pg_vars_tt999
  /*
  Примеры:
    select * from script_pg_vars_table_tmp_create();
    select * from public.script_pg_var_as_float_get('А');
    select * from public.script_pg_var_as_str_get('Б');
    select * from public.script_pg_var_as_str_set('ЮЮЮ', '"Привет, как дела?"');
    select * from public.script_pg_var_as_str_get('ЮЮЮ');
    select * from scr_pg_vars_tt999 order by var_name;
    -- select * from script_pg_vars_table_tmp_drop();
  */  
  v_def = str_is_null(v_def);
  res = script_pg_vars_table_tmp_val_get(v_name, v_def);
  res = str_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_var_as_str_get(v_name character varying, v_def character varying) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_var_as_str_get(v_name character varying, v_def character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_var_as_str_get(v_name character varying, v_def character varying) IS 'Получить значение переменной v_name (как character varying) из таблицы scr_pg_vars_tt999';


--
-- Name: script_pg_var_as_str_set(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_var_as_str_set(v_name character varying, v_val character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  
BEGIN
  -- Добавить (обновить) переменную v_name типа t_propval в таблицу scr_pg_vars_tt999
  /*
  select * from script_pg_vars_table_tmp_create();
  select * from script_pg_var_as_float_set('А', 123);
  select * from script_pg_var_as_float_set('Б', 12.777);
  select * from script_pg_var_as_str_set('T', 'Эх, ухнем...');
  --select * from script_pg_vars_table_tmp_var_add('T', 'Эх, ухнем...', 0);
  select * from scr_pg_vars_tt999 order by var_name;
  select * from script_pg_vars_table_tmp_drop();
  */
  res = false;
  v_name = str_is_null(v_name);
  IF (v_name <> '') THEN
     v_val = str_is_null(v_val);
     res = script_pg_vars_table_tmp_var_add(v_name, v_val, 0); 
     res = bool_is_null(res);     
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_var_as_str_set(v_name character varying, v_val character varying) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_var_as_str_set(v_name character varying, v_val character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_var_as_str_set(v_name character varying, v_val character varying) IS 'Добавить (обновить) переменную v_name типа t_propval в таблицу scr_pg_vars_tt999';


--
-- Name: script_pg_vars_table_tmp_clear(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_vars_table_tmp_clear() RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
 /*
  Очистить ВРЕМЕННУЮ таблицу scr_pg_vars_tt999, используемую в интерпретаторе скриптов (для скриптов типа pg)
  Пример:
   select * from public.script_pg_vars_table_tmp_clear();
 */
  res = false;
  if table_exist('scr_pg_vars_tt999') then
     delete from scr_pg_vars_tt999;
     res = true;
  end if;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_vars_table_tmp_clear() OWNER TO postgres;

--
-- Name: FUNCTION script_pg_vars_table_tmp_clear(); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_vars_table_tmp_clear() IS 'Очистить ВРЕМЕННУЮ таблицу scr_pg_vars_tt999, используемую в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_vars_table_tmp_create(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_vars_table_tmp_create() RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
  res = false;
  /*
    Создать ВРЕМЕННУЮ таблицу scr_pg_vars_tt999, используемую в интерпретаторе скриптов (для скриптов типа pg)
    Пример:
       select * from public.script_pg_vars_table_tmp_create();
       select * from scr_pg_vars_tt999;
  */
  PERFORM public.script_pg_vars_table_tmp_drop();
  CREATE temporary TABLE IF NOT EXISTS scr_pg_vars_tt999
      (
        id serial,
        var_name character varying,
        var_type integer,  
        var_val character varying            
      )
      WITHOUT OIDS;
  CREATE INDEX scr_pg_vars_tt999_var_name ON scr_pg_vars_tt999(var_name); 
  res = true;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_vars_table_tmp_create() OWNER TO postgres;

--
-- Name: FUNCTION script_pg_vars_table_tmp_create(); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_vars_table_tmp_create() IS 'Создать ВРЕМЕННУЮ таблицу scr_pg_vars_tt999, используемую в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_vars_table_tmp_drop(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_vars_table_tmp_drop() RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
 /*
  Удалить ВРЕМЕННУЮ таблицу scr_pg_vars_tt999, используемую в интерпретаторе скриптов (для скриптов типа pg)
  Пример:
    select * from public.script_pg_vars_table_tmp_drop();
 */
  drop table if exists scr_pg_vars_tt999;
  res = true;

  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_vars_table_tmp_drop() OWNER TO postgres;

--
-- Name: FUNCTION script_pg_vars_table_tmp_drop(); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_vars_table_tmp_drop() IS 'Удалить ВРЕМЕННУЮ таблицу scr_pg_vars_tt999 (текст скрипта), используемую в интерпретаторе скриптов (для скриптов типа pg)';


--
-- Name: script_pg_vars_table_tmp_val_get(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_vars_table_tmp_val_get(v_name character varying, v_def character varying DEFAULT ''::character varying) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
    
BEGIN
  -- Получить значение переменной v_name в таблице scr_pg_vars_tt999
  /*
  Примеры:  
    select * from public.script_pg_vars_table_tmp_create();
    select * from scr_pg_vars_tt999;
    select * from public.script_pg_vars_table_tmp_val_get('А');
    select * from public.script_pg_vars_table_tmp_val_get('Б');
    select * from public.script_pg_vars_table_tmp_val_get('Ы', '12345');
    select * from scr_pg_vars_tt999 order by var_name;
  */  
  v_def = str_is_null(v_def);
  res = v_def;
  v_name = str_is_null(v_name);
  IF (v_name <> '') THEN
     v_name = upper(v_name);  
     select var_val into res from scr_pg_vars_tt999 where upper(var_name) = v_name;
     IF (res is null) THEN res = v_def; END IF;
  END IF;
  res = str_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_vars_table_tmp_val_get(v_name character varying, v_def character varying) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_vars_table_tmp_val_get(v_name character varying, v_def character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_vars_table_tmp_val_get(v_name character varying, v_def character varying) IS 'Прочитать значение переменной v_name из таблицы scr_pg_vars_tt999';


--
-- Name: script_pg_vars_table_tmp_var_add(character varying, character varying, integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_vars_table_tmp_var_add(v_name character varying, v_val character varying DEFAULT ''::character varying, v_type integer DEFAULT 2) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  vvv character varying;
  
BEGIN
  /*
  Добавить (обновить) переменную v_name типа v_type (со значением v_val) в таблицу scr_pg_vars_tt999
    v_name - имя (идентификатор) переменной
    v_val - значение переменной
    v_type - тип переменной (0-строка, 2-число)
  
  Примеры:
    select * from script_pg_vars_table_tmp_create();
    select * from public.script_pg_vars_table_tmp_var_add('А', '123');
    select * from public.script_pg_vars_table_tmp_var_add('Б', '12.777');
    select * from script_pg_vars_table_tmp_var_add('T', 'Эх, ухнем...', 0);
    select * from script_pg_vars_table_tmp_var_add('ЧЧЧЧЧЧ', '"Эх, ухнем..."', 0);
    select * from scr_pg_vars_tt999 order by var_name;
    -- select * from script_pg_vars_table_tmp_drop();
  */  
  res = false;
  v_name = str_is_null(v_name);
  IF (v_name <> '') THEN
     v_name = upper(v_name);  
     v_type = int_is_null(v_type);
     v_val = str_is_null(v_val);
     -- -----------------------------
     IF (v_type =  2) THEN -- число
        IF (v_val = '') THEN v_val = '0.0'; END IF;
        IF (its_float(v_val) = true) THEN  -- это лишнее, вероятно (позже вернуться)
           v_val = public.float_str_normal(v_val);
        END IF;
     END IF;
     -- -----------------------------
     select var_name into vvv from scr_pg_vars_tt999 where upper(var_name) = v_name;
     vvv = str_is_null(vvv);
     IF (vvv = '') THEN
        insert into scr_pg_vars_tt999
        (
          var_name,
          var_type,
          var_val
        )
        values
        (
           v_name,
           v_type,
           v_val
        );
        res = true;
     ELSE
        update
          scr_pg_vars_tt999
        set
          var_type = v_type,
          var_val =  v_val
        where
          upper(var_name) = v_name;  
        res = true;
     END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_vars_table_tmp_var_add(v_name character varying, v_val character varying, v_type integer) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_vars_table_tmp_var_add(v_name character varying, v_val character varying, v_type integer); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_vars_table_tmp_var_add(v_name character varying, v_val character varying, v_type integer) IS 'Добавить (обновить) переменную v_name типа v_type (со значением v_val) в таблицу scr_pg_vars_tt999';


--
-- Name: script_pg_vars_table_tmp_var_exist(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_vars_table_tmp_var_exist(v_name character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  s character varying;
    
BEGIN
  -- Проверка существования переменной v_name в таблице scr_pg_vars_tt999
  /*
  select * from script_pg_vars_table_tmp_create();
  select * from public.script_pg_var_as_bool_set('Б', 'true');
  select * from public.script_pg_vars_table_tmp_var_exist('А');
  select * from public.script_pg_vars_table_tmp_var_exist('Б');
  select * from public.script_pg_vars_table_tmp_var_exist('б');
  select * from scr_pg_vars_tt999 order by var_name;
  -- select * from script_pg_vars_table_tmp_drop();
  */  
  res = false;
  v_name = str_is_null(v_name);
  IF (v_name <> '') THEN
     res = true;
     v_name = upper(v_name);  
     select v_name into s from scr_pg_vars_tt999 where upper(var_name) = v_name;
     IF (s is null) THEN res = false; END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_vars_table_tmp_var_exist(v_name character varying) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_vars_table_tmp_var_exist(v_name character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_vars_table_tmp_var_exist(v_name character varying) IS 'Проверка существования переменной v_name в таблице scr_pg_vars_tt999';


--
-- Name: script_pg_vars_table_tmp_var_set(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION script_pg_vars_table_tmp_var_set(v_name character varying, v_val character varying DEFAULT ''::character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  vvv character varying;
  yes boolean;
  vt integer;
    
BEGIN
  -- Обновить значение переменной v_name в таблице scr_pg_vars_tt999
  /*
  select * from public.script_pg_vars_table_tmp_var_set('А', 'ыыыыыыыыыыыы'); 
  select * from public.script_pg_vars_table_tmp_var_set('Б', '12.777');
  select * from scr_pg_vars_tt999 order by var_name;
  */  
  res = false;
  v_name = str_is_null(v_name);
  IF (v_name <> '') THEN
     v_name = upper(v_name);  
     v_val = str_is_null(v_val);
     select var_name, var_type into vvv, vt from scr_pg_vars_tt999 where upper(var_name) = v_name;
     IF (vvv is not null) THEN
        vt = int_is_null(vt);
        yes = true;
        IF vt=2 THEN -- Число
           IF (v_val = '') THEN v_val = '0.0'; END IF;
           v_val = float_str_normal(v_val);
           IF (its_float(v_val) = false) THEN yes = false; END IF;
        END IF; 
        IF (yes = true) THEN
           update
             scr_pg_vars_tt999
           set
             var_val =  v_val
           where
             upper(var_name) = v_name;  
           res = true;
        END IF;
     END IF;
  END IF;
  
  RETURN res;
END;
$$;


ALTER FUNCTION public.script_pg_vars_table_tmp_var_set(v_name character varying, v_val character varying) OWNER TO postgres;

--
-- Name: FUNCTION script_pg_vars_table_tmp_var_set(v_name character varying, v_val character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION script_pg_vars_table_tmp_var_set(v_name character varying, v_val character varying) IS 'Обновить значение переменной v_name в таблице scr_pg_vars_tt999';


--
-- Name: str_array1_add(text, character varying, character); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_array1_add(sx text, sval character varying, ch character DEFAULT ';'::bpchar) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
    res boolean;
    ch1 char;

BEGIN    
-- Текст, как одномерный массив. Добавить элемент к массиву (в конец массива)
/*
Вх. парам:
  sx - Текст (интерпретируемый, как массив)
  sval - новое значение
  ch - символ-разделитель
Возвр.значение =TRUE - успешно
ВАЖНО:
   a) левые и правые пробелы автоматически убираются из sval
   b) пустое значение sval игнорируется (не добавляется)
   c) значение ch не должен быть пробел (рекомендуется ';' или chr(10))
Примеры:
   select * from str_array1_add('','1');
   select * from str_array1_add('111','2');
   select * from str_array1_add('1;2;3','2');
   select * from str_array1_add('1;2;3;','2');
   select * from str_array1_add('1;2;3;','');
*/

 res = false;
 sval = str_is_null(sval);
 IF (sval <> '') THEN
    sx = str_is_null(sx);
    IF (ch is null) THEN ch = ';'; END IF;
    IF (ch = ' ') THEN ch = ';'; END IF;
    IF (char_length(sx))>0 THEN
       ch1 = substring(sx,char_length(sx),1);
       IF (ch1<>ch) THEN sx = sx || ch; END IF;
    END IF;
    sx = sx || sval;
    res = true;
 END IF;

 RETURN res;
END;
$$;


ALTER FUNCTION public.str_array1_add(sx text, sval character varying, ch character) OWNER TO postgres;

--
-- Name: FUNCTION str_array1_add(sx text, sval character varying, ch character); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_array1_add(sx text, sval character varying, ch character) IS 'Текст, как одномерный массив. Добавить элемент к массиву (в конец массива)';


--
-- Name: str_array1_count(text, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_array1_count(sx text, sunchar character varying DEFAULT (chr(10) || ';'::text)) RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
    res integer;
BEGIN    
 -- Текст, как одномерный массив. Вычислить кол-во элементов
/*
Вх. парам:
  sx - Текст (интерпретируемый, как массив)
  sunchar - символы-разделители

Важно!  Желательно НЕ использовать пробелы в sunchar
Примеры:
 select * from str_array1_count('1;2;3');  -- 3 элемента
 select * from str_array1_count('1;2;;;3;;');  -- 3 элемента
 select * from str_array1_count('1;2;3',','); -- 1 элемент
*/
 res = str_words_count(sx, sunchar);
 RETURN res;
END;
$$;


ALTER FUNCTION public.str_array1_count(sx text, sunchar character varying) OWNER TO postgres;

--
-- Name: FUNCTION str_array1_count(sx text, sunchar character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_array1_count(sx text, sunchar character varying) IS 'Текст, как одномерный массив. Вычислить кол-во элементов';


--
-- Name: str_array1_get(text, integer, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_array1_get(sx text, num integer, svaldef character varying DEFAULT ''::character varying, sunchar character varying DEFAULT (chr(10) || ';'::text)) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
BEGIN    
 -- Текст, как одномерный массив. Получить элемент по номеру
/*
Вх. парам:
  sx - Текст (интерпретируемый, как массив)
  num - номер элемента (начиная с единицы)
  svaldef - значение по умолчанию, если элемент не существует
  sunchar - символы-разделители
Важно!  Желательно НЕ использовать пробелы в sunchar
Примеры:
  select * from str_array1_get('a;b;c', 2);  
  select * from str_array1_get('a;b;c', 3);  
  select * from str_array1_get('a;b;c;', 3);  
  select * from str_array1_get('a;b;c', 4, 'нет данных');  
  select * from str_array1_get('a;b;c', -1, 'нет данных');  
*/
 res = str_is_null(svaldef);
 num = int_is_null(num);
 IF (num>0) THEN 
    res = str_is_null(str_word_by_num(sx, num, sunchar));
    IF (res = '') THEN res = str_is_null(svaldef); END IF;
 END IF;
 RETURN res;
END;
$$;


ALTER FUNCTION public.str_array1_get(sx text, num integer, svaldef character varying, sunchar character varying) OWNER TO postgres;

--
-- Name: FUNCTION str_array1_get(sx text, num integer, svaldef character varying, sunchar character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_array1_get(sx text, num integer, svaldef character varying, sunchar character varying) IS 'Текст, как одномерный массив. Получить элемент по номеру';


--
-- Name: str_as_bigint(character varying, bigint); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_as_bigint(v character varying, v_def bigint DEFAULT 0) RETURNS bigint
    LANGUAGE plpgsql
    AS $$
DECLARE res bigint;
BEGIN
  -- Конвертировать строку в bigint
  -- select * from public.str_as_bigint('125', -99);
  -- select * from public.str_as_bigint('a125', -99);
  -- select * from public.str_as_bigint('125.', -99);
  -- select * from public.str_as_bigint('.125', -99);
  -- select * from public.str_as_bigint('1.25', -99);
  -- select * from public.str_as_bigint('1,25', -99);
  v_def = bigint_is_null(v_def);
  res = v_def;
  v = str_is_null(v);
  IF (its_bigint(v) = true) THEN 
     res = cast(v as bigint);
  END IF;
  res = bigint_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.str_as_bigint(v character varying, v_def bigint) OWNER TO postgres;

--
-- Name: FUNCTION str_as_bigint(v character varying, v_def bigint); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_as_bigint(v character varying, v_def bigint) IS 'Конвертировать строку в bigint';


--
-- Name: str_as_bool(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_as_bool(v character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE res boolean;
BEGIN
  -- Конвертировать строку в boolean
  /*
     select * from str_as_bool('да');
     select * from str_as_bool('Д');
     select * from str_as_bool('+');
     select * from str_as_bool('Y');
     select * from str_as_bool(null);
     select * from str_as_bool('Привет');
  */
  res = false;
  v = upper(str_is_null(v));
  if (v = '.T.') THEN res = true; END IF;
  if (v = 'T') THEN res = true; END IF;
  if (v = 'TRUE') THEN res = true; END IF;
  if (v = 'Y') THEN res = true; END IF;
  if (v = 'YES') THEN res = true; END IF;
  if (v = 'YE') THEN res = true; END IF;
  if (v = '1') THEN res = true; END IF;
  if (v = '+') THEN res = true; END IF;
  if (v = 'OK') THEN res = true; END IF;
  if (v = 'Д') THEN res = true; END IF;
  if (v = 'ДА') THEN res = true; END IF;
  if (v = 'ИСТИНА') THEN res = true; END IF;
  if (v = 'И') THEN res = true; END IF;  
  RETURN res;
END;
$$;


ALTER FUNCTION public.str_as_bool(v character varying) OWNER TO postgres;

--
-- Name: FUNCTION str_as_bool(v character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_as_bool(v character varying) IS 'Конвертировать строку в boolean';


--
-- Name: str_as_float(character varying, double precision); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_as_float(v character varying, v_def double precision DEFAULT 0.0) RETURNS double precision
    LANGUAGE plpgsql
    AS $$
DECLARE res double precision;
BEGIN
  -- Конвертировать строку в double precision
  -- select * from public.str_as_float('1.125', -99);
  -- select * from public.str_as_float('a1.125', -99);
  v_def = float_is_null(v_def);
  res = v_def;
  v = str_is_null(v);
  IF (its_float(v)) THEN 
     res = cast(v as double precision);
  END IF;
  res = float_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.str_as_float(v character varying, v_def double precision) OWNER TO postgres;

--
-- Name: FUNCTION str_as_float(v character varying, v_def double precision); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_as_float(v character varying, v_def double precision) IS 'Конвертировать строку в double precision';


--
-- Name: str_as_int(character varying, integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_as_int(v character varying, v_def integer DEFAULT 0) RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE res integer;
BEGIN
  -- Конвертировать строку в integer
  -- select * from public.str_as_int('125', -99);
  -- select * from public.str_as_int('a125', -99);
  v_def = int_is_null(v_def);
  res = v_def;
  v = str_is_null(v);
  IF (its_integer(v)) THEN 
     res = cast(v as integer);
  END IF;
  res = int_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.str_as_int(v character varying, v_def integer) OWNER TO postgres;

--
-- Name: FUNCTION str_as_int(v character varying, v_def integer); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_as_int(v character varying, v_def integer) IS 'Конвертировать строку в integer';


--
-- Name: str_build_left(text, integer, character); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_build_left(sx text, newsize integer, ch character DEFAULT '0'::bpchar) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
  res text;
  yes99 boolean; 
BEGIN
  /*
    Нарастить входную строку заданными символами до заданного размера слева
    sx - входня строка
    newsize - новый размер строки
    ch - символы, которыми "наращивается строка"
    Пример вызова:
       select str_build_left ('3',5,'0'); --  Результат: 00003
       select str_build_left ('3',10,'-'); -- Результат: ---------3
       select str_build_left ('Привет',10,'='); -- Результат: ====Привет
       select str_build_left ('',10,' '); 
  */
  sx = str_is_null(sx);
  res = sx;
  newsize = int_is_null(newsize);
  IF (newsize > 0) THEN
     yes99 = false; 
     IF (ch IS NULL) THEN ch =' '; END IF;
     IF (ch = ' ') THEN 
        ch = '|';
        yes99 = true; 
     END IF; 
     WHILE (CHAR_LENGTH(res) < newsize) LOOP
       res = ch || res;
     END LOOP;
     IF (yes99 = true) THEN
        res = replace(res,'|',' ');
     END IF; 
  END IF;
  res = str_is_null(res,'',false);
  RETURN res;
END;
$$;


ALTER FUNCTION public.str_build_left(sx text, newsize integer, ch character) OWNER TO postgres;

--
-- Name: FUNCTION str_build_left(sx text, newsize integer, ch character); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_build_left(sx text, newsize integer, ch character) IS 'Нарастить входную строку заданными символами до заданного размера слева';


--
-- Name: str_build_right(text, integer, character); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_build_right(sx text, newsize integer, ch character DEFAULT '0'::bpchar) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
  res text;
  yes99 boolean; 
BEGIN
  /*
    Нарастить входную строку заданными символами до заданного размера справа sx - входная строка
    newsize - новый размер строки
    ch - символы, которыми "наращивается строка"
    Пример вызова:
       select str_build_right ('3',5,'0');
       Результат: 30000
  */
  sx = str_is_null(sx);
  res = sx;
  newsize = int_is_null(newsize);
  IF (newsize > 0) THEN
     IF (ch IS NULL) then ch =' '; END IF;
     IF (ch = ' ') THEN 
        ch = '|';
        yes99 = true; 
     END IF; 
     WHILE (CHAR_LENGTH(res) < newsize) LOOP
       res = res || ch;
     END LOOP;
     IF (yes99 = true) THEN
        res = replace(res,'|',' ');
     END IF; 
  END IF;
  res = str_is_null(res);
  RETURN res;
END;
$$;


ALTER FUNCTION public.str_build_right(sx text, newsize integer, ch character) OWNER TO postgres;

--
-- Name: FUNCTION str_build_right(sx text, newsize integer, ch character); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_build_right(sx text, newsize integer, ch character) IS 'Нарастить входную строку заданными символами до заданного размера справа';


--
-- Name: str_char1_trim(character varying, character, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_char1_trim(s character varying, ch character DEFAULT '"'::bpchar, yes_trim_after boolean DEFAULT true) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
  chx char;
    
BEGIN
  /*
  Удалить из строки по одному крайнему символу, если они соответствуют заданному
  Примеры:
  select * from public.str_char1_trim('"12345"', '"');
  select * from public.str_char1_trim('""12345""', '"');
  select * from public.str_char1_trim('""12345"', '"');
  select * from public.str_char1_trim('"12345""', '"');
  select * from public.str_char1_trim('12345""', '"');
  select * from public.str_char1_trim('""12345', '"');
  */  
  res = str_is_null(s);
  IF (res <> '') THEN
     IF (ch is null) THEN ch = '"'; END IF;
     chx = substr(res , 1, 1);
     IF (chx = ch) THEN 
         res = btrim(substr(res, 2, char_length(res)));
     END IF;
     IF (res <> '') THEN
         chx = substr(res , char_length(res), 1);
         IF (chx = ch) THEN 
            res = btrim(substr(res, 1, char_length(res)-1));
         END IF;
     END IF;
  END IF;
  yes_trim_after = bool_is_null(yes_trim_after);
  IF (yes_trim_after = true) THEN
     res = str_is_null(res);
  ELSE
     IF (res is null) THEN res = ''; END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.str_char1_trim(s character varying, ch character, yes_trim_after boolean) OWNER TO postgres;

--
-- Name: FUNCTION str_char1_trim(s character varying, ch character, yes_trim_after boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_char1_trim(s character varying, ch character, yes_trim_after boolean) IS 'Удалить из строки по одному крайнему символу, если они соответствуют заданному';


--
-- Name: str_is_null(text, text, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_is_null(sx text, sdef text DEFAULT ''::text, yestrim boolean DEFAULT true) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
  res text;
BEGIN
  -- Контроль значения типа TEXT (проверка на NULL и замена NULL на значение по умолчанию)
  /* 
     Примеры:
       select * from str_is_null('   123   ');
       select * from str_is_null('   123   ', '', false);
       select * from str_is_null(null);
       select * from str_is_null(null, '   567   ');
       select * from str_is_null(null, '   567   ', false);
  */
  res = sx;
  IF (res is NULL) THEN
     IF (sdef is NULL) THEN sdef=''; END IF;
     res = sdef;
  END IF;
  IF (res <> '') THEN
      yestrim = bool_is_null(yestrim);
      IF (yestrim = TRUE) THEN res = btrim(res); END IF;
  END IF;
  RETURN res;  
END;
$$;


ALTER FUNCTION public.str_is_null(sx text, sdef text, yestrim boolean) OWNER TO postgres;

--
-- Name: FUNCTION str_is_null(sx text, sdef text, yestrim boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_is_null(sx text, sdef text, yestrim boolean) IS 'Контроль значения типа TEXT (проверка на NULL и замена NULL на значение по умолчанию)';


--
-- Name: str_is_null(character varying, character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_is_null(sx character varying, sdef character varying DEFAULT ''::character varying, yestrim boolean DEFAULT true) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
BEGIN
  -- Контроль значения типа varchar (проверка на NULL и замена NULL на значение по умолчанию)
  /* 
     Примеры:
       select * from str_is_null('   123   ');
       select * from str_is_null('   123   ', '', false);
       select * from str_is_null(null);
       select * from str_is_null(null, '   567   ');
       select * from str_is_null(null, '   567   ', false);
  */
  res = sx;
  IF (res is NULL) THEN
     IF (sdef is NULL) THEN sdef=''; END IF;
     res = sdef;
  END IF;
  IF (res <> '') THEN
      yestrim = bool_is_null(yestrim);
      IF (yestrim = TRUE) THEN res = btrim(res); END IF;
  END IF;
  RETURN res;  
END;
$$;


ALTER FUNCTION public.str_is_null(sx character varying, sdef character varying, yestrim boolean) OWNER TO postgres;

--
-- Name: FUNCTION str_is_null(sx character varying, sdef character varying, yestrim boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_is_null(sx character varying, sdef character varying, yestrim boolean) IS 'Контроль значения типа varchar (проверка на NULL и замена NULL на значение по умолчанию)';


--
-- Name: str_replace(character varying, character varying, character, character); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_replace(sx character varying, unchars character varying DEFAULT ' '::character varying, char_repl character DEFAULT '_'::bpchar, char_xz character DEFAULT '|'::bpchar) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
    i integer;
    yes99 boolean;
    m integer;
    k integer;
    ch char(1);
    res character varying;
BEGIN
  /*
    Замена в строке sx символов, перечисленных в unchars (типа: множество символов), на символ char_repl
    Вх. параметры:
      sx - входная строка;
      unchars - перечень НеСимволов (аналог множества символов);
      char_repl - замещающий символ;
      char_xz - символ, "компенсирующий" пробел в unchars.
    ВАЖНО!!!  Среди символов unchars не должно быть символа char_xz и, кроме этого, нельзя, чтобы char_xz = ' '.
    Пример:
       select * from str_replace('Привет, как дела ?', ' ,?', '_');  -- Привет__как_дела__
       select * from str_replace('Привет, как дела ? | А у тебя?', '| ,?', '_');  -- Привет__как_дела___|_А_у_тебя_
       select * from str_replace('Привет, как дела ? | А у тебя?', '| ,?', '_', '\'); -- Привет__как_дела_____А_у_тебя_
       select * from str_replace(btrim('   Привет, как дела ? | А у тебя?'  ), '| ,?', '_', '\');  -- Привет__как_дела_____А_у_тебя_
  */
  res = '';
  IF (sx is NULL) THEN sx = ''; END IF;
  IF (sx <> '') THEN
     res = sx;
     IF (unchars is NULL) THEN unchars = ''; END IF;
     m = char_length(unchars);
     IF (m>0) THEN              
        IF (char_xz is NULL) THEN char_xz = '|'; END IF;    
        unchars = replace(unchars,' ',char_xz);
        IF (char_repl is NULL) THEN char_repl = '_'; END IF;    
        i = 0;
        WHILE i<m LOOP
         i = i + 1;
         ch = substring(unchars,i,1);
         IF (ch = char_xz) THEN
            res = replace(res, ' ', char_repl);
         ELSE
            res = replace(res, ch, char_repl);
         END IF;
     END LOOP;
     END IF;
  END IF;
  RETURN res;  
END;
$$;


ALTER FUNCTION public.str_replace(sx character varying, unchars character varying, char_repl character, char_xz character) OWNER TO postgres;

--
-- Name: FUNCTION str_replace(sx character varying, unchars character varying, char_repl character, char_xz character); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_replace(sx character varying, unchars character varying, char_repl character, char_xz character) IS 'Замена в строке sx символов, перечисленных в unchars (типа: множество символов), на символ char_repl';


--
-- Name: str_reverse(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_reverse(sx character varying) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
    res character varying;
BEGIN
  /*
    Инвертирвать строку sx
    Пример:
      select * from str_reverse(null);
      select * from str_reverse('Привет, как дела ?');
      select * from str_reverse(str_reverse('Привет, как дела ?'));
      select * from str_reverse('   Привет, как дела ?');
      select * from str_reverse('   Привет, как дела ?   ');
      select * from str_reverse(str_reverse('   Привет, как дела ?   '));
  */
  sx = str_is_null(sx,'',false);
  res = reverse(sx);
  RETURN res;  
END;
$$;


ALTER FUNCTION public.str_reverse(sx character varying) OWNER TO postgres;

--
-- Name: FUNCTION str_reverse(sx character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_reverse(sx character varying) IS 'Инвертирвать строку sx';


--
-- Name: str_sets_intersect(text, text, character, character, boolean, character); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_sets_intersect(set1 text, set2 text, sep_left character DEFAULT '['::bpchar, sep_right character DEFAULT ']'::bpchar, yes_upper boolean DEFAULT true, sxrenovina character DEFAULT '`'::bpchar) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
    i integer;
    c  integer;
    sxrenovina char;
    s character varying;
    res boolean;
BEGIN
/*
Проверка пересечения 2-х множеств, заданных в виде строк символов
Параметры:
  set1 - множество 1;
  set2 - множество 2;
  sep_left - разделитель элементов множества слева;
  sep_right - разделитель элементов множества справа;
  yes_upper - игнорировать регистр символов.
Важно! 
  1. Очевидно, что элементы множества НЕ должны содержать разделителей;
  2. Полное равенство строк (set1 и set2) считается пересечением (включая и пустые строки).
  3. Символ sxrenovina НЕ должен присутствовать среди символов в: set1, set2, sep_left, sep_right
Возвращаемое значение: TRUE, если множества пересекаются. FALSE в противном случае
Примеры:
  select * from str_sets_intersect('[1][3679][3680]', '[3680]'); -- true
  select * from str_sets_intersect('[1][3679][3680]', '[3680][100]');  -- true
  select * from str_sets_intersect('[1][3679][3680]', '[3681][100]');    -- false
  select * from str_sets_intersect('[1]', '[3680]');  -- false
  select * from str_sets_intersect('[1]', '[1][3680]');  -- true
  select * from str_sets_intersect('[ 1]', '[1][3680]');  -- false  
  select * from str_sets_intersect('[1]' || chr(10) || '[3679]' || chr(10) || '[3680]', '[15][3680]'); -- true
  select * from str_sets_intersect('[1]' || chr(10) || '[3679]' || chr(10) || chr(13)  || chr(9) || '[3680]', '[15]' || chr(10) || '[3685]' || chr(10) || '[3679]'); -- true
*/
 res = false;
 set1 = str_is_null(set1);
 set2 = str_is_null(set2);
 yes_upper = bool_is_null(yes_upper);
 IF (yes_upper = TRUE) THEN
    set1 = upper(set1);
    set2 = upper(set2);
 END IF;
 IF (set1 = set2) THEN
    res = true; 
 ELSE 
    IF (sep_left is null) THEN sep_left = '['; END IF;
    IF (sep_right is null) THEN sep_right = ']'; END IF;
    IF (sxrenovina is null) THEN sxrenovina = '`'; END IF;
    c = str_words_count(set1, sep_left || sep_right, false, sxrenovina);
    IF (c>0) THEN
       i = 0;
       WHILE i<c LOOP
         i = i + 1;
         s = str_word_by_num(set1, i, sep_left || sep_right, false, sxrenovina);
         IF (s <> '') THEN
             s = sep_left || s || sep_right;
             IF (position(s in set2)>0) THEN
                res = true;
                i = c+1; 
             END IF;
         END IF;
       END LOOP;
    END IF;
 END IF;
 RETURN Res;
END;
$$;


ALTER FUNCTION public.str_sets_intersect(set1 text, set2 text, sep_left character, sep_right character, yes_upper boolean, sxrenovina character) OWNER TO postgres;

--
-- Name: FUNCTION str_sets_intersect(set1 text, set2 text, sep_left character, sep_right character, yes_upper boolean, sxrenovina character); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_sets_intersect(set1 text, set2 text, sep_left character, sep_right character, yes_upper boolean, sxrenovina character) IS 'Проверка пересечения 2-х множеств, заданных в виде строк символов';


--
-- Name: str_ultrasimple_code(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_ultrasimple_code(sx text) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
  res text;
  sn character varying;
  i integer;
  m integer;
  n integer;
  ch char(1);
BEGIN
  /*
    Ультра простой (и ультра "неэкономичный") алгоритм шифрования текста
    Пример вызова:
      select str_ultrasimple_code ('Как дела?'); -- "813 7231 8331 2331 1331 99- 7331 7231 5031"
      select str_ultrasimple_code ('Привет, как дела? Нормально...'); -- 103 103 103 1431 0431 5531 8331 7231 9331 3431 1431 8031 99- 813 7231 8331 2331 1331 99- 7331 7231 7331 99- 992 5431 2331 9231 5331 3431 0131
  */
  res = '';
  IF (sx is not null) THEN
     IF (sx <> '') THEN
        sx = reverse(sx);
        m = char_length(sx);
        i = 0;
        WHILE i<m LOOP
          i = i + 1;
          ch = substring(sx,i,1);
          IF (ch <> ' ') THEN
             n = ascii(ch);
             n = n + 255;
          ELSE
             n = -99;
          END IF;
          sn = int_as_str(n);
          sn = reverse(sn);
          res = res || sn || ' ';
        END LOOP;
        res = str_is_null(res);
     END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.str_ultrasimple_code(sx text) OWNER TO postgres;

--
-- Name: FUNCTION str_ultrasimple_code(sx text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_ultrasimple_code(sx text) IS 'УльтраУльтра простой (и ультра "неэкономичный") алгоритм шифрования текста';


--
-- Name: str_ultrasimple_decode(text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_ultrasimple_decode(sx text) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
  res text;
  sn character varying;
  n1 integer;
  n2 integer;
  ch char(1);
BEGIN
  /*
    Алгоритм расшифровки текста, зашифрованного функцией str_ultrasimple_code()
    Пример вызова:
      select str_ultrasimple_decode ('813 7231 8331 2331 1331 99- 7331 7231 5031'); -- "Как дела?"
      select str_ultrasimple_decode ('103 103 103 1431 0431 5531 8331 7231 9331 3431 1431 8031 99- 813 7231 8331 2331 1331 99- 7331 7231 7331 99- 992 5431 2331 9231 5331 3431 0131'); -- "Привет, как дела? Нормально..."
      select str_ultrasimple_decode(str_ultrasimple_code('Привет, как дела? Нормально...')); -- "Привет, как дела? Нормально..." ;
select
str_ultrasimple_decode
(
str_ultrasimple_code
(
'Прошло немало лет с тех пор как компьютеры появились в школе и дома.
В школе вы изучаете с их помощью информатику (что полезно), а дома он служит вам партнёром для игр (что приятно).
А цель этой книги - показать, как можно сочетать приятное с полезным, то есть использовать компьютер при изучении школьной программы.
В этой книге вы найдёте несколько десятков уроков по разным школьным предметам. И уроки эти не простые, а занимательные!
Поэтому на каждом уроке мы будем пи-сать интересные компьютерные программы.
'
)
);
  */
  res = '';
  sx = str_is_null(sx);
  IF (sx <> '') THEN
     IF (sx <> '') THEN
        sx = sx || chr(32);
        sn = '';
        n1 = 1;
        WHILE (n1>0) LOOP
          n1 = strpos(sx, chr(32));
          IF (n1>0) THEN
             sn = str_is_null(substr(sx, 1, n1));
             sn = reverse(sn);
             n2 = str_as_int(sn);
             IF (n2>0) THEN
                n2 = n2 - 255;
                ch = chr(n2);
                res = res || ch;
             ELSE
                res = res || chr(32);
             END IF;
             sx = str_is_null(substr(sx, n1,  char_length(sx)));
          END IF;
        END LOOP;
        sx = str_is_null(sx);
        IF (sx <> '') THEN
           sn = sx;
           sn = reverse(sn);
           n2 = str_as_int(sn);
           IF (n2>0) THEN
              n2 = n2 - 255;
              ch = chr(n2);
              res = res || ch;
           ELSE
              res = res || chr(32);
           END IF;
        END IF;
        res = str_is_null(res);
        res = reverse(res);
     END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.str_ultrasimple_decode(sx text) OWNER TO postgres;

--
-- Name: FUNCTION str_ultrasimple_decode(sx text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_ultrasimple_decode(sx text) IS 'Алгоритм расшифровки текста, зашифрованного функцией str_ultrasimple_code()';


--
-- Name: str_word_by_num(text, integer, character varying, boolean, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_word_by_num(sx text, num integer, sunchar character varying DEFAULT ' '::character varying, yestrimbefore boolean DEFAULT true, sxrenovina character varying DEFAULT '|'::character varying) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
    i integer;
    k integer;
    m integer;
    nword integer;
    inword boolean;
    yesexit boolean;
    ch char(1);
    res text;
BEGIN
/*
Получить слово из строки по его номеру.
Алгоритм, мягко говоря, не быстрый
Разделителями слов могут быть любые символы из sUnChar
Параметры:
  sx - входная строка;
  num - номер слова в строке;
  sunchar - НеСимволы. Строка (типа - множество НеСимволов);
  yestrimbefore - если TRUE, то перед обработкой удаляются НеСимволы слева и справа в Sx
  sxrenovina - символ, на который заменяются пробелы (следствие НеЯсности для меня работы функций substring, position). Такого символа в принципе не должно быть в строке
Возвращаемое значение: слово по его номеру
Примеры:
  select str_word_by_num(' ,,,1, ;;; 2, 3', 3, ' ,');   -- 2
  select * from str_word_by_num('1,2a ;3', 2, ';, ');   -- 2a
  select * from str_word_by_num('1,2 ;3', 2, ',');      -- 2 ;3
  select * from str_word_by_num('1,2 ;3', 2, ';3' );    -- пустая строка
  select * from str_word_by_num('1,2 ;3', 2, ' ' );     -- ;3
  select * from str_word_by_num('1, 2 ;3', 2, ' ' );    -- 2
*/
 res = '';
 IF (sx is NULL) THEN sx = ''; END IF;
 IF (sunchar is NULL) THEN sunchar = ' '; END IF;
 yestrimbefore = bool_is_null(yestrimbefore);
 IF (yestrimbefore) THEN
    sx = btrim(sx,sunchar);
 END IF;
 m = char_length(sx);
 IF (m>0) THEN
   IF (char_length(sunchar)>0) THEN
        -- **************************************
        -- Это - на предмет НеЧеткости описАния и работы какой-то из функций: substring, position
        IF (sxrenovina is NULL) THEN sxrenovina = ''; END IF;
        IF char_length(sxrenovina)>0 THEN
           k = position(' ' in sunchar);
           IF k<=0 THEN
              sx = replace(sx,' ',sxrenovina);
           END IF;
        END IF;
        -- **************************************
        yesexit = false;
        nword = 0;
        inword = false;
        i = 0;
        WHILE i<m LOOP
          i = i + 1;
          IF (not yesexit) THEN
             ch = substring(sx,i,1);
             k = position(ch in sunchar);
             IF k<=0 THEN
                IF (NOT inword) THEN nword = nword+1; END IF;
                inword = true;
             ELSE
                inword = false;
                IF (nword>=num) THEN
                   yesexit = true; -- Выход из цикла
                END IF;
             END IF;
             IF (inword) THEN
                IF (nword=num) THEN
                   res = res || ch;
                END IF;
             END IF;
          END IF;
        END LOOP;
        res = replace(res, sxrenovina, ' ');
    ELSE
       res = sx;
    END IF;
 END IF;
 IF (res is NULL) THEN res = ''; END IF;
 RETURN res;
END;
$$;


ALTER FUNCTION public.str_word_by_num(sx text, num integer, sunchar character varying, yestrimbefore boolean, sxrenovina character varying) OWNER TO postgres;

--
-- Name: FUNCTION str_word_by_num(sx text, num integer, sunchar character varying, yestrimbefore boolean, sxrenovina character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_word_by_num(sx text, num integer, sunchar character varying, yestrimbefore boolean, sxrenovina character varying) IS 'Получить слово из строки по его номеру';


--
-- Name: str_words_count(text, character varying, boolean, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION str_words_count(sx text, sunchar character varying DEFAULT ' '::character varying, yestrimbefore boolean DEFAULT true, sxrenovina character varying DEFAULT '|'::character varying) RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
    i integer;
    k integer;
    m integer;
    inword boolean;
    ch char(1);
    res integer;
BEGIN
/*
Вычислить кол-во слов в строке Sx.
Разделителями слов могут быть любые символы из sUnChar
Параметры:
  sx - входная строка;
  sunchar - НеСимволы. Строка (типа - множество НеСимволов);
  yestrimbefore - если TRUE, то перед обработкой удаляются НеСимволы слева и справа в Sx
  sxrenovina - подстрока, на которую заменяются пробелы (следствие НеЯсности для меня работы функций substring, position). Такого символа в принципе не должно быть в строке
Возвращаемое значение: кол-во слов (integer)
    
Примеры:
  select str_words_count(' ,,,1, ;;; 2, 3', ' ,'); -- 4 слова
  select * from str_words_count('1,2 ;3', ';, '); -- 3 слова
  select * from str_words_count('1,2 ;3', ','); -- 2 слова
  select * from str_words_count('1,2 ;3', ';3' ); -- 1 слово
  select * from str_words_count('1,2 ;3', ' ' ); -- 2 слова
  select * from str_words_count('1, 2 ;3', ' ' ); -- 3 слова
  select * from str_words_count('1, ;;;   2,,,, ;  3', ',;' ); -- 5 слов
  select * from str_words_count('1, ;;;   2,,,, ;  3', ', ;' ); -- 3 слова
*/
 res = 0;
 IF (sx is NULL) THEN sx = ''; END IF;
 IF (sunchar is NULL) THEN sunchar = ' '; END IF;
 yestrimbefore = bool_is_null(yestrimbefore);
 IF (yestrimbefore) THEN
    sx = btrim(sx,sunchar);
 END IF;
 m = char_length(sx);
 IF (m>0) THEN
   IF (char_length(sunchar)>0) THEN
        -- **************************************
        -- Это - на предмет НеЧеткости описАния и работы какой-то из функций: substring, position
        IF (sxrenovina is NULL) THEN sxrenovina = ''; END IF;
        IF char_length(sxrenovina)>0 THEN
           k = position(' ' in sunchar);
           IF k<=0 THEN
              sx = replace(sx,' ',sxrenovina);
           END IF;
        END IF;
        -- **************************************
        res = 0;
        inword = false;
        i = 0;
        WHILE i<m LOOP
          i = i + 1;
          ch = substring(sx,i,1);
          k = position(ch in sunchar);
          IF k<=0 THEN
             IF (NOT inword) THEN res = res+1; END IF;
             inword = true;
          ELSE
             inword = false;
          END IF;
        END LOOP;
    ELSE
       res = 1;
    END IF;
 END IF;
 RETURN res;
END;
$$;


ALTER FUNCTION public.str_words_count(sx text, sunchar character varying, yestrimbefore boolean, sxrenovina character varying) OWNER TO postgres;

--
-- Name: FUNCTION str_words_count(sx text, sunchar character varying, yestrimbefore boolean, sxrenovina character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION str_words_count(sx text, sunchar character varying, yestrimbefore boolean, sxrenovina character varying) IS 'Вычислить кол-во слов в строке';


--
-- Name: table_exist(integer, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_exist(ifixparam integer, tn_full character varying, tabletype character varying DEFAULT ''::character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  tableschema character varying;
  sqltext text;
  sx character varying;
BEGIN
  -- Проверить существование таблицы БД tn_full (полное имя таблицы)
  /*
     Для временных таблиц:
        tabletype = 'LOCAL TEMPORARY'
     Для таблиц:
        tabletype = 'BASE TABLE'
     Если значение tabletype не задано, то оно вычисляется автоматически - в зависимости от tableschema
     Примеры:
       -- .....................................................
       select * from table_exist(-1, 'dir.statements_list');
       -- .....................................................
       -- .....................................................
       select * from table_tmp_create('a333', 'CREATE temporary TABLE IF NOT EXISTS a333 (id serial, nav_namemax t_namemax); CREATE INDEX a333_id ON a333(id);');
       select * from a333;
       select * from table_exist(-1, 'a333')
       select * from table_exist(-1, 'a333aaa')
       select * from public.table_tmp_drop('a333');
       -- .....................................................
  */
  res = false;
  tn_full = str_is_null(tn_full);
  IF (tn_full <> '') THEN
      tableschema = '';
      IF (position('.' in tn_full))>0 THEN
         tableschema = str_is_null(str_word_by_num(tn_full, 1, '.'));
         tn_full = str_is_null(str_word_by_num(tn_full, 2, '.'));
      END IF;
      res = table_exist(tn_full, tableschema, tabletype);
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_exist(ifixparam integer, tn_full character varying, tabletype character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_exist(ifixparam integer, tn_full character varying, tabletype character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_exist(ifixparam integer, tn_full character varying, tabletype character varying) IS 'Проверить существование таблицы БД tn_full (полное имя таблицы)';


--
-- Name: table_exist(character varying, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_exist(tablename character varying, tableschema character varying DEFAULT ''::character varying, tabletype character varying DEFAULT ''::character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sqltext text;
  sx character varying;
BEGIN
  -- Проверить существование таблицы БД
  /*
     Для временных таблиц:
        tableschema - пустая строка
        tabletype = 'LOCAL TEMPORARY'
     Для таблиц:
        tabletype = 'BASE TABLE'
     Если значение tabletype не задано, то оно вычисляется автоматически - в зависимости от tableschema
     Примеры:
       -- .....................................................
       select * from table_exist('statements_list', 'dir', 'BASE TABLE');
       select * from table_exist('statements_list', 'dir');
       -- .....................................................
       -- .....................................................
       select * from table_tmp_create('a333', 'CREATE temporary TABLE IF NOT EXISTS a333 (id serial, nav_namemax t_namemax); CREATE INDEX a333_id ON a333(id);');
       select * from a333;
       select * from table_exist('a333')
       select * from public.table_tmp_drop('a333');
       -- .....................................................
  */
  res = false;
  tablename = str_is_null(tablename);
  IF (tablename <> '') THEN
      tableschema = str_is_null(tableschema);
      tabletype = upper(str_is_null(tabletype));
      IF (tabletype = '') THEN
         IF (tableschema <> '') THEN
            tabletype='BASE TABLE';
         ELSE
            tabletype='LOCAL TEMPORARY';
         END IF;
      END IF;
      sqltext = 'select table_name from information_schema.tables where ';
      sqltext = sqltext || '(upper(table_name)= upper(' || q39_lr(upper(tablename)) || '))';
      sqltext = sqltext || ' and ';
      sqltext = sqltext || '(upper(table_type)= upper(' || q39_lr(upper(tabletype)) || '))';
      IF (tableschema <> '') THEN
         sqltext = sqltext || ' and ';
         sqltext = sqltext || '(upper(table_schema)= upper(' || q39_lr(upper(tableschema)) || '))';
      END IF;
      sx = str_is_null(exec_to_str(sqltext));
      IF (upper(sx) = upper(tablename)) THEN res = true; END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_exist(tablename character varying, tableschema character varying, tabletype character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_exist(tablename character varying, tableschema character varying, tabletype character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_exist(tablename character varying, tableschema character varying, tabletype character varying) IS 'Проверить существование таблицы БД';


--
-- Name: table_field_value_as_bigint_get(character varying, character varying, text, bigint, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_bigint_get(tn character varying, fn character varying, sfilter text, vdef bigint DEFAULT 0, sorderby character varying DEFAULT ''::character varying) RETURNS bigint
    LANGUAGE plpgsql
    AS $$
DECLARE
  res bigint;
  sres text;
BEGIN
  -- Получить значение поля fn (как bigint) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
  -- select * from table_field_value_as_bigint_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 vdef = bigint_is_null(vdef);
 sres = table_field_value_as_text_get(tn, fn, sfilter, bigint_as_str(vdef), sorderby, true);
 res = str_as_bigint(sres,vdef); 
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_bigint_get(tn character varying, fn character varying, sfilter text, vdef bigint, sorderby character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_bigint_get(tn character varying, fn character varying, sfilter text, vdef bigint, sorderby character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_bigint_get(tn character varying, fn character varying, sfilter text, vdef bigint, sorderby character varying) IS 'Получить значение поля fn (как bigint) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';


--
-- Name: table_field_value_as_bigint_set(character varying, character varying, text, bigint); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_bigint_set(tn character varying, fn character varying, sfilter text, val_new bigint) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sql_text text;
BEGIN  
  -- Записать значение val_new (integer) в поле fn таблицы tn для фильтра sfilter
  -- select * from table_field_value_as_bigint_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
  -- select * from table_field_value_as_bigint_set('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'), 31);
  -- select * from table_field_value_as_bigint_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
  -- select * from table_field_value_as_bigint_set('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'), 30);
  -- select * from table_field_value_as_bigint_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
  res = false;
  tn = str_is_null(tn);
  IF (tn <> '') THEN
     fn = str_is_null(fn);
     IF (fn <> '') THEN                                             
        sfilter = str_is_null(sfilter);
        IF (sfilter <> '') THEN                                             
           val_new = bigint_is_null(val_new);
           sql_text = 'update ' || tn || ' set ' || fn || ' = ' || val_new || ' where ' || sfilter || ' ;';
           res = public.exec_sql_text(sql_text);
           res = public.bool_is_null(res);                                         
        END IF;               
     END IF;               
  END IF;               
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_bigint_set(tn character varying, fn character varying, sfilter text, val_new bigint) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_bigint_set(tn character varying, fn character varying, sfilter text, val_new bigint); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_bigint_set(tn character varying, fn character varying, sfilter text, val_new bigint) IS 'Записать значение val_new (integer) в поле fn таблицы tn для фильтра sfilter';


--
-- Name: table_field_value_as_bool_get(character varying, character varying, text, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_bool_get(tn character varying, fn character varying, sfilter text, sorderby character varying DEFAULT ''::character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sres text;
BEGIN
  -- Получить значение поля fn (как boolean) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
  -- select * from table_field_value_as_bool_get('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 sres = table_field_value_as_text_get(tn, fn, sfilter, bool_as_str(false), sorderby, true);
 res = str_as_bool(sres); 
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_bool_get(tn character varying, fn character varying, sfilter text, sorderby character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_bool_get(tn character varying, fn character varying, sfilter text, sorderby character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_bool_get(tn character varying, fn character varying, sfilter text, sorderby character varying) IS 'Получить значение поля fn (как boolean) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';


--
-- Name: table_field_value_as_bool_invert(character varying, character varying, text, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_bool_invert(tn character varying, fn character varying, sfilter text, sorderby character varying DEFAULT ''::character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  v boolean;
BEGIN
  -- Инвертировать поле fn (boolean) в таблице tn для фильтра sfilter
  /*
  select * from table_field_value_as_bool_get('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
  select * from table_field_value_as_bool_invert('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
  select * from table_field_value_as_bool_get('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
  select * from table_field_value_as_bool_invert('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
  select * from table_field_value_as_bool_get('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
  */  
 res = false;
 v = table_field_value_as_bool_get(tn, fn, sfilter, sorderby);
 IF (v = true) THEN 
    v = false;
 ELSE
    v = true;
 END IF;
 res = table_field_value_as_bool_set(tn, fn, sfilter, v);
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_bool_invert(tn character varying, fn character varying, sfilter text, sorderby character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_bool_invert(tn character varying, fn character varying, sfilter text, sorderby character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_bool_invert(tn character varying, fn character varying, sfilter text, sorderby character varying) IS 'Инвертировать поле fn (boolean) в таблице tn для фильтра sfilter';


--
-- Name: table_field_value_as_bool_set(character varying, character varying, text, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_bool_set(tn character varying, fn character varying, sfilter text, val_new boolean) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sql_text text;
BEGIN  
  -- Записать значение val_new (boolean) в поле fn таблицы tn для фильтра sfilter
  res = false;
  tn = str_is_null(tn);
  IF (tn <> '') THEN
     fn = str_is_null(fn);
     IF (fn <> '') THEN                                             
        sfilter = str_is_null(sfilter);
        IF (sfilter <> '') THEN                                             
           val_new = bool_is_null(val_new);
           sql_text = 'update ' || tn || ' set ' || fn || ' = ' || if_then(val_new) || ' where ' || sfilter || ' ;';
           res = public.exec_sql_text(sql_text);
           res = public.bool_is_null(res);                                         
        END IF;               
     END IF;               
  END IF;               
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_bool_set(tn character varying, fn character varying, sfilter text, val_new boolean) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_bool_set(tn character varying, fn character varying, sfilter text, val_new boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_bool_set(tn character varying, fn character varying, sfilter text, val_new boolean) IS 'Записать значение val_new (boolean) в поле fn таблицы tn для фильтра sfilter';


--
-- Name: table_field_value_as_float_get(character varying, character varying, text, t_float, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_float_get(tn character varying, fn character varying, sfilter text, vdef t_float DEFAULT 0.0, sorderby character varying DEFAULT ''::character varying) RETURNS t_float
    LANGUAGE plpgsql
    AS $$
DECLARE
  res t_float;
  sres text;
BEGIN
  -- Получить значение поля fn (как bigint) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
  -- select * from table_field_value_as_float_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
  -- select * from table_field_value_as_float_get('dir.dir_props', 'sum(cast(prop_val as t_float))', 'id_owner_guid=' || q39_lr('25EA85505308413BBAF770C42EECB574'));
 vdef = float_is_null(vdef);
 sres = table_field_value_as_text_get(tn, fn, sfilter, float_as_str(vdef), sorderby, true);
 res = str_as_float(sres, vdef); 
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_float_get(tn character varying, fn character varying, sfilter text, vdef t_float, sorderby character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_float_get(tn character varying, fn character varying, sfilter text, vdef t_float, sorderby character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_float_get(tn character varying, fn character varying, sfilter text, vdef t_float, sorderby character varying) IS 'Получить значение поля fn (как bigint) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';


--
-- Name: table_field_value_as_float_set(character varying, character varying, text, t_float); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_float_set(tn character varying, fn character varying, sfilter text, val_new t_float) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sql_text text;
BEGIN
  -- Записать значение val_new (t_float) в поле fn таблицы tn для фильтра sfilter
  res = false;
  tn = str_is_null(tn);
  IF (tn <> '') THEN
     fn = str_is_null(fn);
     IF (fn <> '') THEN
        sfilter = str_is_null(sfilter);
        IF (sfilter <> '') THEN
           val_new = float_is_null(val_new);
           sql_text = 'update ' || tn || ' set ' || fn || ' = ' || val_new || ' where ' || sfilter || ' ;';
           res = public.exec_sql_text(sql_text);
           res = public.bool_is_null(res);
        END IF;
     END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_float_set(tn character varying, fn character varying, sfilter text, val_new t_float) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_float_set(tn character varying, fn character varying, sfilter text, val_new t_float); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_float_set(tn character varying, fn character varying, sfilter text, val_new t_float) IS 'Записать значение val_new (t_float) в поле fn таблицы tn для фильтра sfilter';


--
-- Name: table_field_value_as_int_get(character varying, character varying, text, integer, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_int_get(tn character varying, fn character varying, sfilter text, vdef integer DEFAULT 0, sorderby character varying DEFAULT ''::character varying) RETURNS integer
    LANGUAGE plpgsql
    AS $$
DECLARE
  res integer;
  sres text;
BEGIN
  -- Получить значение поля fn (как integer) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
  -- select * from table_field_value_as_int_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 vdef = int_is_null(vdef);
 sres = table_field_value_as_text_get(tn, fn, sfilter, int_as_str(vdef), sorderby, true);
 res = str_as_int(sres,vdef); 
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_int_get(tn character varying, fn character varying, sfilter text, vdef integer, sorderby character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_int_get(tn character varying, fn character varying, sfilter text, vdef integer, sorderby character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_int_get(tn character varying, fn character varying, sfilter text, vdef integer, sorderby character varying) IS 'Получить значение поля fn (как integer) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';


--
-- Name: table_field_value_as_int_set(character varying, character varying, text, integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_int_set(tn character varying, fn character varying, sfilter text, val_new integer) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sql_text text;
BEGIN  
  -- Записать значение val_new (integer) в поле fn таблицы tn для фильтра sfilter
  -- select * from table_field_value_as_int_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
  -- select * from table_field_value_as_int_set('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'), 31);
  -- select * from table_field_value_as_int_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
  -- select * from table_field_value_as_int_set('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'), 30);
  -- select * from table_field_value_as_int_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
  res = false;
  tn = str_is_null(tn);
  IF (tn <> '') THEN
     fn = str_is_null(fn);
     IF (fn <> '') THEN                                             
        sfilter = str_is_null(sfilter);
        IF (sfilter <> '') THEN                                             
           val_new = int_is_null(val_new);
           sql_text = 'update ' || tn || ' set ' || fn || ' = ' || val_new || ' where ' || sfilter || ' ;';
           res = public.exec_sql_text(sql_text);
           res = public.bool_is_null(res);                                         
        END IF;               
     END IF;               
  END IF;               
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_int_set(tn character varying, fn character varying, sfilter text, val_new integer) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_int_set(tn character varying, fn character varying, sfilter text, val_new integer); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_int_set(tn character varying, fn character varying, sfilter text, val_new integer) IS 'Записать значение val_new (integer) в поле fn таблицы tn для фильтра sfilter';


--
-- Name: table_field_value_as_str_get(character varying, character varying, text, character varying, character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_str_get(tn character varying, fn character varying, sfilter text, vdef character varying DEFAULT ''::character varying, sorderby character varying DEFAULT ''::character varying, yestrim boolean DEFAULT true) RETURNS character varying
    LANGUAGE plpgsql
    AS $$
DECLARE
  res character varying;
  sql_text text;
BEGIN
  -- Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
  -- select * from table_field_value_as_str_get('dir.props_list', 'name_max', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
  -- select * from table_field_value_as_str_get('dir.props_list', 'name_max', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'), '???');
  -- select * from table_field_value_as_str_get('dir.props_list', 'name_max', 'prop_type=8', '???', 'npp');
  -- select * from table_field_value_as_str_get('dir.dir_props', 'sum(cast(prop_val as t_float))', 'id_owner_guid=' || q39_lr('25EA85505308413BBAF770C42EECB574'));
  vdef = str_is_null(vdef);
  res = vdef;
  tn = str_is_null(tn);
  IF (tn <> '') THEN
     fn = str_is_null(fn);
     IF (fn <> '') THEN
        sfilter = str_is_null(sfilter);
        -- IF (sfilter <> '') THEN
           sorderby = str_is_null(sorderby);
           sql_text = '';
           sql_text = sql_text || 'select ' || fn || ' from ' || tn;
           IF (sfilter <> '') THEN
               sql_text = sql_text || ' where ' || sfilter;
           END IF;    
           IF (sorderby <> '') THEN
              sql_text = sql_text || ' order by ' || sorderby;
           END IF;
           sql_text = sql_text || ' limit 1 ;';
           res = public.exec_to_text(sql_text, vdef);
           IF (res is null) THEN
              res = vdef;
           ELSE
              yestrim = bool_is_null(yestrim);
              IF (yestrim=true) THEN
                 res = str_is_null(res);
              END IF;    
           END IF;    
        -- END IF;
     END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_str_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_str_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_str_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) IS 'Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';


--
-- Name: table_field_value_as_str_set(character varying, character varying, text, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_str_set(tn character varying, fn character varying, sfilter text, val_new character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sql_text text;
BEGIN  
  -- Записать значение val_new в поле fn таблицы tn для фильтра sfilter
  res = false;
  tn = str_is_null(tn);
  IF (tn <> '') THEN
     fn = str_is_null(fn);
     IF (fn <> '') THEN                                             
        sfilter = str_is_null(sfilter);
        IF (sfilter <> '') THEN                                             
           val_new = str_is_null(val_new);
           sql_text = 'update ' || tn || ' set ' || fn || ' = ' || val_new || ' where ' || sfilter || ' ;';
           res = exec_sql_text(sql_text);
           res = bool_is_null(res);                                         
        END IF;               
     END IF;               
  END IF;               
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_str_set(tn character varying, fn character varying, sfilter text, val_new character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_str_set(tn character varying, fn character varying, sfilter text, val_new character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_str_set(tn character varying, fn character varying, sfilter text, val_new character varying) IS 'Записать значение val_new в поле fn таблицы tn для фильтра sfilter';


--
-- Name: table_field_value_as_text_get(character varying, character varying, text, character varying, character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_text_get(tn character varying, fn character varying, sfilter text, vdef character varying DEFAULT ''::character varying, sorderby character varying DEFAULT ''::character varying, yestrim boolean DEFAULT true) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
  res text;
  sql_text text;
BEGIN
  -- Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
  -- select * from table_field_value_as_text_get('dir.props_list', 'name_max', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
  -- select * from table_field_value_as_text_get('dir.dir_props', 'sum(cast(prop_val as t_float))', 'id_owner_guid=' || q39_lr('25EA85505308413BBAF770C42EECB574'));
  vdef = str_is_null(vdef);
  res = vdef;
  tn = str_is_null(tn);
  IF (tn <> '') THEN
     fn = str_is_null(fn);
     IF (fn <> '') THEN
        sfilter = str_is_null(sfilter);
        -- IF (sfilter <> '') THEN
           sorderby = str_is_null(sorderby);
           sql_text = '';
           sql_text = sql_text || 'select ' || fn || ' from ' || tn;
           IF (sfilter <> '') THEN
               sql_text = sql_text || ' where ' || sfilter;
           END IF;    
           IF (sorderby <> '') THEN
              sql_text = sql_text || ' order by ' || sorderby;
           END IF;
           sql_text = sql_text || ' limit 1 ;';
           res = public.exec_to_text(sql_text, vdef);
           IF (res is null) THEN
              res = vdef;
           ELSE
              yestrim = bool_is_null(yestrim);
              IF (yestrim=true) THEN
                 res = str_is_null(res);
              END IF;    
           END IF;    
        -- END IF;
     END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_text_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_text_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_text_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) IS 'Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';


--
-- Name: table_field_value_as_text_set(character varying, character varying, text, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_as_text_set(tn character varying, fn character varying, sfilter text, val_new text) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sql_text text;
BEGIN  
  -- Записать значение val_new в поле fn таблицы tn для фильтра sfilter
  res = false;
  tn = str_is_null(tn);
  IF (tn <> '') THEN
     fn = str_is_null(fn);
     IF (fn <> '') THEN                                             
        sfilter = str_is_null(sfilter);
        IF (sfilter <> '') THEN                                             
           val_new = str_is_null(val_new);
           sql_text = 'update ' || tn || ' set ' || fn || ' = ' || val_new || ' where ' || sfilter || ' ;';
           res = public.exec_sql_text(sql_text);
           res = public.bool_is_null(res);                                         
        END IF;               
     END IF;               
  END IF;               
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_as_text_set(tn character varying, fn character varying, sfilter text, val_new text) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_as_text_set(tn character varying, fn character varying, sfilter text, val_new text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_as_text_set(tn character varying, fn character varying, sfilter text, val_new text) IS 'Записать значение val_new в поле fn таблицы tn для фильтра sfilter';


--
-- Name: table_field_value_avg_as_float_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_avg_as_float_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS t_float
    LANGUAGE plpgsql
    AS $$
DECLARE
  res t_float;
  sres text;
BEGIN
  -- Получить среднее значение поля fn в таблице tn с учетом фильтра sfilter
  -- select * from table_field_value_avg_as_float_get('dir.props_list', 'npp');
  -- select * from table_field_value_avg_as_float_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 res = 0;
 fn = str_is_null(fn);
 IF (fn <> '') THEN
    sres = table_field_value_as_text_get(tn, 'avg(' || fn || ')', sfilter, '0.0', '', true);
    res = str_as_float(sres, 0); 
 END IF;
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_avg_as_float_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_avg_as_float_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_avg_as_float_get(tn character varying, fn character varying, sfilter text) IS 'Получить среднее значение поля fn в таблице tn с учетом фильтра sfilter';


--
-- Name: table_field_value_get(character varying, character varying, text, character varying, character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_get(tn character varying, fn character varying, sfilter text, vdef character varying DEFAULT ''::character varying, sorderby character varying DEFAULT ''::character varying, yestrim boolean DEFAULT true) RETURNS text
    LANGUAGE plpgsql
    AS $$
DECLARE
  res text;
BEGIN
  -- Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
  -- select * from table_field_value_get('dir.props_list', 'name_max', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 res = table_field_value_as_text_get(tn, fn, sfilter, vdef, sorderby, yestrim);
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) IS 'Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';


--
-- Name: table_field_value_max_as_bigint_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_max_as_bigint_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS bigint
    LANGUAGE plpgsql
    AS $$
DECLARE
  res bigint;
  sres text;
BEGIN
  -- Получить максимальное значение поля fn в таблице tn с учетом фильтра sfilter
  -- select * from table_field_value_max_as_bigint_get('dir.props_list', 'npp');
  -- select * from table_field_value_max_as_bigint_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 res = 0;
 fn = str_is_null(fn);
 IF (fn <> '') THEN
    sres = table_field_value_as_text_get(tn, 'max(' || fn || ')', sfilter, '0', '', true);
    res = str_as_bigint(sres, 0); 
 END IF;
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_max_as_bigint_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_max_as_bigint_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_max_as_bigint_get(tn character varying, fn character varying, sfilter text) IS 'Получить максимальное значение поля fn в таблице tn с учетом фильтра sfilter';


--
-- Name: table_field_value_max_as_float_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_max_as_float_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS t_float
    LANGUAGE plpgsql
    AS $$
DECLARE
  res t_float;
  sres text;
BEGIN
  -- Получить максимальное значение поля fn в таблице tn с учетом фильтра sfilter
  -- select * from table_field_value_max_as_float_get('dir.props_list', 'npp');
  -- select * from table_field_value_max_as_float_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 res = 0;
 fn = str_is_null(fn);
 IF (fn <> '') THEN
    sres = table_field_value_as_text_get(tn, 'max(' || fn || ')', sfilter, '0.0', '', true);
    res = str_as_float(sres, 0); 
 END IF;
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_max_as_float_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_max_as_float_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_max_as_float_get(tn character varying, fn character varying, sfilter text) IS 'Получить максимальное значение поля fn в таблице tn с учетом фильтра sfilter';


--
-- Name: table_field_value_min_as_bigint_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_min_as_bigint_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS bigint
    LANGUAGE plpgsql
    AS $$
DECLARE
  res bigint;
  sres text;
BEGIN
  -- Получить минимальное значение поля fn в таблице tn с учетом фильтра sfilter
  -- select * from table_field_value_min_as_bigint_get('dir.props_list', 'npp');
  -- select * from table_field_value_min_as_bigint_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 res = 0;
 fn = str_is_null(fn);
 IF (fn <> '') THEN
    sres = table_field_value_as_text_get(tn, 'min(' || fn || ')', sfilter, '0', '', true);
    res = str_as_bigint(sres, 0); 
 END IF;
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_min_as_bigint_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_min_as_bigint_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_min_as_bigint_get(tn character varying, fn character varying, sfilter text) IS 'Получить минимальное значение поля fn в таблице tn с учетом фильтра sfilter';


--
-- Name: table_field_value_min_as_float_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_min_as_float_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS t_float
    LANGUAGE plpgsql
    AS $$
DECLARE
  res t_float;
  sres text;
BEGIN
  -- Получить минимальное значение поля fn в таблице tn с учетом фильтра sfilter
  -- select * from table_field_value_min_as_float_get('dir.props_list', 'npp');
  -- select * from table_field_value_min_as_float_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 res = 0;
 fn = str_is_null(fn);
 IF (fn <> '') THEN
    sres = table_field_value_as_text_get(tn, 'min(' || fn || ')', sfilter, '0.0', '', true);
    res = str_as_float(sres, 0); 
 END IF;
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_min_as_float_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_min_as_float_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_min_as_float_get(tn character varying, fn character varying, sfilter text) IS 'Получить минимальное значение поля fn в таблице tn с учетом фильтра sfilter';


--
-- Name: table_field_value_sum_as_bigint_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_sum_as_bigint_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS bigint
    LANGUAGE plpgsql
    AS $$
DECLARE
  res bigint;
  sres text;
BEGIN
  -- Получить сумму значений поля fn в таблице tn с учетом фильтра sfilter
  -- select * from table_field_value_sum_as_bigint_get('dir.props_list', 'npp');
  -- select * from table_field_value_sum_as_bigint_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 res = 0;
 fn = str_is_null(fn);
 IF (fn <> '') THEN
    sres = table_field_value_as_text_get(tn, 'sum(' || fn || ')', sfilter, '0', '', true);
    res = str_as_bigint(sres, 0); 
 END IF;
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_sum_as_bigint_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_sum_as_bigint_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_sum_as_bigint_get(tn character varying, fn character varying, sfilter text) IS 'Получить сумму значений поля fn в таблице tn с учетом фильтра sfilter';


--
-- Name: table_field_value_sum_as_float_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_field_value_sum_as_float_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS t_float
    LANGUAGE plpgsql
    AS $$
DECLARE
  res t_float;
  sres text;
BEGIN
  -- Получить сумму значений поля fn в таблице tn с учетом фильтра sfilter
  -- select * from table_field_value_sum_as_float_get('dir.props_list', 'npp');
  -- select * from table_field_value_sum_as_float_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
 res = 0;
 fn = str_is_null(fn);
 IF (fn <> '') THEN
    sres = table_field_value_as_text_get(tn, 'sum(' || fn || ')', sfilter, '0.0', '', true);
    res = str_as_float(sres, 0); 
 END IF;
 RETURN res;
END;
$$;


ALTER FUNCTION public.table_field_value_sum_as_float_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;

--
-- Name: FUNCTION table_field_value_sum_as_float_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_field_value_sum_as_float_get(tn character varying, fn character varying, sfilter text) IS 'Получить сумму значений поля fn в таблице tn с учетом фильтра sfilter';


--
-- Name: table_tmp_clear(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_tmp_clear(tn character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
  -- Очистить таблицу tn (если она временная)
  -- select * from table_tmp_clear('a333');
  res = false;
  tn = str_is_null(tn);
  if (table_tmp_tn_is_ok(tn) = true) THEN
     tn = lower(tn);
     res = public.exec_sql_text('delete from ' || tn || ';');
     res = bool_is_null(res);
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_tmp_clear(tn character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_tmp_clear(tn character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_tmp_clear(tn character varying) IS 'Очистить таблицу tn (если она временная)';


--
-- Name: table_tmp_create(character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_tmp_create(tn character varying, sqltext text) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  yesnext boolean;
  k integer;
BEGIN
  -- Создать временную таблицу (предварительно - предыдущая, с таким же именем, автоматически удаляется)
  -- select * from table_tmp_create('a333', 'CREATE temporary TABLE IF NOT EXISTS a333 (id serial, nav_namemax character varying(100)); CREATE INDEX a333_id ON a333(id);');
  -- select * from table_tmp_create('a333', 'CREATE temporary TABLE a333 (id serial, nav_namemax character varying(100)); CREATE INDEX a333_id ON a333(id);');
  -- select * from a333;
  -- select * from public.table_tmp_drop('a333');
  res = false;
  tn = str_is_null(tn);
  IF (table_tmp_tn_is_ok(tn) = true) THEN -- контроль имени таблицы (что это временная)
     tn = lower(tn);
     sqltext = str_is_null(sqltext);
     IF (sqltext <> '') THEN
        yesnext = true;
        -- -------------------------------------------
        -- простейший контроль имени таблицы и намерений программиста в sql-запросе
        k = position('CREATE' in upper(sqltext));
        IF (k<=0) THEN yesnext = false; END IF;
        k = position('TEMPORARY' in upper(sqltext));
        IF (k<=0) THEN yesnext = false; END IF;
        k = position('TABLE' in upper(sqltext));
        IF (k<=0) THEN yesnext = false; END IF;
        k = position(upper(tn) in upper(sqltext));
        IF (k<=0) THEN yesnext = false; END IF;
        -- -------------------------------------------
        -- -------------------------------------------
        IF (yesnext = true) THEN
           yesnext = public.table_tmp_drop(tn); -- удаляем предыдущую, если существует
           res = public.exec_sql_text(sqltext);
           res = bool_is_null(res);
        END IF;
        -- -------------------------------------------
     END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_tmp_create(tn character varying, sqltext text) OWNER TO postgres;

--
-- Name: FUNCTION table_tmp_create(tn character varying, sqltext text); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_tmp_create(tn character varying, sqltext text) IS 'Создать временную таблицу (предварительно - предыдущая, с таким же именем, автоматически удаляется)';


--
-- Name: table_tmp_create_as(character varying, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_tmp_create_as(tn_tmp character varying, tn_from character varying, sfilter character varying DEFAULT ''::character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  sqltext text;
BEGIN
  /*
     Создать временную таблицу БД на основе существующей таблицы БД
     Вх. параметры:
       tn_tmp - имя создаваемой (временной) таблицы БД;
       tn_from - имя таблицы БД, на основе которой создается tn_tmp;
       sfilter - фильтр, для копирования строк из таблицы tn_from в таблицу tn_tmp (необязательный параметр);
     Вых. параметры:
       =TRUE - успешно; =FALSE - ошибка
     Пример-1:
      select * from table_tmp_create_as('a333', 'dir.ot_list');
      select * from a333;
      select * from public.table_tmp_drop('a333');
     Пример-2:
      select * from table_tmp_create('a333', 'CREATE temporary TABLE a333 (id integer, namemax character varying(100));');
      --select * from a333;
      select * from exec_select('id, namemax from a333') as ds(id integer, namemax character varying);
      select exec_sql_text('insert into a333 (id, namemax) values (1,' || q39_lr('Object-1') || ')');
      select exec_sql_text('insert into a333 (id, namemax) values (2,' || q39_lr('Объект-2') || ')');
      select exec_sql_text('insert into a333 (id, namemax) values (3,' || q39_lr('Объект-3') || ')');
      --select * from a333;
      select * from exec_select('id, namemax from a333') as ds(id integer, namemax character varying);
      select * from table_tmp_create_as('a555', 'a333', 'id>1');
      --select * from a555;
      select * from exec_select('id, namemax from a555') as ds(id integer, namemax character varying);
      select * from table_tmp_drop('a333');
  */
  res = false;
  tn_tmp = lower(str_is_null(tn_tmp));
  if (table_tmp_tn_is_ok(tn_tmp) = true) THEN -- контроль имени таблицы (что это временная)
     tn_from = str_is_null(tn_from);
     IF (table_exist( -1, tn_from)= true) THEN
        sqltext = 'create temporary table ' || tn_tmp || ' as select * from ' || tn_from;
        sfilter = str_is_null(sfilter);
        IF (sfilter <> '') THEN
           sqltext = sqltext || ' where ' || sfilter;
        END IF;
        PERFORM public.table_tmp_drop(tn_tmp); -- удаляем предыдущую, если существует
        res = public.exec_sql_text(sqltext);
        res = bool_is_null(res);
     END IF;  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_tmp_create_as(tn_tmp character varying, tn_from character varying, sfilter character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_tmp_create_as(tn_tmp character varying, tn_from character varying, sfilter character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_tmp_create_as(tn_tmp character varying, tn_from character varying, sfilter character varying) IS 'Создать временную таблицу БД на основе существующей таблицы БД';


--
-- Name: table_tmp_delete(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_tmp_delete(tn character varying, sfilter character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
  -- Удалить из таблицы tn (если она временная) строки, согласно фильтра sfilter
  /*
  Пример.
    select * from table_tmp_create('a333', 'CREATE temporary TABLE a333 (id integer, namemax character varying(100));');
    --select * from a333;
    select * from exec_select('id, namemax from a333') as ds(id integer, namemax character varying);
    select exec_sql_text('insert into a333 (id, namemax) values (1,' || q39_lr('Object-1') || ')');
    select exec_sql_text('insert into a333 (id, namemax) values (2,' || q39_lr('Объект-2') || ')');
    select exec_sql_text('insert into a333 (id, namemax) values (3,' || q39_lr('Объект-3') || ')');
    --select * from a333;
    select * from exec_select('id, namemax from a333') as ds(id integer, namemax character varying);    
    select * from table_tmp_delete('a333', 'id=2');
    --select * from a333;
    select * from exec_select('id, namemax from a333') as ds(id integer, namemax character varying);    
    select * from table_tmp_drop('a333');
  */
  res = false;
  sfilter = str_is_null(sfilter);
  IF (sfilter <> '') THEN
     tn = str_is_null(tn);
     IF (table_tmp_tn_is_ok(tn) = true) THEN
        tn = lower(tn);
        res = public.exec_sql_text('delete from ' || tn || ' where ' || sfilter || ';');
        res = bool_is_null(res);
     END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_tmp_delete(tn character varying, sfilter character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_tmp_delete(tn character varying, sfilter character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_tmp_delete(tn character varying, sfilter character varying) IS 'Удалить из таблицы tn (если она временная) строки, согласно фильтра sfilter';


--
-- Name: table_tmp_drop(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_tmp_drop(tn character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
BEGIN
  -- Удалить таблицу tn (если она временная)
  -- select * from table_tmp_drop('a333');
  res = false;
  tn = str_is_null(tn);
  IF (table_tmp_tn_is_ok(tn) = true) THEN
     tn = lower(tn);
     res = public.exec_sql_text('drop table if exists ' || tn || ';');
     res = bool_is_null(res);
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_tmp_drop(tn character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_tmp_drop(tn character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_tmp_drop(tn character varying) IS 'Удалить таблицу tn (если она временная)';


--
-- Name: table_tmp_tn_is_ok(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE FUNCTION table_tmp_tn_is_ok(tn character varying) RETURNS boolean
    LANGUAGE plpgsql
    AS $$
DECLARE
  res boolean;
  k integer;
BEGIN
  -- Проверить, что tn может соответствовать имени ВРЕМЕННОЙ таблицы
  -- select * from table_tmp_tn_is_ok('a333');
  -- select * from table_tmp_tn_is_ok('tmp999.fff_pars');
  -- select * from table_tmp_tn_is_ok('dir.variants_list');
  res = false;
  tn = str_is_null(tn);
  IF (tn <> '') THEN
     tn = lower(tn);
     k = position('.' in tn);
     IF (k<=0) THEN
        k = 0;
        /*
        -- Здесь исключения (т.е., если в схеме public есть таблицы Б.Д., то их нужно указать здесь)
        -- IF (tn = 'props_types') THEN k = 1; END IF;
        */
        IF (k<=0) THEN
            res = true;
        END IF;
     END IF;
  END IF;
  RETURN res;
END;
$$;


ALTER FUNCTION public.table_tmp_tn_is_ok(tn character varying) OWNER TO postgres;

--
-- Name: FUNCTION table_tmp_tn_is_ok(tn character varying); Type: COMMENT; Schema: public; Owner: postgres
--

COMMENT ON FUNCTION table_tmp_tn_is_ok(tn character varying) IS 'Проверить, что tn может соответствовать имени ВРЕМЕННОЙ таблицы';


SET search_path = tmp, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: docs_list; Type: TABLE; Schema: tmp; Owner: postgres
--

CREATE TABLE docs_list (
    id integer NOT NULL,
    npp integer,
    doc_name character varying(200),
    note character varying(100),
    its_actual boolean
);


ALTER TABLE docs_list OWNER TO postgres;

--
-- Name: docs_list_id_seq; Type: SEQUENCE; Schema: tmp; Owner: postgres
--

CREATE SEQUENCE docs_list_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE docs_list_id_seq OWNER TO postgres;

--
-- Name: docs_list_id_seq; Type: SEQUENCE OWNED BY; Schema: tmp; Owner: postgres
--

ALTER SEQUENCE docs_list_id_seq OWNED BY docs_list.id;


--
-- Name: fio_list; Type: TABLE; Schema: tmp; Owner: postgres
--

CREATE TABLE fio_list (
    id integer NOT NULL,
    code integer,
    fio character varying(200),
    oklad double precision,
    yes_active boolean,
    d1 date,
    d2 date,
    note character varying(200)
);


ALTER TABLE fio_list OWNER TO postgres;

--
-- Name: id; Type: DEFAULT; Schema: tmp; Owner: postgres
--

ALTER TABLE ONLY docs_list ALTER COLUMN id SET DEFAULT nextval('docs_list_id_seq'::regclass);


--
-- Data for Name: docs_list; Type: TABLE DATA; Schema: tmp; Owner: postgres
--

INSERT INTO docs_list VALUES (2, 2, 'Документ-2', 'Примечание - B', true);
INSERT INTO docs_list VALUES (3, 3, 'Документ-3', 'Примечание - C', false);
INSERT INTO docs_list VALUES (1, 1, 'Документ-1', 'Примечание - A', NULL);


--
-- Name: docs_list_id_seq; Type: SEQUENCE SET; Schema: tmp; Owner: postgres
--

SELECT pg_catalog.setval('docs_list_id_seq', 1, false);


--
-- Data for Name: fio_list; Type: TABLE DATA; Schema: tmp; Owner: postgres
--

INSERT INTO fio_list VALUES (6, 106, '???', 0, NULL, NULL, NULL, '???');
INSERT INTO fio_list VALUES (3, 103, 'Петров Петр Петрович', 22135.709999999999, NULL, '2019-11-01', NULL, 'Примечание-3');
INSERT INTO fio_list VALUES (4, 104, 'Максимов Максим Максимович', 14879.42, false, '2010-05-05', '2020-01-31', 'Примечание-4');
INSERT INTO fio_list VALUES (5, 105, 'Николаев Николай Николаевич', 20954, true, '2011-03-07', NULL, 'Примечание-5');
INSERT INTO fio_list VALUES (2, 102, 'Сидоров Сидор Сидорович', 17012.25, true, '2020-02-21', NULL, 'Примечание-2');
INSERT INTO fio_list VALUES (1, 101, 'Иванов Иван Иванович', 15000, false, '2020-01-12', '2022-01-15', 'Примечание-1');


--
-- Name: docs_list_pkey; Type: CONSTRAINT; Schema: tmp; Owner: postgres
--

ALTER TABLE ONLY docs_list
    ADD CONSTRAINT docs_list_pkey PRIMARY KEY (id);


--
-- Name: fio_list_pkey; Type: CONSTRAINT; Schema: tmp; Owner: postgres
--

ALTER TABLE ONLY fio_list
    ADD CONSTRAINT fio_list_pkey PRIMARY KEY (id);


--
-- Name: public; Type: ACL; Schema: -; Owner: postgres
--

REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;


--
-- PostgreSQL database dump complete
--