From 8ac5e63e0fb3198e375f0d913c49099b7b642fa4 Mon Sep 17 00:00:00 2001
From: "a.tolstoy" <a.tolstoy@picodata.io>
Date: Fri, 21 Feb 2025 17:56:17 +0300
Subject: [PATCH] describe SUBSTRING & LOCALTIMESTAMP

---
 docs/images/ebnf/expression.svg       | Bin 22721 -> 28290 bytes
 docs/images/ebnf/localtimestamp.svg   | Bin 0 -> 4184 bytes
 docs/images/ebnf/substring.svg        | Bin 0 -> 2860 bytes
 docs/images/ebnf/substringFor.svg     | Bin 0 -> 2670 bytes
 docs/images/ebnf/substringFrom.svg    | Bin 0 -> 3060 bytes
 docs/images/ebnf/substringFromFor.svg | Bin 0 -> 3242 bytes
 docs/images/ebnf/substringRegular.svg | Bin 0 -> 3237 bytes
 docs/images/ebnf/substringSimilar.svg | Bin 0 -> 3248 bytes
 docs/images/ebnf/substringVariant.svg | Bin 0 -> 3953 bytes
 docs/reference/ansi_sql.md            |  12 ++-
 docs/reference/sql/localtimestamp.md  |  44 ++++++++++
 docs/reference/sql/substr.md          |   5 +-
 docs/reference/sql/substring.md       | 112 ++++++++++++++++++++++++++
 docs/sql_index.md                     |   2 +
 mkdocs.yml                            |   2 +
 15 files changed, 170 insertions(+), 7 deletions(-)
 create mode 100644 docs/images/ebnf/localtimestamp.svg
 create mode 100644 docs/images/ebnf/substring.svg
 create mode 100644 docs/images/ebnf/substringFor.svg
 create mode 100644 docs/images/ebnf/substringFrom.svg
 create mode 100644 docs/images/ebnf/substringFromFor.svg
 create mode 100644 docs/images/ebnf/substringRegular.svg
 create mode 100644 docs/images/ebnf/substringSimilar.svg
 create mode 100644 docs/images/ebnf/substringVariant.svg
 create mode 100644 docs/reference/sql/localtimestamp.md
 create mode 100644 docs/reference/sql/substring.md

diff --git a/docs/images/ebnf/expression.svg b/docs/images/ebnf/expression.svg
index c4d798f9b37657110bc98ca1f3a683057cddd0e4..454a42487d88d9955207456ed7f34d1cccfa07bc 100644
GIT binary patch
literal 28290
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

literal 22721
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

