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 } + + + +## Примеры {: #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 } + + + +### Варианты поиÑка подÑтроки {: #substringVariant } + + + +ДоÑтупны неÑколько вариантов поиÑка подÑтроки: + +- `For` — иÑкать Ñлева направо _по_ указанный номера Ñимвола +- `From` — иÑкать Ñлева направо _Ñ_ указанного номера Ñимвола, а также + извлечь первую подÑтроку, ÑоответÑтвующую регулÑрному выражению в + Ñтиле POSIX +- `FromFor` — Ñочетание обоих вариантов выше, указание полных границ поиÑка +- `Regular` — традиционный поиÑк по номерам Ñимволов, как в [SUBSTR](substr.md) +- `Similar` — поиÑк по ÑхожеÑти c иÑпользованием регулÑрного Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ + ÑÐºÑ€Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñпециальных Ñимволов в нем + +Отличие варианта `FromFor` от `Regular` также ÑоÑтоит в том, что поиÑк +может проиÑходить не только по позициÑм Ñимволом (их номерах), но и по +вхождению подÑтроки Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ регулÑрных выражений, Ñм. [примеры](#examples). + +#### substringFor {: #substringFor } + + + +#### substringFrom {: #substringFrom } + + + +#### substringFromFor {: #substringFromFor } + + + +#### substringRegular {: #substringRegular } + + + +#### substringSimilar {: #substringSimilar } + + + +### Выражение {: #expression } + +??? note "Диаграмма" +  + +### Литерал {: #literal } + +??? note "Диаграмма" +  + +## Примеры {: #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