Thursday, April 30, 2015

Painting the Mona Lisa with SQL

Seven years after the first Obfuscated SQL Code Contest, a new one has been organised on the PL/SQL Challenge website. I had fun writing my first entry back then, but in the back of my mind I regretted not doing something with ASCII art. So the new contest was a good pretext for me to finally fill in that gap. Here is my entry for the second Obfuscated SQL Contest:

SQL> select listagg
  2   (chr(nvl2(x,y,
  3   32*nvl2(a,1,2)
  4    )))within group
  5    (order    by l)
  6     mona_lisa  from
  7     (select level"L"
  8      from user_users
  9      connect by 2*3*4
 10       *8*16+64>=rownum
 11       )l left join  (
 12        select ascii('@'
 13        )*(ascii(substr(
 14         x,rownum*3-2,1))
 15         -65)-65+ascii  (
 16          substr(x,rownum*
 17          3-1,1))"A",ascii(
 18           '@')*(ascii(substr
 19           (x,rownum*3-2,1))-
 20            65)  -131+ascii(
 21            substr(x,rownum*3
 22            -1,1))+ascii(substr
 23             (x,rownum*3,1))"B"
 24             from(select'HUKI'||
 25             'RLJRPKOULOUMNWN'||
 26              'NVONUPNVQBDQNYR'||
 27              'BDRMZSNOTUGUVEV'||
 28               'WDW]EXVEXgEYLOY'||
 29               ']NZLNZ\N[MN[^K\'||
 30                'MO\]L]NM]^J^OG^'||
 31                'VD^^I_OF_^H`QF`'||
 32                 '^EdSEeTDfUHgUHh'||
 33                 'WDaSF'x from dual
 34                  where 1=1/*voor@
 35                   patch72*/group by
 36                     cube('m','o',
 37                     'n','a','l',
 38                   'i','s','a') having
 39                grouping_id('m','o','n','a',
 40           'l','i','s','a')between 11 and 58))x on
 41           (l between a and b) left join (with x(v)
 42            as(select 1 from dual union   all select
 43            x.v+1 from dual join x on(28>=x.v))search
 44             depth first by v set a select(16+v+decode
 45             (sign(round((v-6)/5)),-1,0,0,1,4))*64"X",
 46              91"Y"from x union all select p,x from (
 47               select x,y,sum(nvl2(nullif(z,1),z-1,1))
 48                over (order by i) p from (select i,x,y
 49                 ,nvl(nullif(dense_rank()over(order by
 50                  decode(y,'louvre',x)   nulls first
 51                    ),28),29)z from(select i,x,case
 52                     when x in(34,35,36,37,38,48,
 53                      49,51,54,57,58,59,60,62,63
 54                       ,64,66,67,69,70,72,73,79,
 55                         81,82,83,85)then'louvre'
 56                           end y from(select i,
 57                             158-ascii(regexp_substr
 58                               (x,'((.)?)',i,1))x from
 59                                  user_users model return      updated
 60                                    rows dimension by(1 i) measures
 61                                      (rpad('leonardo da vinci',7
 62  *6*5*4*2-1)x)(x[for i from 1 to 1679 increment 1]='5>5*u("CCCCvoo'||
 63  '+su>vqBBoTT7<::m:1SSv;}voqClao;;*o}q(B}?RBu"Aq}ov}quBRBu(";iv}r}'||
 64  'R::Y:SoA};BBB("5Bo;JB(vv;qA}>o(Boovq"*BH(;R}1xQX<R*BB"u;olq((uo5'||
 65  '*BpqqoqrBrB(Br"uo(o1nSO<S}(}qv~uq}pCo;J~oopBqqwqq"qo;v9mZZK+BBBB'||
 66  'q""o(};Bpqrq"B>""BqBo5:kPI<pur>qrqo;q>5}rB}q}q}w}q}:mNCs tt]]]O<'||
 67  'opo>;qopBgqqqwpqq~qor5:ztN}>eBwDfV5pBBwpBp;~wr>r>BwqrqT{i>qdqq~>'||
 68  'q5E]e<h?Bq"qB;q~wp~qpr>opW{Sq~>_q~ugSQY;qqqqqo~q~>q~~qq5{]5Xq}DD'||
 69  'Y<}~B>"q>~>qrwq~WzCrXwpZfSYCoqrqopq>~pqo(z]uUquD:Q:[Bw~?B~q~>~r5'||
 70  'HTz}Vwq}vSiS[Cvo+Cp~~q~5BWzDqXw~}~q5iiDD\uvju>~r~q"<y}BVw~~>~"q*'||
 71  'EW^FPEDqz**y]qrMw~~>uv:^Zuf]yufxBLrqwqoS:\SZ{~~AADy:"q`r55p;rr~q'||
 72  'p5;RDSSnf|Shv|f|~~SPfxv~p5}(WW?nTjS<fDS<|<<S|:|ffm<e:S|q~uofSzS|'||
 73  '<|:N   JjvyT:{g>???+|QyQQf:z:cRQf|B}jf|Syf{:tz<H5z<]SRE  nt88oBP'||
 74  'Qf_:<{rBBS<z:|p *>~}t }>p~~qQ]uyw wpup>~>rwS\]S<|r>fQn~q>rr7(D>>'||
 75  'y]ooq~~pp;BsB>y5A:nQdf|5B|f|SzZ`B}wb}5Dfzf]xf:|<zfQ|9f:iYw}qbwqu'||
 76  'f[Qf5f:Df|Qyqb(~~rerB*Sc]nDl"|<|]Sz<|C`ood;;*<]z]S{:{:zSz<15{f|Q'||
 77  '|fzNqcqaopho5Zf:`]z:yfzQ]yBqnpz?u7l5kqvv:SSx:y:{SnSy<]S{S{u5xw;r'||
 78  'rS<{<SmuFuS<|Q{:zQ<{]|:nfzS|<y]|]]o5qx QyQ;yprB;auZf:{<z:ef:{]xQ'||
 79  '<nvw;B>xNNSvvr5A("qBq(ufFP]:QSm<{QS|]kf{QS|:|]|R}qq;u+?r~rvD+<R<'||
 80  '|B>q~pqPAoSQm:z]k:yS<zS|<zoq~~}ww  H88tPi8~q>~qrBuuSSmQS{:zQf:|<'||
 81  'x<zS]Snlqqyrr?TTo5uoq~"o(uPS|f:efkQ|Szf:|Sz<x:}rzwHHBuBBuBgvqujT'||
 82  '<|f|]zS|:mfhQyf{S|S<z:|(pm>qBBo(uff<|Q|]|S{Qz]{Q|f{]|:|f|Q|D<|:|'||
 83  'Q|Se1mqu}o+*<<|<{]|<xS<m<zSyS{:x:|Q|fxS+zrqo(TZ{f:|SnfeQSz<{Q{*P'||
 84  '|<{:|:|QeRRjTS:|]{:{SyQSyfd<nuPQ|f<{]z]`]{]{f{S|:yQ{S{S|]zf{Qxv*'||
 85  'QQz:{Qfy]y]z]h]yf<{f:^Q|*PD{Sz:y]xfzojP{f|<{:{Q|f|QS|Qf|Sn:hQoS]'||
 86  'fzQ]zQeC"*tD|Pyf{QfD]DD|Qz]|:xSz:{<ETjQn]cZpBwvESSDZ|f:S|i]fjED|'||
 87  ':Qc:zSi:Qf|f:|:kfnppq}ouuDSi]Sju]EvoFEoDz]z:zQxEf:P]{]S{:z<hRrqr'||
 88  'B}AABFviuDog;BB*ioSk<mfQfz]z]{fhSZR*}~}rq"*wvqBB}rBorB}DTWz:|Q:zW'
 89  )))))where y is null)y on(l.l=y.x)group by ceil(l.l/(2*ascii(' ')))
 90  /