diff --git a/docs/images/ebnf/localtimestamp.svg b/docs/images/ebnf/localtimestamp.svg
new file mode 100644
index 0000000000000000000000000000000000000000..734903cddb87730f0ab1acc8a61667581a1a8852
GIT binary patch
literal 4184
zcmc&%ZEu@M5dQ98u_Dr`mBKqVfyD0RnnXIO)t%JbeLWFa8x&v(5Wlp_f4`Z10c_)3
z^5Imsv6tPMXP%vzoms9vZHt_&Y29S3oNKmWX@r(BOR{n`*Z#V{(=RmAv{9KvIV<U0
zE1C9bF}Z5is|g`wlO=6B*F1Ns;bTg(Roc$AS->CH8QuKGwsXxQ76BQe=6iEC7tE5m
z28g!BpBk`U!C#oLxQq%gnzJ~{+pM6#q^JxK6>8;U6Gs&d2mC$qf%>t#qz|@bofF4$
zJl(c*EBMG&V7FxxW>RskrEOb<rn%W{3^i%6dS#;Brix<Pm}-8YuNZdvYQkvPa~;zq
zKv1Kkt$A~QW2!~nGLkkKz-)8C?l6$U#^u)SAP7vp+DnhgIhJLa${S*9@bs$W0^)R~
z7=^ga1jB^UBLw5nP045wQbj8ovz*m)?QF?EoE0GttWIdHmS+63x5U7MS-TT?B~7T9
zH7VO5a+5|0+srjbYASb!xYz+$keCMmoK{NXM_NCys0QjsA_;9C6}`m9e}^F787siH
z;RT*Ebwt{N9~8+LlGm|)!wG_^cc>e~#$3;s`GN1ahl`u6gl*~afY^?EaY90!8QZdt
zEJzR_VcSRkk&8g$n73RjqHR`W-|3id;^(@iWvl1WjzVO`@gpYBkAyCpJ|pnS)^Gt+
zr`_dLtP#@gDma}j-L_`jG;)I?jkp|W{o0)*^2^gRYcB^UPG-BxVzGW{z^S0*2U%u$
z9+DEO&Lvc!nmy8xoVhNfyrm|DdqZMhl9!3`!16?w%AJDkNre;&g$_H0jD^}3lDN*A
z>NbG{JVbLiTAOC&G1}dKq9GHcPLpmA2dvemUMA={qos9`l~Io33<9!@iY(uS<ZoIh
zQ5l_+Z&BIk4bWa*VhB!sxN-y027fr!_H|kA+cV{yQ;;yvQ8&D<hj8HY1f9cqLu7s?
z^=lD{w^A=zT|{|DzNRa>t$v2fWd^;UcTMB=oWxlj=k%OZEZ?nIc{<0sq<fj5=3bhK
z=-=IWH{OlP{?`u|hd7A1LJ4kz+jpQ~@^rNKkGFVwnaIr<eUy}~&;DosZMLpVUV?Z%
zGqHs6kwg{+tYTT&Hghc?wohzgyYS_7Edq+Bl(scl7e}>G*C&AC!q=F(qtwxf!ZK8J
zR~f=CB1@<07T!!wsOI3R>R)3o==vN`M9gsmU01;V`(^`i9yQ<+b+V=2s99I-3nMD_
zHLi`jRjn1<m12X}4b*kD#g{)mUw^s({p;<w`|GcNUYR(}1GeWgXvLBcI!)X;yGy9^
zKBsw#{ecCAiWUyya@xZ9zDK<_Rd(OtHOCpSnJPBQZBuRWVc@AqrWRf*!?dQ$xn>w9
z{BNG}f3Q<G=Gk-EWUG>jODG}yiW#<9n?oBvSVJq3uiAd^B+!Bo&J-C!hN0+!;j8OT
z|5DK9u(%)~;!OGi?iEJ{RFVh-y*YVCUN<1)F(_CvZ+hE)Z@Z5KA+KoSzWqH~T}T8h
z;(*7LBL}fDqvK?DX9{cRLAkxtsWzHa@RBBOZoM1v&`k%Y?te+<K-ukGIDQn6jePs#
z0qs1ek~z>89|sPrqBh+tDR{4wF@(e{MA1zhQsBE~YFnhRy_p(1-J}>?z_RXu5QxHB
zVF%q%cU&Al@kRJTBq8}^5qNXN3H$+l(1gL-2BSh^t>c&j!{CW8g9J(o3mvLNu=pZp
z>vUuVMbPmt6#s6jmvUU9yADZpbrR5V=%p?Mqs<B4YOp(bF7!5+|Lj#?sq;1r^f_R_
R&lm=DCCou+yX)0r@-JdgTO<Gg

literal 0
HcmV?d00001

diff --git a/docs/images/ebnf/substring.svg b/docs/images/ebnf/substring.svg
new file mode 100644
index 0000000000000000000000000000000000000000..bb21937fe472d14864f6f9891b2dbb0514d9488d
GIT binary patch
literal 2860
zcmd5;OLLnr5WeSE>?oIZCN>D{I1uBsN#jm0Jv5IyF|uI-f&n$Qo9Tb=N+4c&*zNS?
z14!cA&-!*(yPBSDk{BLXUPLMP2pyUP7+<78#8)1<xt<SB$l2^*T0E=(k-YFoC`9HO
z#(KRTuI*u(uMEpHO#=}G)=?lrkJ!$bK**w1C~z_%@DQ=}dAjk42`1oIz{S}C089h6
zEYwI&3bBnDh;7C^BG^V4i=rrT@Q(WlD>8q<;I$o`N>Uic5odDH`8_V9ICg=joSi};
z^7Nj$aA@1Ods8nAlmZv%>GzW9E{%ghpYE}?rlZO_^fNZd84p;Fu5)3LM@4oStXR>f
zwluW}BmNrod?$6aN2!Yi9jySB+Md2jerYIOJQOTXBJRhv`QtL>VzBg+DBiko%kseI
z{t;aHyciUyZdv-c#`gxwx`@7^Z>g1Sc7Rnx4l6GzkN4>6sp4I$oN_@%<u&G(J`8tP
z;=j=MUWIaheLT$*Ki*Se&Q@%b)sB*(|N9XvllAv2%-KR5!6M2RF*|}Rjkl|mznI)Q
z+spV%+voDTOuG4e^kMWtpU$0?K#@I@Oq$HObS{66Odh{h)aoPKEl_G!>Z#NZy8+h+
zeLlaKTuk=d!qiZ;wyeQMU4*CF!C4w{fyLedIsppQ#)n0TQ5y775;FnB+W2T-(q(`}
z-=+k%_^SH@HL=aq{lOxTBZ``uUfWp?X%Y$vXlq(^8p+gPT9nP=BK8YZqKiNa-u+h<
zjy_mz-%;B~U9+p3^Q-GGpFV$_8WLW5LvNRk`#P=TePq(nZk@=~DEc!p>A2DPrmfE}
zJHNZZHhBMB|EG@Q80xFuq?)*4&XyiIEWX}hzr?P1>*tZrMHeI@5o5c50;(?swR;`B
zNOaT48g=|zW+xu0X=8&I5tTXmYC?N9P({3Tva2+dJnfulBV<}wX2~t{qQCpL`wYLE
zCidvp(!{p^i!`w@Tct~-?6+;5nJ+@^O?hF`VMad&9!bg?5n7PQJ77pnNbvCLVLh;p
ypDba>o~$)6TYekZx_0zSlYKIlwaIp{g4ycT)TfuQ6D((l#aD^NV)?L|9sB@}_~hpR

literal 0
HcmV?d00001

diff --git a/docs/images/ebnf/substringFor.svg b/docs/images/ebnf/substringFor.svg
new file mode 100644
index 0000000000000000000000000000000000000000..96957b892f31bd8581f40acd3079b77c5322dbb7
GIT binary patch
literal 2670
zcmc&$S#O&_5Pr|E7?Ic5u;9vp7^iI-zgFt?PGJowupoBjqf!5RXLn&a<iv>-HGVLA
z%zVr@C#%~-S-_4qJg-=2k-1|5WpS0{EDf!nKQ^;#>vnyy;=2@3lJU^Wgs21C-tYJG
zy*IC#)OH=mu~EW;eV&Lcv^;ldK}Pd56S%?kE~op?)giPTZ~$)s57!p}uuABbtCiev
zaV#i^V@*R#(1WmJ&b1tTWKl_Z9mN!$v*1R8!o0{Cm5b5uahn%K0IXv42DoUd2O7Yo
z=b`mZcQ8{70w6bkHPY{@NM=*GN25&^t#%gGbk<Oo&<0%>K-}cKzE4uhr_gQ(EwY?F
z2faB9-P$O5(PYFGpk+JZ*V5OD(#3N@n=)rnVbmYD6%(^<ROZDofM2vpA{Jf2_lWTs
zM|NB7V<SIVC~cnqLEjR$KAaI&5xH!=s60M_Gh2nbS2-1cjLLJ!1AZ9pF~#@b_eq8F
z<@{LHlu_|Qh7C>Wp*D_^q5uC8)XDnx3>zAYD~R(ZF6b51RdGx!_GEH**{<U+bx-BD
zPP)xz@n!L)tIo5XK!Ke|rVh-%_wQc^Cd+RSHB++V2BmhIPs@Hj4tQ7So6X(wZuvqJ
zR<`Q3x(C~)39mW_*Hz90HhUk)5(p3v|6F3(T45?BWtM=l9{%-WkscYr0sH5}slh>f
z-?!DR)n<;`1X)A3p>>H_-B2zk)A(BCqQD6;xHc0+MhS4vc*KGuKFmn+aj=<*<hDf6
z`>RgF^_2$dwL@&80dWy=^vECu1}G|)CnS_D8X5hv?oD3VQl<5Oq@SHBWHGgVaXqpg
z8l*^^E*wVB^E*c&Go()j+m;m~^+h^xNPpO}=$ht0eEilSWg{&4l0{E=^Yz=1={shG
z>u9T9lM)Vox+pikc}}=QL!VEIIucozd-6ME5RW9ZN?m%H3#I(D%7_D{Z&qfpxb7~^
qQ7`4myP4Nz)3mrf{R+?hAnRK``U-za)=|B{!-tl|cC$;@7ykez{lp&t

literal 0
HcmV?d00001

diff --git a/docs/images/ebnf/substringFrom.svg b/docs/images/ebnf/substringFrom.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6099650f35818e4b0c935731d97f19609fbf4976
GIT binary patch
literal 3060
zcmc&$OOu;85Wdf^=+ayVgMhII#yH6)<6A0KdF-7vvY`Tk0hJ#+mH(cWgk)gnwN;yq
z573gjKlj(&>Sp=oSe3A6ZCBJhA#~;uV0=?&1>Ys)+t;;oL*A?|mfd~_sL8v8<U%yD
z>mCk=*&&$K?auW*&vQ|Oz@f-Qo{(S>5y)Aw%SA$ND1m*!4u90ggm~Zqo&s*JE&yPe
zv2CX$x#+~HWFSrrONd}c;cmK4>%m)|R;+8%4TI-AxRszVD+|t~F#0`gi?WP?*PPu#
zC))Zui{UZ|(0k8pIEq0G^!A5F`l~K8XA1XVt!da>=V`;7mhp_W7`hlXZP7J%*^YHn
zXx~7Kyx`A4uU~}jeU!XdHsT7<vz_qk>1#t7;+bG=Rq(X5<`3JN3ul{FMR|(hPu6BB
zPp{xh$~&h+c3T}|t3MHxbyxh2v88@<d_h@d<g$;ViueT1E*0)U)l>{JE6*Vh_+h%o
z6n_W5cPf>y=f~@|O3PO=Y}t+-8yhH@`u{(Jx>)~vhArEOE7%n6res&p)a7Yc^Cyej
zRJ+c<w0*3;b<wTY;fL^pxt%X|0tNO+F&VJvF1q`7VDkD6vSzRBxIw9v=F_vEjT3Gz
z`g;9-@qY127nZK-wYmqpwh1pyfSbDD0-JpVbO97-fDfM%R~t;Vq|O3RH^9ePE!86<
zK4Sm;{@CE4Q53oAl=PLO7IEIPZ9*=ws$15{$uvF|g(z`C436ytky!$qGXV~r6Ta+7
zig2)*i4^!f5sd!QSok=y&;srHAvUpqO__EWkwFOzP*g4-(NMl<WQ@z|?DEo;CVl)<
z{Wh-9`PBRQ*n4P^BK1r<tlf2F0)@;Jne&D0Ss~JSZxE34X3xSj&4K#(Ux$>fvgAwW
zXTs~xpFR$$T336D;ljq-4@Vh#EywVB;9*Y^q0W4MEy?*cSzQeo{>GyB|4}!S8rIi$
zRP|Ugzo_i}K^Z(>_f0BtbG_uJ)*yLVLMq)|avv)B^_Wu+s>n*dmF8A*sHbE+t8T31
zP^Ej1_8#Cv;%LQt570zz$XDf1z1aJq(bzjuR=6nK8+)m({=kB20CW$Jl&7fPOUjX8
z4i&oLgyED(AoZNU-05kH4d$v92McVq0e(U+27UG^-MMPq0lsuk#-_jDtuB57G^HHd

literal 0
HcmV?d00001

diff --git a/docs/images/ebnf/substringFromFor.svg b/docs/images/ebnf/substringFromFor.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9ad049a85cf6f4c52b5ececa1bb3e493d4431ea0
GIT binary patch
literal 3242
zcmd5;O>dh(5WVMDjL0=MERZ@7<Frk}t%{U>+$pR91r`J=e>CcU@9ZvMpib;aNmC!p
zF3ddU&AgpqeznOnSkbCZ3+8ELYG^=NSVSp{J?;B9e{!K+El%e3Dh9M<wWlSVm#(g_
z*X!xpnif^8n}%WNXraM6jd<c|=VYcqLen_mo@U{CmD2U+V&iEB7=TX!Z!S&%U>?zB
zEmvYw^KC|fZ%gWFoNl-t*0r*Ok1WV(T?QeA=OVZipfJr+M#W<Adt9bj<^n4iy@Z-q
z#RGNW)Uq&oqrEYa3|t_WzZKHYB8w(txW~?$*o}7*lyp*27SRe*=R#Peb$J`bv>rp7
zEi_M3_8hc-5W0y`@S@RxD?r0`#IK>R97T$!oK|_tf~<3YTo#N^mO-9oTNi%NDhgO|
z244eKPikbhR5|YKM+@m)r@t__#4I-ljAcbmn=HzVkKnqk#9d2Gxge_Y9CD8zmU~F?
zJ@|c+r97S=E2=!mj$~NTm~P50QKIz!zJf}uug|ceAwPpKt-_3+L0M$mxL{9;yH&fY
zzwq6sZzVe4w{Ps5_H-WX1QKkIm|8IB*13Hdm^gmDs&z+p*r4Q2@oCskhXrpBy6<1l
zu4hMvFxO?TRXtemn((|$a9N~`W3zVvn>7Jq;h#w~T{(=cgv|`l*22G?S)fLSyTShX
zuy1e>$8mJ|RBMzYH*QkVrKg>usw-NH$uxY-Q=Z|3=soTxh^P|aoUw=oTfB55$-%+a
zO(e4+g4v(99;PEb(61R{BM%6(pvH{!B+x^VwcKMNV^PSMm&GpRxh`Cq{0HjVhC=Ld
z^dE-NLxmKH(Uzn0vz#_j$PDR|-nL<dNV`MYOUUkK!=i1PJ@esP`;<Fl!I#)O!v6i;
zmp;{Zl!S=|c&R4Hn~B0~^me=|tiLpEUko(;geok2)2_PvRe?x5lebZYh2j+H7li%0
z`~O4~mZPG2L8Gu7{GgR-eDzLY8w&ccD9V5*ZATJcr@it;o|dbIoS2Y{5AK8*kUQO~
zTYTtN-C~cGebGYfv9iRoiPd(Z@nASN<YYJ}=VCU93sQSxh%~mgBj<>?C|ev=t9Wtp
E2Q4~Yod5s;

literal 0
HcmV?d00001

diff --git a/docs/images/ebnf/substringRegular.svg b/docs/images/ebnf/substringRegular.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8a81f08b69745bb42a87c072ae208f5695e4e613
GIT binary patch
literal 3237
zcmd5;+j5&Q5Pi>A?2uR6ARyyFjMFxWf1sCl3bJ7Wf<YQzn(4oHC2=1owrA3&elQa3
z9`@`W?XtMv=NW8i#nXZX2ANp~P!<(&$~J-V{o87KYuqod7JRz_v}8Om5+O?8G<Un*
zZ0F31YGc}#WtnJUz%GqN5*Y5y+<=6pn?wYLgX?WdcVCKqU|3)QJ_WqFyaIqlOxIkk
z<c5nwMnN1(8W@7^g&A?K?cfs&bIQvwqVQG(cM=q4S<0wf41O=`G|PNo1*3PsMO8dg
zAFdq-qqmwHQ^mjsa`#&!{VcM0I)-~`y@^|UCt*pa6=gB4Fm*meRm#h!ctiOZ+HRml
zlCrm;S0|zC7$q+n54Zx<Y)AZR`r1*ZcqV9-r!34`_m_3S#B?3zX?F182d(0eg%kK1
zGCt+VZmo0N+K(2>o2S1px5O^@CyZ4^uIntSjE~^jt-{?YP5B_J@)mNBAC`Ma@gw+s
zR;4_jA1kUn%+6$3(GA^~ZK7o9|9u6uSl^#vMI$kRD6OK5PM|EZ!=_-bin~#}uD|p>
zrf)5})yjQzADh#8vJ)t<BVua6yeIGJGBA1kdR1$W?65(po#s=spA8G%9Q4)dVg4{b
zGlYeydadrkX4`}pO@hlJWdfVM2V@Qeh=YGNF-+|+wvsk;KwAg@I<ruZ41bUP^ZD4|
zAfD%$>ZwsHM{WG1qU*r8Mpajo%gHo+EK-r-gy=nPCy1;P;GA)Y0SCOaBgw<T)=nh5
zCW6^tG#<96JkYNmVj~ZTvXEm&dJ^cNs9GMeP_bxa%*(P1d0|SII{%@*HlYxA9KG!h
zqK678600dk>*sh)qL3NVC%tXW3X!@)+Dk}xvu4pW&7S%2t$oU^vE)nKj_{<<^8@uj
zZf`CX1i3}^s3g9-B8aD<&zFSljpIL05;nf6EA59#!m&ES|BECXJS`XY2uFU){vAm;
zu7*A>i82&P(~RVYX|KL<VC1?NCpP5rTRR~Z<X*dK7q;6xY;Rp^<w%67(=?&+OmJN_
d6x^E|ITqxl8w{`6I%<Ttc+s{vrM8>p)gL`QT+RRh

literal 0
HcmV?d00001

diff --git a/docs/images/ebnf/substringSimilar.svg b/docs/images/ebnf/substringSimilar.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c3131de6a7a6b7631670cd6590d0c9698798d6ff
GIT binary patch
literal 3248
zcmd5;+isgc5Pi>AjL2(jt}cNXr)g?Sky@#0+P+g*0}3n%R<Yfv|K8bM?sZ~EN}Bq?
z?6NcCIcLt!cz(IfQn)8&mE_b@^r@x*p+O!dH1d@1-&T`z<#KT{ukIs2OImqK%vj;7
z>SnW<Zp>+3MyjD{nu-<*Y?6@0o-%u<D-e?;ikYXFwgUGF*?h>io}z&UcnbJ(aRLDI
zkgO}Q;+u-?QUYvO5Km!b%haH%q#eAcenzUo4+uP!!37Tr(=?%kF9x57b&{qo(43MB
zs92fb5f@HP6SLQv7ZZWN1^wc;jPx^4!^t?@L+h<uwRh|nWKt3uk`k$NAt;loScVa)
z#-WWSG>a4ZROr>g&~=U+7YPSg0cx}(d^LRO$SIyOQf3MD)7JfAol`bh`&p9iT=+rC
z(5L<x-1@YdRETaZId1Jo3*lWQzmQwqD7FWTMMX|)76s#@aP3ya-3U#&z^n39<Q_gO
z_YmS+;JXr~JRTp-%gj%YL|BrDY>SpCUiyDuK`GXkM_7`8ok5V4K}yb`$kSbv(?`YK
zs9n~d`|i`X6y0iNeY8F{xAR~p5W)6{sR`yRo#pd_@$1*CT6<-O4NB}Jo*MmhSn%ee
zuU6OgwS8m?b5-<O*@M-#3C|mXi#(wWo4o_N4Lay1ei^!=N{6u(x3K|jP5kQ2d^s}Q
zE%wj5eS<@H97h$WO068RapRJ#J>?WtU6P7Vrr|M5Sc(&(cic`8UM0XeW8whX;iDZ%
z4i2_<A{jLhWPjdx7>@8jzj}y`JRnH@3K{81pch5da*u_`MMg$m7G277mAlmZ`|{bO
zqFdwa&xhGVi4b+IDM#yPIt@{X4B_j&ZH)>eb(ge9NcXZv(KOAT`S4f!kXvJpSGPLA
zw>O_}K3#q7qkThF7=IBvDzen~Ko-cUr1HgeVf1)9P8jBFEDYNi$odgsnD|Rwf%gjo
zBXuUPBMfua31fMCef4GepXkD}uu(j(U0Ai0UZG!Db(Ie{jKXJe)0g;v)LsQcPswCk
zjt$88-|kq~AamMPyEt!G?P8CWZ8RbFSeg86VmAF~JRW8<oFF#LW@19{M>iuLv$b&I
Qm@vbKw8epSA1zM)0Ee1jFaQ7m

literal 0
HcmV?d00001

diff --git a/docs/images/ebnf/substringVariant.svg b/docs/images/ebnf/substringVariant.svg
new file mode 100644
index 0000000000000000000000000000000000000000..923521c30ec329db993767bffae8a96d6c00aab1
GIT binary patch
literal 3953
zcmc&%*>;;S5Pi>A%u!y0LBbA(m~@RlpxZk&GH}XPpkA8OfA2^_6sR4$CrkYR61p>*
zxicD#7q50%3L9S4Ns;@6PAmdEUln1JM?U%dX=%*KtJ{l3y@>#kdF_+9X-dyDx7+Px
zYfp+QGMQyrCL#!Ildy?>!k9}S=1CMcIH5LyO~SWti=9s_umG1qe7(H@fJMmHwH%2_
z-Rx5i&A#M5Y51-&S9Ps$@H!7NUYEg&!$UUQ2&FJdlbnme;CH`H($s^z$oUP_O;vp3
z9$eZs+HdI(hV;P$dh<(Z`dXx+F;;iqNz-X79S0>hDxQbDLh?LVRY_gmg%PjEs+m^Z
z#7X{;>g7q*t&PGj9u9m3XuTcz*SfC+1;vwwS6Pw=X(xWaF7n1$2U(KtJ@~?_Fvx=|
z_!#81QKNTj#c_up4Wx9P{6uakD|aWrG9s5Pi<0q?x^61<Ze><^Afob+=AM5T?xBnS
z!@oB&l;``G7gZLdXL?xii0{gdC=vRXkDyA{r}wbptL6$;NwrG(6_iD~kBa<ga_ekY
z@fWg(@>?a{ayflJeXmdF$x0xV9Y`jv%)N8({!N)Ue!Zx5M|N1C<V^X~dOsNkTp#r1
z@}2X}In#uNDQm5&!Dd&47n<O*Nb&~Dy$jR<3e?62qr_AKW0b%+fLI$Je_(;SG`t<w
z&u@pW4(htDDOX9GIdbB~6<_=0vi|WE3oVw@WmRO$q8fslq)G9f_zTqCCL&^hm(Gk5
z*!u+Uq4t8JHr{jkg0flb6^3G=MW%Rzp$G~d5rI`2)W}aSA$n?LWDg*uHA*$IbUQYE
zVG6-ECV_fC8HXQu^dk*UaHv7YIGj3v7-94CNSw}&$~>CI>sgP**7#>-@pKkqnjT}%
z?d6koW(v+RU33nPWFE~PwcH+k=-TsAhllv|2|h|5wR?F)&t#9<y;DCDdOUqIY+?sz
z_*wb;m|#bC>Hurdu@t0EFP|7Y?*vn)f9!`sk7v<!dMvi~A0o00npp298giXWShqu;
zWa<uz8DvcS%ZRB385VjyG^iuTxR}vdH#Dd##@`Wb0Y0RZM1HrxP#?rAGw58dZrBtR
zNW{hvW2qPih*xldRy%ZBTMgF|qAX)`ZJDw~D8hAt+(;Ys7IJT#;K!%h+mc%fJLLdL
zdcn<c+crAN@fY2kvBBnZOconCcdj8e>|@;xqp}NP47(f~|GqlC7H8ZEX)KjJ6T_Ek
Mhp^w;M7I~e0h1~sUH||9

literal 0
HcmV?d00001

diff --git a/docs/reference/ansi_sql.md b/docs/reference/ansi_sql.md
index ade59c19..10ea2ba6 100644
--- a/docs/reference/ansi_sql.md
+++ b/docs/reference/ansi_sql.md
@@ -187,8 +187,12 @@ td.td3 ul {
         <tr>
             <td class="center"><span class="partly">E021-06</span></td>
             <td>Функция SUBSTRING</td>
-            <td class="td3 center">[SUBSTR](sql/substr.md)</td>
-            <td>Функция SUBSTRING не поддерживается, но есть SUBSTR</td>
+            <td class="td3 center"></td>
+            <td class="td3 center"><ul>
+                                   <li>[SUBSTR](sql/substr.md)</li>
+                                   <li>[SUBSTRING](sql/substring.md)</li>
+                                   </ul></td>
+            <td></td>
         </tr>
         <tr>
             <td class="center"><span class="full">E021-07</span></td>
@@ -845,9 +849,9 @@ td.td3 ul {
             <td></td>
         </tr>
         <tr>
-            <td class="center"><span class="absent">F051-08</span></td>
+            <td class="center"><span class="full">F051-08</span></td>
             <td>LOCALTIMESTAMP</td>
-            <td class="td3 center"></td>
+            <td class="td3 center">[LOCALTIMESTAMP](sql/localtimestamp.md)</td>
             <td></td>
         </tr>
 <!-- F081 UNION and EXCEPT in views -->
diff --git a/docs/reference/sql/localtimestamp.md b/docs/reference/sql/localtimestamp.md
new file mode 100644
index 00000000..dacec538
--- /dev/null
+++ b/docs/reference/sql/localtimestamp.md
@@ -0,0 +1,44 @@
+# LOCALTIMESTAMP
+
+Функция `LOCALTIMESTAMP` возвращает текущую дату и время в часовом поясе
+из текущей сессии SQL. Это возвратит значение `TIMESTAMP`.
+
+В качестве аргумента для функции можно указать целое число от `0` до `6`,
+определяющее точность времени. Значения выше `6` игнорируются.
+
+## Синтаксис {: #syntax }
+
+![LOCALTIMESTAMP](../../images/ebnf/localtimestamp.svg)
+
+## Примеры {: #examples }
+
+```sql title="Получение текущей даты и времени"
+sql> SELECT localtimestamp;
++-----------------------------+
+| col_1                       |
++=============================+
+| 2025-02-21T17:47:21.236402Z |
++-----------------------------+
+(1 rows)
+```
+
+```sql title="Получение текущей даты и времени с повышенной точностью"
+
+sql> select localtimestamp(3);
++--------------------------+
+| col_1                    |
++==========================+
+| 2025-02-21T17:48:09.981Z |
++--------------------------+
+(1 rows)
+```
+
+```sql title="Получение текущей даты и времени с максимальной точностью"
+sql> SELECT localtimestamp(6);
++-----------------------------+
+| col_1                       |
++=============================+
+| 2025-02-21T17:51:18.664697Z |
++-----------------------------+
+(1 rows)
+```
diff --git a/docs/reference/sql/substr.md b/docs/reference/sql/substr.md
index 13e70adc..21304e4d 100644
--- a/docs/reference/sql/substr.md
+++ b/docs/reference/sql/substr.md
@@ -28,7 +28,7 @@
 
 ## Примеры {: #examples }
 
-```title="Запрос VALUES с функцией SUBSTR и параметром <i>from</i>"
+```sql title="Запрос VALUES с функцией SUBSTR и параметром <i>from</i>"
 sql> VALUES ( SUBSTR('picodata', 3) );
 +----------+
 | COLUMN_1 |
@@ -36,10 +36,9 @@ sql> VALUES ( SUBSTR('picodata', 3) );
 | "codata" |
 +----------+
 (1 rows)
-
 ```
 
-```title="Запрос VALUES с функцией SUBSTR и параметрами <i>from</i> и <i>count</i>"
+```sql title="Запрос VALUES с функцией SUBSTR и параметрами <i>from</i> и <i>count</i>"
 sql> VALUES ( SUBSTR('picodata', 3, 4) );
 +----------+
 | COLUMN_1 |
diff --git a/docs/reference/sql/substring.md b/docs/reference/sql/substring.md
new file mode 100644
index 00000000..99697b96
--- /dev/null
+++ b/docs/reference/sql/substring.md
@@ -0,0 +1,112 @@
+# SUBSTRING {: #substring }
+
+Функция `SUBSTRING` извлекает подстроку из строки *string* подобно тому,
+как это делает функция [SUBSTR](substr.md), однако предоставляет
+дополнительные возможности поиска символов.
+
+## Синтаксис {: #syntax }
+
+### Основная функция {: #main_function }
+
+![SUBSTRING](../../images/ebnf/substring.svg)
+
+### Варианты поиска подстроки {: #substringVariant }
+
+![SUBSTRINGVARIANT](../../images/ebnf/substringVariant.svg)
+
+Доступны несколько вариантов поиска подстроки:
+
+- `For` — искать слева направо _по_ указанный номера символа
+- `From` — искать слева направо _с_ указанного номера символа, а также
+  извлечь первую подстроку, соответствующую регулярному выражению в
+  стиле POSIX
+- `FromFor` — сочетание обоих вариантов выше, указание полных границ поиска
+- `Regular` — традиционный поиск по номерам символов, как в [SUBSTR](substr.md)
+- `Similar` — поиск по схожести c использованием регулярного выражения и
+  экранирования специальных символов в нем
+
+Отличие варианта `FromFor` от `Regular` также состоит в том, что поиск
+может происходить не только по позициям символом (их номерах), но и по
+вхождению подстроки с помощью регулярных выражений, см. [примеры](#examples).
+
+#### substringFor {: #substringFor }
+
+![SUBSTRINGFOR](../../images/ebnf/substringFor.svg)
+
+#### substringFrom {: #substringFrom }
+
+![SUBSTRINGFROM](../../images/ebnf/substringFrom.svg)
+
+#### substringFromFor {: #substringFromFor }
+
+![SUBSTRINGFROMFOR](../../images/ebnf/substringFromFor.svg)
+
+#### substringRegular {: #substringRegular }
+
+![SUBSTRINGREGULAR](../../images/ebnf/substringRegular.svg)
+
+#### substringSimilar {: #substringSimilar }
+
+![SUBSTRINGSIMILAR](../../images/ebnf/substringSimilar.svg)
+
+### Выражение {: #expression }
+
+??? note "Диаграмма"
+    ![Expression](../../images/ebnf/expression.svg)
+
+### Литерал {: #literal }
+
+??? note "Диаграмма"
+    ![Literal](../../images/ebnf/literal.svg)
+
+## Примеры {: #examples }
+
+```sql title="Указание только начального отступа"
+sql> SELECT SUBSTRING('(select 1)', 3);
++----------+
+| col_1    |
++==========+
+| elect 1) |
++----------+
+(1 rows)
+```
+
+```sql title="Указание обеих границ"
+sql> SELECT SUBSTRING('1234567890' FROM 4 FOR 3);
++-------+
+| col_1 |
++=======+
+| 456   |
++-------+
+(1 rows)
+```
+
+```sql title="Поиск первой подстроки, удовлетворяющей регулярному выражению в стиле SQL"
+sql> SELECT SUBSTRING('abcdefg' FROM 'a#"(b_d)#"%' FOR '#');
++-------+
+| col_1 |
++=======+
+| bcd   |
++-------+
+(1 rows)
+```
+
+```sql title="Поиск первой подстроки, удовлетворяющей регулярному выражению в стиле POSIX"
+sql> SELECT substring('Thomas' FROM '...$') ;
++-------+
+| col_1 |
++=======+
+| mas   |
++-------+
+(1 rows)
+```
+
+```sql title="Поиск первой подстроки, удовлетворяющей регулярному выражению в стиле SQL"
+sql>  SELECT SUBSTRING('abcdefg' SIMILAR 'a#"%#"x|g' ESCAPE '#');
++-------+
+| col_1 |
++=======+
+| bcdef |
++-------+
+(1 rows)
+```
diff --git a/docs/sql_index.md b/docs/sql_index.md
index b2ede7a6..d7463b9f 100644
--- a/docs/sql_index.md
+++ b/docs/sql_index.md
@@ -115,6 +115,7 @@ article.md-typeset.md-typeset ul {
 * [LIMIT](reference/sql/select.md#params)
 * [LIMIT ALL](reference/sql/select.md#params)
 * [LIMIT NULL](reference/sql/select.md#params)
+* [LOCALTIMESTAMP](reference/sql/localtimestamp.md)
 * [LOWER](reference/sql/lower.md)
 
 <b>M</b>
@@ -146,6 +147,7 @@ article.md-typeset.md-typeset ul {
 * [sharding key](overview/glossary.md#sharding_key)
 * [stored procedure](overview/glossary.md#stored_procedure)
 * [SUBSTR](reference/sql/substr.md)
+* [SUBSTRING](reference/sql/substring.md)
 * [SUM](reference/sql/aggregate.md#functions)
 
 <b>T</b>
diff --git a/mkdocs.yml b/mkdocs.yml
index 6c7e74d0..b128da93 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -113,10 +113,12 @@ nav:
         - reference/sql/like.md
         - reference/sql/lower.md
         - reference/sql/substr.md
+        - reference/sql/substring.md
         - reference/sql/trim.md
         - reference/sql/upper.md
         - Дата и время:
           - reference/sql/current_date.md
+          - reference/sql/localtimestamp.md
           - reference/sql/to_char.md
           - reference/sql/to_date.md
     - reference/cli.md
-- 
GitLab