Ċ /* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "). Ċ Ġ* Ġ ĠYou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠLicense Ġis Ġlocated Ġat : Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// aws . amazon . com / apache 2 . 0 / Ċ Ġ* Ċ Ġ* Ġ Ġor Ġin Ġthe Ġ" license " Ġfile Ġaccompanying Ġthis Ġfile . ĠThis Ġfile Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* Ġ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ċ Ġ* Ġ Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . part i ql . lang . ast . passes Ċ Ċ import Ġcom . amazon . ion .* Ċ import Ġorg . part i ql . lang . ast .* Ċ import Ġorg . part i ql . lang . errors .* Ċ import Ġorg . part i ql . lang . eval .* Ċ import Ġorg . part i ql . lang . util .* Ċ Ċ /** Ċ Ġ* ĠProvides Ġrules Ġfor Ġbasic ĠAST Ġsanity Ġchecks Ġthat Ġshould Ġbe Ġperformed Ġbefore Ġany Ġattempt Ġat Ġfurther ĠAST Ġprocessing . Ċ Ġ* ĠThis Ġis Ġprovided Ġas Ġa Ġdistinct Ġvisitor Ġso Ġthat Ġall Ġother Ġpasses Ġmay Ġassume Ġthat Ġthe ĠAST Ġat Ġleast Ġpassed Ġthe Ċ Ġ* Ġchecking Ġperformed Ġhere . Ċ Ġ* Ċ Ġ* ĠAny Ġexception Ġthrown Ġby Ġthis Ġclass Ġshould Ġalways Ġbe Ġconsidered Ġan Ġindication Ġof Ġa Ġbug Ġin Ġone Ġof Ġthe Ġfollowing Ġplaces : Ċ Ġ* Ċ Ġ* Ġ- Ġ[ org . part i ql . lang . syntax . Sql Parser ] Ċ Ġ* Ġ- ĠA Ġrewrite Ġpass Ġ( internal Ġor Ġexternal ) Ċ Ġ* Ċ Ġ* ĠAt Ġthe Ġtime Ġof Ġthis Ġwriting Ġthere Ġare Ġonly Ġ 3 Ġchecks Ġperformed , Ġwith Ġthe Ġidea Ġthat Ġmore Ġmay Ġbe Ġadded Ġlater . Ġ ĠChecks Ċ Ġ* Ġthat : Ċ Ġ* Ċ Ġ* Ġ- Ġ[ NA ry ] Ġar ity Ġis Ġcorrect Ċ Ġ* Ġ- Ġ[ DataType ] Ġar ity Ġis Ġcorrect . Ċ Ġ* Ġ- Ġ` *` Ġis Ġnot Ġused Ġin Ġconjunction Ġwith Ġother Ġselect Ġlist Ġitems . Ċ Ġ*/ Ċ object ĠAst San ity Validator Ġ{ ĊĠĠĠ Ġfun Ġvalidate ( ast Node : ĠAst Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġast Node . forEach Ġ{ Ġnode Ġ-> ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLiteral Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( ion Value , Ġmet as : ĠMeta Container ) Ġ= Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ion Value Ġis ĠIon Int Ġ&& Ġion Value . integer Size Ġ== ĠInteger Size . BIG _ INTEGER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerr IntOverflow ( error Context From ( metas )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNA ry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( op , Ġargs , Ġ_: ĠMeta Container ) Ġ= Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Ar ity ( op . symbol , Ġop . arity Range , Ġargs . size , Ġnode . metas ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCall Agg Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġset Quant ifier , Ġ_, Ġmet as : ĠMeta Container ) Ġ= Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( set Quant ifier Ġ== ĠSet Quant ifier . DIST INCT Ġ&& Ġmet as . has Meta ( Is Count Star Meta . TAG )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerr (" COUNT ( DIST INCT Ġ*) Ġis Ġnot Ġsupported ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode . EVAL U ATOR _ COUNT _ DIST INCT _ STAR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Context From ( metas ), ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġprojection , Ġ_, Ġ_, Ġ_, Ġgroup By , Ġhaving , Ġ_, Ġmet as ) Ġ= Ġnode ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( groupBy Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( groupBy . grouping Ġ== ĠGroup ing Strategy . PAR TIAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerr (" GROUP ĠPAR TIAL Ġnot Ġsupported Ġyet ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode . EVAL U ATOR _ FEATURE _ NOT _ SUPPORTED _ Y ET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Context From ( metas ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ Property . FEATURE _ NAME ] Ġ= Ġ" GROUP ĠPAR TIAL " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġinternal Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( projection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect Projection Pivot Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerr (" PI V OT Ġwith ĠGROUP ĠBY Ġnot Ġsupported Ġyet ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode . EVAL U ATOR _ FEATURE _ NOT _ SUPPORTED _ Y ET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Context From ( metas ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ Property . FEATURE _ NAME ] Ġ= Ġ" PI V OT Ġwith ĠGROUP ĠBY " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġinternal Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect Projection Value , Ġis ĠSelect Projection List Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġof Ġgroup Ġby Ġwith ĠSELECT Ġ& ĠSELECT ĠVALUE Ġis Ġsupported ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (( groupBy Ġ== Ġnull Ġ|| Ġgroup By . groupBy Items . isEmpty ()) Ġ&& Ġhaving Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSemantic Exception (" HAV ING Ġused Ġwithout ĠGROUP ĠBY Ġ( or Ġgrouping Ġexpressions )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode . SEM ANT IC _ HAV ING _ USED _ WITHOUT _ GROUP _ BY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Value Map (). add Source Location ( metas )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSelect Projection List Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaster isk Ġ= Ġnode . items . filter Is Instance < Select ListItem Star >(). first OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġselect Ġlist Ġcontains Ġmore Ġthan Ġone Ġitem Ġand Ġone Ġof Ġthem Ġis Ġa Ġ` *` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( aster isk Ġ!= Ġnull Ġ&& Ġnode . items . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSemantic Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"` *` Ġcannot Ġbe Ġused Ġwith Ġother Ġselect Ġlist Ġitems ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode . SEM ANT IC _ ASTER IS K _ USED _ WITH _ OTHER _ ITEMS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Value Map (). add Source Location ( aster isk . metas )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDataType Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( sql DataType , Ġargs , Ġ_: ĠMeta Container ) Ġ= Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! sql DataType . arity Range . contains ( args . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Ar ity ( sql DataType . name , Ġsql DataType . arity Range , Ġargs . size , Ġnode . metas ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ/* Ġno Ġvalidation Ġnecessary Ġ*/ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Ar ity ( function Name : ĠString , Ġexpected Range : ĠInt Range , Ġactual : ĠInt , Ġmet as : ĠMeta Container ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! expected Range . contains ( actual )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSemantic Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Incorrect Ġar ity ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode . SEM ANT IC _ IN CORRECT _ NODE _ AR ITY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Value Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty . FUNCTION _ NAME Ġto Ġfunction Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty . EXPECTED _ AR ITY _ MIN Ġto Ġexpected Range . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty . EXPECTED _ AR ITY _ MAX Ġto Ġexpected Range . last , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProperty . ACT UAL _ AR ITY Ġto Ġactual ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). add Source Location ( metas )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