MONA_LISA
-----------------------------------------------------------------
i`it)v|[[[[(//s+)`(-\\/JJgbdd@@@@@@@dmKK(c!(/-[2=/cct/!-v\!_L\)|
]-!/(!-)\L\)v|c5(!,!Ldd@@@@@@@@@@@@@@@@@@@dK/]!c\\\v|i\/cT\v((c-
]!`/v\//(-|t\VvcL!m@@@@@M@@@@@@@@@@@@@@@@@@@@bLt\\|)c/2-vv)/it\.
--/-,\,\v\,|)/v/m@@@@@@K@@@@@@@@@@@@@@@@@@@@@@@bK!v!-( )-!.[/cT
//.\--'--|-/c(e@@@@@@@DD@@@@@@@@@@@@@@@@@@@@@@@@@@s\\\\-||/v!c\.
-,-|\`||\-\/id@@@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@b.),`-,-/c-`i
!,\!-!-!'!-!d@@@@@@@P[+~**AAA@@@@@@@@@@@@@@@@@@@@@@@b/./`c-/.\7-
--'.-- -/,id@@@*P!`          \'Z8@@@@@@@@@@@@@@@@@@@@@i.\\'.\.c
',`,`\'-,-J@@5`-           -- `-iYA@@@@@@@@@@b@@@@@@@@@_\-|-\c-
'. -.,`/.G@@K- `               - )7KM@@@@@@@@@@@@@@@@@@@c-----/
- `-  --i@@Ai                    -!ZZ@@@@@@@@@@@@@@@@@@@b! \`|-`
 `-,'- G@@@[,                    '.D8K@@@@@@@@@@@@@@@@@@@[/-,-/.
-` .-/v@@@A)                      -)ZdMd@@@@@@@@@@@@@@@@@@\' _\
- ` ,iVJ@@@!                     '-!(K5K@@@@@@@@@@@@@@@@@@[(/s[.
  - i\G@@@Z-                    ' ! -i55ZZ@@@@@@@@@@@@@@@@@)(4)`
 , -|b@@@@!\                     '  ` |-tYG@@@@@@@@@@@@@@@@XNYZ-
   tt@@@@A-,                        '  `)(d@@@@@@@@@@@@@@@@D)8A[
   )8@@@@@\                         ,-'-/Kd@@@@@@@@@@@@@@@@@KD@[
  ]]Z@@@@d|-              ,ii.c,, -.icLZKK@@@@@@8@K@@@@@@@@@(@8[
  KN8@@@@@( .i!vGG_      J4Kb8ZKb@bbK@d@88@@@@@@@b@@@@@@@@@@dK@-
 )/8K@@@K@b@dP~~~T4(    Jd@@7`___s@M@@@@MM8d@@@d@@@@@@@@@@@@LM8[
\!48@K@@@@8@@d*@@@bVi   bAKLY~~@@@@@@*ff/\NM8@@@@@@@@@@@@@@@db@[
,\\Kb@@@d@.~t` !*~!`.  -MA)    '~'.).` `,'K@@@@@@@@@@@@@@@@@AKb[
,`8M@@@@@@ -`,,gvZ``    A//-  ..c\+\`    i]d@@@@@@M@@@@@@@@@@@8[
i\@8@K@@@D              \!'             !iZ8@@@8A@@@@@8d@b@@@8M[
e8d5@@@@@@             '!-             '-)8@@@@@@@@@@@@@@@@@@M8i
8dZ8@M@@@@-             v  ,          ,\tK@@@@@@@@@@@@A@@@@@@Z2|
@b@AK@@@b@[              //           cctbA@@@AK@@d@@d@@@K@@@bmi
@@8@M@8@@@P-            -=/.         /iD8d@@@@@@@@@@@@@@A@@@d@@[
@8@@@MA@@@@\-      .   _)g2i        -((dKK@@@@@d@@@@d@@K@@@@@@K[
@@@bAK@@K@@)i     'c,,Kb@@bK       )X)Kb@M@@d@@@Mb@@A@d@@@@@@8@[
@K@b@@@@A@AA/i-     ~M@@@@Mc    .,\c=)D8d@@b@@@d@@@@@@@@@@8d@@A[
@@@@Mb@@@@@@('c\`     PPK((,i]v|-\-v)8XNAdMK@@@@@@@b@@MK@A@@@@@[
@@8@@MK@d@A@L!--c)s_, ,(ZsbLb@\`- .-N]/KM@@@@@@@d@@@A@@@@@@@@d@[
@@Kb@@@K@b@@@/-  !''~~Vff*N5f -` -,\))KK@@@@@@@MK@@d@@@M8d@b@@@[
@b@@@KAK@@@@@@2--    ,,_JJ/i)/- |/v)NK@8d@@@@@@@@@@8@@@@@@@@M@K[
@@8d@K@@@b@@@@@d!,   'VV\)\\)\7(-)4Jb@8@A@@@K@d@@@@@@@8@@@@@@@@[
M@@@@8@@K@Kb@@@d@v.       `-\\/v)88b@M@A@K@@M@@@A@@M@8@@A@d@8@M[
Zb@d@M@K@@@@@@@@@@m       -)!/stbb@b@@A@b@@@@@Kb@@@@@@@b@@@K@@@[
K@@d@@@@@d@M@8@@@@@Ks   ,-/vJD@@8d@K@@@@@@8@@@@@@@@@@MK@@@b@@M@[
tN@b@@d@d@M@@@@@@@@@@LL4JKd@A@@d@@K@@@@MK@@@@8@@@@@@@@@@@b@@@@@[
)NM@8b@@A@@@A@@@@@@@@@@@@@@A@@A@@8@@K@d@@@@M@@K@@K@A@@@8@@M@@@@[
(tMM@@@d@@M8@@@@A@@@@A@@@A@@@@@@@@@A@@@@8b@@8d@@@@@@@@@@@@@@@@M[
tNZ@@K@@@d@@@@A@@@@@8@@@/4N@@8@b@@d@@M@8@MK@M8@K@@@@@@d@@@@@@@@[
M/KA8@@@MA@@@M@@@@@@@@@@[|t*Z@N@@@@8@@M8ZAZZ@M@@@A@d@@@@@K@@@d@[
bYJ4M@@@@@@A@@@@@@@@@@@@D.\'(YKKZD@8dK@5A84YZ@dM@@@@@@@@@@@@d@@[
K5dM8@8d@d@@@@@@@@8@@@@@@..-!/))ZK5AK4)AY(/XY/Z@@@A@@@d@@@M@@@@[
Y8dNA@@AK@@d@@@b@@@@@@@@@L,-,\!]]\X(5)Z/7c\\t5/K@@@@@@@@b@@@@@@[
8M8@@@A@@@A@@8@@@@@@@@@KDLt! !,-|t'(-\\!,\/,\!ZJG@@@d@Md@@@G@@@[

49 rijen zijn geselecteerd.
Note: I seem to have misunderstood the new contest. It's totally different than the first one. This only became clear to me after I tried to add my finished entry on the PL/SQL Challenge website. Oh well, it sure was fun!