| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772 |
- // Copyright 2014 The ql Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package ql
- import (
- "bytes"
- "fmt"
- "io"
- "math"
- "math/big"
- "time"
- )
- // QL types.
- const (
- qBool = 0x62 // 'b'
- qComplex64 = 0x63 // 'c'
- qComplex128 = 0x64 // 'd'
- qFloat32 = 0x66 // 'f'
- qFloat64 = 0x67 // 'g', alias float
- qInt8 = 0x69 // 'i'
- qInt16 = 0x6a // 'j'
- qInt32 = 0x6b // 'k'
- qInt64 = 0x6c // 'l', alias int
- qString = 0x73 // 's'
- qUint8 = 0x75 // 'u', alias byte
- qUint16 = 0x76 // 'v'
- qUint32 = 0x77 // 'w'
- qUint64 = 0x78 // 'x', alias uint
- qBigInt = 0x49 // 'I'
- qBigRat = 0x52 // 'R'
- qBlob = 0x42 // 'B'
- qDuration = 0x44 // 'D'
- qTime = 0x54 // 'T'
- )
- var (
- type2Str = map[int]string{
- qBigInt: "bigint",
- qBigRat: "bigrat",
- qBlob: "blob",
- qBool: "bool",
- qComplex128: "complex128",
- qComplex64: "complex64",
- qDuration: "duration",
- qFloat32: "float32",
- qFloat64: "float64",
- qInt16: "int16",
- qInt32: "int32",
- qInt64: "int64",
- qInt8: "int8",
- qString: "string",
- qTime: "time",
- qUint16: "uint16",
- qUint32: "uint32",
- qUint64: "uint64",
- qUint8: "uint8",
- }
- )
- func typeStr(typ int) (r string) {
- return type2Str[typ]
- }
- func noEOF(err error) error {
- if err == io.EOF {
- err = nil
- }
- return err
- }
- func runErr(err error) error { return fmt.Errorf("run time error: %s", err) }
- func invXOp(s, x interface{}) error {
- return fmt.Errorf("invalid operation: %v[%v] (index of type %T)", s, x, x)
- }
- func invSOp(s interface{}) error {
- return fmt.Errorf("cannot slice %s (type %T)", s, s)
- }
- func invNegX(x interface{}) error {
- return fmt.Errorf("invalid string index %v (index must be non-negative)", x)
- }
- func invNegLO(x interface{}) error {
- return fmt.Errorf("invalid LIMIT or OFFSET value %v (must be non-negative)", x)
- }
- func invSliceNegX(x interface{}) error {
- return fmt.Errorf("invalid slice index %v (index must be non-negative)", x)
- }
- func invBoundX(s string, x uint64) error {
- return fmt.Errorf("invalid string index %d (out of bounds for %d-byte string)", x, len(s))
- }
- func invSliceBoundX(s string, x uint64) error {
- return fmt.Errorf("invalid slice index %d (out of bounds for %d-byte string)", x, len(s))
- }
- func intExpr(x interface{}) (i int64, err error) {
- switch x := x.(type) {
- case idealInt:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return int64(x), nil
- case idealRune:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return int64(x), nil
- case idealUint:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return int64(x), nil
- case int8:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return int64(x), nil
- case int16:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return int64(x), nil
- case int32:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return int64(x), nil
- case int64:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return int64(x), nil
- case uint8:
- return int64(x), nil
- case uint16:
- return int64(x), nil
- case uint32:
- return int64(x), nil
- case uint64:
- return int64(x), nil
- default:
- return 0, fmt.Errorf("non-integer expression: %v (value of type %T)", x, x)
- }
- }
- func limOffExpr(x interface{}) (i uint64, err error) {
- switch x := x.(type) {
- case idealInt:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return uint64(x), nil
- case idealRune:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return uint64(x), nil
- case idealUint:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return uint64(x), nil
- case int8:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return uint64(x), nil
- case int16:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return uint64(x), nil
- case int32:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return uint64(x), nil
- case int64:
- if x < 0 {
- return 0, invNegLO(x)
- }
- return uint64(x), nil
- case uint8:
- return uint64(x), nil
- case uint16:
- return uint64(x), nil
- case uint32:
- return uint64(x), nil
- case uint64:
- return uint64(x), nil
- default:
- return 0, fmt.Errorf("non-integer used in LIMIT or OFFSET: %v (value of type %T)", x, x)
- }
- }
- func indexExpr(s *string, x interface{}) (i uint64, err error) {
- switch x := x.(type) {
- case idealFloat:
- if x < 0 {
- return 0, invNegX(x)
- }
- if s != nil && int(x) >= len(*s) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case idealInt:
- if x < 0 {
- return 0, invNegX(x)
- }
- if s != nil && int64(x) >= int64(len(*s)) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case idealRune:
- if x < 0 {
- return 0, invNegX(x)
- }
- if s != nil && int32(x) >= int32(len(*s)) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case idealUint:
- if x < 0 {
- return 0, invNegX(x)
- }
- if s != nil && uint64(x) >= uint64(len(*s)) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case int8:
- if x < 0 {
- return 0, invNegX(x)
- }
- if s != nil && int(x) >= len(*s) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case int16:
- if x < 0 {
- return 0, invNegX(x)
- }
- if s != nil && int(x) >= len(*s) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case int32:
- if x < 0 {
- return 0, invNegX(x)
- }
- if s != nil && int(x) >= len(*s) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case int64:
- if x < 0 {
- return 0, invNegX(x)
- }
- if s != nil && x >= int64(len(*s)) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case uint8:
- if s != nil && int(x) >= len(*s) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case uint16:
- if s != nil && int(x) >= len(*s) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case uint32:
- if s != nil && x >= uint32(len(*s)) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case uint64:
- if s != nil && x >= uint64(len(*s)) {
- return 0, invBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- default:
- return 0, fmt.Errorf("non-integer string index %v (value of type %T)", x, x)
- }
- }
- func sliceExpr(s *string, x interface{}, mod int) (i uint64, err error) {
- switch x := x.(type) {
- case idealFloat:
- if x < 0 {
- return 0, invSliceNegX(x)
- }
- if s != nil && int(x) >= len(*s)+mod {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case idealInt:
- if x < 0 {
- return 0, invSliceNegX(x)
- }
- if s != nil && int64(x) >= int64(len(*s)+mod) {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case idealRune:
- if x < 0 {
- return 0, invSliceNegX(x)
- }
- if s != nil && int32(x) >= int32(len(*s)+mod) {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case idealUint:
- if x < 0 {
- return 0, invSliceNegX(x)
- }
- if s != nil && uint64(x) >= uint64(len(*s)+mod) {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case int8:
- if x < 0 {
- return 0, invSliceNegX(x)
- }
- if s != nil && int(x) >= len(*s)+mod {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case int16:
- if x < 0 {
- return 0, invSliceNegX(x)
- }
- if s != nil && int(x) >= len(*s)+mod {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case int32:
- if x < 0 {
- return 0, invSliceNegX(x)
- }
- if s != nil && int(x) >= len(*s)+mod {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case int64:
- if x < 0 {
- return 0, invSliceNegX(x)
- }
- if s != nil && x >= int64(len(*s)+mod) {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case uint8:
- if s != nil && int(x) >= len(*s)+mod {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case uint16:
- if s != nil && int(x) >= len(*s)+mod {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case uint32:
- if s != nil && x >= uint32(len(*s)+mod) {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- case uint64:
- if s != nil && x >= uint64(len(*s)+mod) {
- return 0, invSliceBoundX(*s, uint64(x))
- }
- return uint64(x), nil
- default:
- return 0, fmt.Errorf("invalid slice index %s (type %T)", x, x)
- }
- }
- type iop int
- func (o iop) String() string {
- switch i := int(o); i {
- case andand:
- return "&&"
- case andnot:
- return "&^"
- case lsh:
- return "<<"
- case le:
- return "<="
- case eq:
- return "=="
- case ge:
- return ">="
- case neq:
- return "!="
- case oror:
- return "||"
- case rsh:
- return ">>"
- default:
- return string(i)
- }
- }
- func ideal(v interface{}) interface{} {
- switch x := v.(type) {
- case idealComplex:
- return complex128(x)
- case idealFloat:
- return float64(x)
- case idealInt:
- return int64(x)
- case idealRune:
- return int64(x)
- case idealUint:
- return uint64(x)
- default:
- return v
- }
- }
- func eval(v expression, execCtx *execCtx, ctx map[interface{}]interface{}) (y interface{}) {
- y, err := expand1(v.eval(execCtx, ctx))
- if err != nil {
- panic(err) // panic ok here
- }
- return
- }
- func eval2(a, b expression, execCtx *execCtx, ctx map[interface{}]interface{}) (x, y interface{}) {
- return eval(a, execCtx, ctx), eval(b, execCtx, ctx)
- }
- func invOp2(x, y interface{}, o int) (interface{}, error) {
- return nil, fmt.Errorf("invalid operation: %v %v %v (mismatched types %T and %T)", x, iop(o), y, ideal(x), ideal(y))
- }
- func undOp(x interface{}, o int) (interface{}, error) {
- return nil, fmt.Errorf("invalid operation: %v%v (operator %v not defined on %T)", iop(o), x, iop(o), x)
- }
- func undOp2(x, y interface{}, o int) (interface{}, error) {
- return nil, fmt.Errorf("invalid operation: %v %v %v (operator %v not defined on %T)", x, iop(o), y, iop(o), x)
- }
- func invConv(val interface{}, typ int) (interface{}, error) {
- return nil, fmt.Errorf("cannot convert %v (type %T) to type %s", val, val, typeStr(typ))
- }
- func truncConv(val interface{}) (interface{}, error) {
- return nil, fmt.Errorf("constant %v truncated to integer", val)
- }
- func convert(val interface{}, typ int) (v interface{}, err error) { //NTYPE
- if val == nil {
- return nil, nil
- }
- switch typ {
- case qBool:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- //case idealFloat:
- //case idealInt:
- //case idealRune:
- //case idealUint:
- case bool:
- return bool(x), nil
- //case complex64:
- //case complex128:
- //case float32:
- //case float64:
- //case int8:
- //case int16:
- //case int32:
- //case int64:
- //case string:
- //case uint8:
- //case uint16:
- //case uint32:
- //case uint64:
- default:
- return invConv(val, typ)
- }
- case qComplex64:
- switch x := val.(type) {
- //case nil:
- case idealComplex:
- return complex64(x), nil
- case idealFloat:
- return complex(float32(x), 0), nil
- case idealInt:
- return complex(float32(x), 0), nil
- case idealRune:
- return complex(float32(x), 0), nil
- case idealUint:
- return complex(float32(x), 0), nil
- //case bool:
- case complex64:
- return complex64(x), nil
- case complex128:
- return complex64(x), nil
- //case float32:
- //case float64:
- //case int8:
- //case int16:
- //case int32:
- //case int64:
- //case string:
- //case uint8:
- //case uint16:
- //case uint32:
- //case uint64:
- default:
- return invConv(val, typ)
- }
- case qComplex128:
- switch x := val.(type) {
- //case nil:
- case idealComplex:
- return complex128(x), nil
- case idealFloat:
- return complex(float64(x), 0), nil
- case idealInt:
- return complex(float64(x), 0), nil
- case idealRune:
- return complex(float64(x), 0), nil
- case idealUint:
- return complex(float64(x), 0), nil
- //case bool:
- case complex64:
- return complex128(x), nil
- case complex128:
- return complex128(x), nil
- //case float32:
- //case float64:
- //case int8:
- //case int16:
- //case int32:
- //case int64:
- //case string:
- //case uint8:
- //case uint16:
- //case uint32:
- //case uint64:
- default:
- return invConv(val, typ)
- }
- case qFloat32:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- case idealFloat:
- return float32(x), nil
- case idealInt:
- return float32(x), nil
- case idealRune:
- return float32(x), nil
- case idealUint:
- return float32(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- case float32:
- return float32(x), nil
- case float64:
- return float32(x), nil
- case int8:
- return float32(x), nil
- case int16:
- return float32(x), nil
- case int32:
- return float32(x), nil
- case int64:
- return float32(x), nil
- //case string:
- case uint8:
- return float32(x), nil
- case uint16:
- return float32(x), nil
- case uint32:
- return float32(x), nil
- case uint64:
- return float32(x), nil
- case *big.Int:
- v, _ := big.NewRat(1, 1).SetInt(x).Float64()
- return float32(v), nil
- case *big.Rat:
- v, _ := x.Float64()
- return float32(v), nil
- case time.Duration:
- return float32(x), nil
- default:
- return invConv(val, typ)
- }
- case qFloat64:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- case idealFloat:
- return float64(x), nil
- case idealInt:
- return float64(x), nil
- case idealRune:
- return float64(x), nil
- case idealUint:
- return float64(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- case float32:
- return float64(x), nil
- case float64:
- return float64(x), nil
- case int8:
- return float64(x), nil
- case int16:
- return float64(x), nil
- case int32:
- return float64(x), nil
- case int64:
- return float64(x), nil
- //case string:
- case uint8:
- return float64(x), nil
- case uint16:
- return float64(x), nil
- case uint32:
- return float64(x), nil
- case uint64:
- return float64(x), nil
- case *big.Int:
- v, _ := big.NewRat(1, 1).SetInt(x).Float64()
- return v, nil
- case *big.Rat:
- v, _ := x.Float64()
- return v, nil
- case time.Duration:
- return float64(x), nil
- default:
- return invConv(val, typ)
- }
- case qInt8:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- case idealFloat:
- if _, frac := math.Modf(float64(x)); frac != 0 {
- return truncConv(x)
- }
- return int8(x), nil
- case idealInt:
- return int8(x), nil
- case idealRune:
- return int8(x), nil
- case idealUint:
- return int8(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- case float32:
- return int8(x), nil
- case float64:
- return int8(x), nil
- case int8:
- return int8(x), nil
- case int16:
- return int8(x), nil
- case int32:
- return int8(x), nil
- case int64:
- return int8(x), nil
- //case string:
- case uint8:
- return int8(x), nil
- case uint16:
- return int8(x), nil
- case uint32:
- return int8(x), nil
- case uint64:
- return int8(x), nil
- case *big.Int:
- return int8(x.Int64()), nil
- case time.Duration:
- return int8(x), nil
- default:
- return invConv(val, typ)
- }
- case qInt16:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- case idealFloat:
- if _, frac := math.Modf(float64(x)); frac != 0 {
- return truncConv(x)
- }
- return int16(x), nil
- case idealInt:
- return int16(x), nil
- case idealRune:
- return int16(x), nil
- case idealUint:
- return int16(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- case float32:
- return int16(x), nil
- case float64:
- return int16(x), nil
- case int8:
- return int16(x), nil
- case int16:
- return int16(x), nil
- case int32:
- return int16(x), nil
- case int64:
- return int16(x), nil
- //case string:
- case uint8:
- return int16(x), nil
- case uint16:
- return int16(x), nil
- case uint32:
- return int16(x), nil
- case uint64:
- return int16(x), nil
- case *big.Int:
- return int16(x.Int64()), nil
- case time.Duration:
- return int16(x), nil
- default:
- return invConv(val, typ)
- }
- case qInt32:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- case idealFloat:
- if _, frac := math.Modf(float64(x)); frac != 0 {
- return truncConv(x)
- }
- return int32(x), nil
- case idealInt:
- return int32(x), nil
- case idealRune:
- return int32(x), nil
- case idealUint:
- return int32(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- case float32:
- return int32(x), nil
- case float64:
- return int32(x), nil
- case int8:
- return int32(x), nil
- case int16:
- return int32(x), nil
- case int32:
- return int32(x), nil
- case int64:
- return int32(x), nil
- //case string:
- case uint8:
- return int32(x), nil
- case uint16:
- return int32(x), nil
- case uint32:
- return int32(x), nil
- case uint64:
- return int32(x), nil
- case *big.Int:
- return int32(x.Int64()), nil
- case time.Duration:
- return int32(x), nil
- default:
- return invConv(val, typ)
- }
- case qInt64:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- case idealFloat:
- if _, frac := math.Modf(float64(x)); frac != 0 {
- return truncConv(x)
- }
- return int64(x), nil
- case idealInt:
- return int64(x), nil
- case idealRune:
- return int64(x), nil
- case idealUint:
- return int64(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- case float32:
- return int64(x), nil
- case float64:
- return int64(x), nil
- case int8:
- return int64(x), nil
- case int16:
- return int64(x), nil
- case int32:
- return int64(x), nil
- case int64:
- return int64(x), nil
- //case string:
- case uint8:
- return int64(x), nil
- case uint16:
- return int64(x), nil
- case uint32:
- return int64(x), nil
- case uint64:
- return int64(x), nil
- case *big.Int:
- return x.Int64(), nil
- case time.Duration:
- return int64(x), nil
- default:
- return invConv(val, typ)
- }
- case qString:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- //case idealFloat:
- case idealInt:
- return string(x), nil
- case idealRune:
- return string(x), nil
- case idealUint:
- return string(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- //case float32:
- //case float64:
- case int8:
- return string(x), nil
- case int16:
- return string(x), nil
- case int32:
- return string(x), nil
- case int64:
- return string(x), nil
- case string:
- return string(x), nil
- case uint8:
- return string(x), nil
- case uint16:
- return string(x), nil
- case uint32:
- return string(x), nil
- case uint64:
- return string(x), nil
- case []byte:
- return string(x), nil
- case *big.Int:
- return x.String(), nil
- case time.Time:
- return x.String(), nil
- case time.Duration:
- return x.String(), nil
- default:
- return invConv(val, typ)
- }
- case qUint8:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- case idealFloat:
- if _, frac := math.Modf(float64(x)); frac != 0 {
- return truncConv(x)
- }
- return uint8(x), nil
- case idealInt:
- return uint8(x), nil
- case idealRune:
- return uint8(x), nil
- case idealUint:
- return uint8(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- case float32:
- return uint8(x), nil
- case float64:
- return uint8(x), nil
- case int8:
- return uint8(x), nil
- case int16:
- return uint8(x), nil
- case int32:
- return uint8(x), nil
- case int64:
- return uint8(x), nil
- //case string:
- case uint8:
- return uint8(x), nil
- case uint16:
- return uint8(x), nil
- case uint32:
- return uint8(x), nil
- case uint64:
- return uint8(x), nil
- case *big.Int:
- return uint8(x.Int64()), nil
- case time.Duration:
- return uint8(x), nil
- default:
- return invConv(val, typ)
- }
- case qUint16:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- case idealFloat:
- if _, frac := math.Modf(float64(x)); frac != 0 {
- return truncConv(x)
- }
- return uint16(x), nil
- case idealInt:
- return uint16(x), nil
- case idealRune:
- return uint16(x), nil
- case idealUint:
- return uint16(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- case float32:
- return uint16(x), nil
- case float64:
- return uint16(x), nil
- case int8:
- return uint16(x), nil
- case int16:
- return uint16(x), nil
- case int32:
- return uint16(x), nil
- case int64:
- return uint16(x), nil
- //case string:
- case uint8:
- return uint16(x), nil
- case uint16:
- return uint16(x), nil
- case uint32:
- return uint16(x), nil
- case uint64:
- return uint16(x), nil
- case *big.Int:
- return uint16(x.Int64()), nil
- case time.Duration:
- return uint16(x), nil
- default:
- return invConv(val, typ)
- }
- case qUint32:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- case idealFloat:
- if _, frac := math.Modf(float64(x)); frac != 0 {
- return truncConv(x)
- }
- return uint32(x), nil
- case idealInt:
- return uint32(x), nil
- case idealRune:
- return uint32(x), nil
- case idealUint:
- return uint32(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- case float32:
- return uint32(x), nil
- case float64:
- return uint32(x), nil
- case int8:
- return uint32(x), nil
- case int16:
- return uint32(x), nil
- case int32:
- return uint32(x), nil
- case int64:
- return uint32(x), nil
- //case string:
- case uint8:
- return uint32(x), nil
- case uint16:
- return uint32(x), nil
- case uint32:
- return uint32(x), nil
- case uint64:
- return uint32(x), nil
- case *big.Int:
- return uint32(x.Int64()), nil
- case time.Duration:
- return uint32(x), nil
- default:
- return invConv(val, typ)
- }
- case qUint64:
- switch x := val.(type) {
- //case nil:
- //case idealComplex:
- case idealFloat:
- if _, frac := math.Modf(float64(x)); frac != 0 {
- return truncConv(x)
- }
- return uint64(x), nil
- case idealInt:
- return uint64(x), nil
- case idealRune:
- return uint64(x), nil
- case idealUint:
- return uint64(x), nil
- //case bool:
- //case complex64:
- //case complex128:
- case float32:
- return uint64(x), nil
- case float64:
- return uint64(x), nil
- case int8:
- return uint64(x), nil
- case int16:
- return uint64(x), nil
- case int32:
- return uint64(x), nil
- case int64:
- return uint64(x), nil
- //case string:
- case uint8:
- return uint64(x), nil
- case uint16:
- return uint64(x), nil
- case uint32:
- return uint64(x), nil
- case uint64:
- return uint64(x), nil
- case *big.Int:
- return x.Uint64(), nil
- case time.Duration:
- return uint64(x), nil
- default:
- return invConv(val, typ)
- }
- case qBlob:
- switch x := val.(type) {
- case string:
- return []byte(x), nil
- case []byte:
- return x, nil
- default:
- return invConv(val, typ)
- }
- case qBigInt:
- switch x := val.(type) {
- // case blob
- // case bool
- //case idealComplex:
- case idealFloat:
- if _, frac := math.Modf(float64(x)); frac != 0 {
- return truncConv(x)
- }
- rr := big.NewRat(1, 1).SetFloat64(float64(x))
- ii := big.NewInt(0).Set(rr.Num())
- ii.Quo(ii, rr.Denom())
- return ii, nil
- case idealInt:
- return big.NewInt(0).SetInt64(int64(x)), nil
- case idealRune:
- return big.NewInt(0).SetInt64(int64(x)), nil
- case idealUint:
- return big.NewInt(0).SetUint64(uint64(x)), nil
- //case complex64
- //case complex128
- case float32:
- rr := big.NewRat(1, 1).SetFloat64(float64(x))
- ii := big.NewInt(0).Set(rr.Num())
- ii.Quo(ii, rr.Denom())
- return ii, nil
- case float64:
- rr := big.NewRat(1, 1).SetFloat64(float64(x))
- ii := big.NewInt(0).Set(rr.Num())
- ii.Quo(ii, rr.Denom())
- return ii, nil
- case int8:
- return big.NewInt(0).SetInt64(int64(x)), nil
- case int16:
- return big.NewInt(0).SetInt64(int64(x)), nil
- case int32:
- return big.NewInt(0).SetInt64(int64(x)), nil
- case int64:
- return big.NewInt(0).SetInt64(x), nil
- case string:
- y := big.NewInt(0)
- if _, ok := y.SetString(x, 0); !ok {
- return invConv(val, typ)
- }
- return y, nil
- case uint8:
- return big.NewInt(0).SetUint64(uint64(x)), nil
- case uint16:
- return big.NewInt(0).SetUint64(uint64(x)), nil
- case uint32:
- return big.NewInt(0).SetUint64(uint64(x)), nil
- case uint64:
- return big.NewInt(0).SetUint64(x), nil
- case *big.Int:
- return x, nil
- case *big.Rat:
- ii := big.NewInt(0).Set(x.Num())
- ii.Div(ii, x.Denom())
- return ii, nil
- default:
- return invConv(val, typ)
- }
- case qBigRat:
- switch x := val.(type) {
- // case blob
- // case bool
- //case idealComplex:
- case idealFloat:
- return big.NewRat(1, 1).SetFloat64(float64(x)), nil
- case idealInt:
- return big.NewRat(1, 1).SetInt64(int64(x)), nil
- case idealRune:
- return big.NewRat(1, 1).SetInt64(int64(x)), nil
- case idealUint:
- return big.NewRat(1, 1).SetInt(big.NewInt(0).SetUint64(uint64(x))), nil
- //case complex64
- //case complex128
- case float32:
- return big.NewRat(1, 1).SetFloat64(float64(x)), nil
- case float64:
- return big.NewRat(1, 1).SetFloat64(x), nil
- case int8:
- return big.NewRat(1, 1).SetInt64(int64(x)), nil
- case int16:
- return big.NewRat(1, 1).SetInt64(int64(x)), nil
- case int32:
- return big.NewRat(1, 1).SetInt64(int64(x)), nil
- case int64:
- return big.NewRat(1, 1).SetInt64(x), nil
- case string:
- y := big.NewRat(1, 1)
- if _, ok := y.SetString(x); !ok {
- return invConv(val, typ)
- }
- return y, nil
- case uint8:
- return big.NewRat(1, 1).SetInt64(int64(x)), nil
- case uint16:
- return big.NewRat(1, 1).SetInt64(int64(x)), nil
- case uint32:
- return big.NewRat(1, 1).SetInt64(int64(x)), nil
- case uint64:
- return big.NewRat(1, 1).SetInt(big.NewInt(0).SetUint64(x)), nil
- case *big.Int:
- return big.NewRat(1, 1).SetInt(x), nil
- case *big.Rat:
- return x, nil
- default:
- return invConv(val, typ)
- }
- case qDuration:
- switch x := val.(type) {
- // case blob
- // case bool
- //case idealComplex:
- case idealFloat:
- return time.Duration(x), nil
- case idealInt:
- return time.Duration(x), nil
- case idealRune:
- return time.Duration(x), nil
- case idealUint:
- return time.Duration(x), nil
- //case complex64
- //case complex128
- case float32:
- return time.Duration(x), nil
- case float64:
- return time.Duration(x), nil
- case int8:
- return time.Duration(x), nil
- case int16:
- return time.Duration(x), nil
- case int32:
- return time.Duration(x), nil
- case int64:
- return time.Duration(x), nil
- case string:
- return time.ParseDuration(x)
- case uint8:
- return time.Duration(x), nil
- case uint16:
- return time.Duration(x), nil
- case uint32:
- return time.Duration(x), nil
- case uint64:
- return time.Duration(x), nil
- case *big.Int:
- return time.Duration(x.Int64()), nil
- case *big.Rat:
- f, _ := x.Float64()
- return time.Duration(f), nil
- case time.Duration:
- return x, nil
- default:
- return invConv(val, typ)
- }
- case qTime:
- switch x := val.(type) {
- // case blob
- // case bool
- //case idealComplex:
- //case idealFloat:
- //case idealInt:
- //case idealRune:
- //case idealUint:
- //case complex64
- //case complex128
- //case float32:
- //case float64:
- //case int8:
- //case int16:
- //case int32:
- //case int64:
- //case string:
- //case uint8:
- //case uint16:
- //case uint32:
- //case uint64:
- //case *big.Int:
- //case *big.Rat:
- //case time.Duration:
- case time.Time:
- return x, nil
- default:
- return invConv(val, typ)
- }
- default:
- panic("internal error 006")
- }
- }
- func invShiftRHS(lhs, rhs interface{}) (interface{}, error) {
- return nil, fmt.Errorf("invalid operation: %v << %v (shift count type %T, must be unsigned integer)", lhs, rhs, rhs)
- }
- func invTruncInt(v interface{}) error {
- return fmt.Errorf("constant %v truncated to integer", v)
- }
- func overflow(v interface{}, typ int) error {
- return fmt.Errorf("constant %v overflows %s", v, typeStr(typ))
- }
- func typeCheck1(val interface{}, c *col) (interface{}, error) {
- rec := []interface{}{val}
- c = c.clone()
- c.index = 0
- if err := typeCheck(rec, []*col{c}); err != nil {
- return nil, err
- }
- return rec[0], nil
- }
- func typeCheck(rec []interface{}, cols []*col) (err error) {
- for _, c := range cols {
- i := c.index
- if v := rec[i]; !c.typeCheck(v) {
- switch v.(type) {
- case idealComplex:
- y := complex128(v.(idealComplex))
- switch c.typ {
- case qBool:
- case qComplex64:
- rec[i] = complex64(y)
- continue
- case qComplex128:
- rec[i] = complex128(y)
- continue
- case qFloat32, qFloat64, qInt8, qInt16, qInt32, qInt64, qUint8, qUint16, qUint32, qUint64:
- return fmt.Errorf("constant %v truncated to real", y)
- }
- case idealFloat:
- y := float64(v.(idealFloat))
- switch c.typ {
- case qBool:
- case qComplex64:
- rec[i] = complex(float32(y), 0)
- continue
- case qComplex128:
- rec[i] = complex(float64(y), 0)
- continue
- case qFloat32:
- rec[i] = float32(y)
- continue
- case qFloat64:
- rec[i] = float64(y)
- continue
- case qInt8:
- if math.Floor(y) != y {
- return invTruncInt(y)
- }
- if y < math.MinInt8 || y > math.MaxInt8 {
- return overflow(y, c.typ)
- }
- rec[i] = int8(y)
- continue
- case qInt16:
- if math.Floor(y) != y {
- return invTruncInt(y)
- }
- if y < math.MinInt16 || y > math.MaxInt16 {
- return overflow(y, c.typ)
- }
- rec[i] = int16(y)
- continue
- case qInt32:
- if math.Floor(y) != y {
- return invTruncInt(y)
- }
- if y < math.MinInt32 || y > math.MaxInt32 {
- return overflow(y, c.typ)
- }
- rec[i] = int32(y)
- continue
- case qInt64:
- if math.Floor(y) != y {
- return invTruncInt(y)
- }
- if y < math.MinInt64 || y > math.MaxInt64 {
- return overflow(y, c.typ)
- }
- rec[i] = int64(y)
- continue
- case qString:
- case qUint8:
- if math.Floor(y) != y {
- return invTruncInt(y)
- }
- if y < 0 || y > math.MaxUint8 {
- return overflow(y, c.typ)
- }
- rec[i] = uint8(y)
- continue
- case qUint16:
- if math.Floor(y) != y {
- return invTruncInt(y)
- }
- if y < 0 || y > math.MaxUint16 {
- return overflow(y, c.typ)
- }
- rec[i] = uint16(y)
- continue
- case qUint32:
- if math.Floor(y) != y {
- return invTruncInt(y)
- }
- if y < 0 || y > math.MaxUint32 {
- return overflow(y, c.typ)
- }
- rec[i] = uint32(y)
- continue
- case qUint64:
- if math.Floor(y) != y {
- return invTruncInt(y)
- }
- if y < 0 || y > math.MaxUint64 {
- return overflow(y, c.typ)
- }
- rec[i] = uint64(y)
- continue
- case qBigInt:
- if math.Floor(y) != y {
- return invTruncInt(y)
- }
- rr := big.NewRat(1, 1).SetFloat64(y)
- ii := big.NewInt(0)
- ii.Set(rr.Num())
- ii.Quo(ii, rr.Denom())
- rec[i] = ii
- continue
- case qBigRat:
- rec[i] = big.NewRat(1, 1).SetFloat64(y)
- continue
- }
- case idealInt:
- y := int64(v.(idealInt))
- switch c.typ {
- case qBool:
- case qComplex64:
- rec[i] = complex(float32(y), 0)
- continue
- case qComplex128:
- rec[i] = complex(float64(y), 0)
- continue
- case qFloat32:
- rec[i] = float32(y)
- continue
- case qFloat64:
- rec[i] = float64(y)
- continue
- case qInt8:
- if y < math.MinInt8 || y > math.MaxInt8 {
- return overflow(y, c.typ)
- }
- rec[i] = int8(y)
- continue
- case qInt16:
- if y < math.MinInt16 || y > math.MaxInt16 {
- return overflow(y, c.typ)
- }
- rec[i] = int16(y)
- continue
- case qInt32:
- if y < math.MinInt32 || y > math.MaxInt32 {
- return overflow(y, c.typ)
- }
- rec[i] = int32(y)
- continue
- case qInt64:
- if y < math.MinInt64 || y > math.MaxInt64 {
- return overflow(y, c.typ)
- }
- rec[i] = int64(y)
- continue
- case qString:
- case qUint8:
- if y < 0 || y > math.MaxUint8 {
- return overflow(y, c.typ)
- }
- rec[i] = uint8(y)
- continue
- case qUint16:
- if y < 0 || y > math.MaxUint16 {
- return overflow(y, c.typ)
- }
- rec[i] = uint16(y)
- continue
- case qUint32:
- if y < 0 || y > math.MaxUint32 {
- return overflow(y, c.typ)
- }
- rec[i] = uint32(y)
- continue
- case qUint64:
- if y < 0 {
- return overflow(y, c.typ)
- }
- rec[i] = uint64(y)
- continue
- case qBigInt:
- rec[i] = big.NewInt(y)
- continue
- case qBigRat:
- rec[i] = big.NewRat(1, 1).SetInt64(y)
- continue
- }
- case idealRune:
- y := int64(v.(idealRune))
- switch c.typ {
- case qBool:
- case qComplex64:
- rec[i] = complex(float32(y), 0)
- continue
- case qComplex128:
- rec[i] = complex(float64(y), 0)
- continue
- case qFloat32:
- rec[i] = float32(y)
- continue
- case qFloat64:
- rec[i] = float64(y)
- continue
- case qInt8:
- if y < math.MinInt8 || y > math.MaxInt8 {
- return overflow(y, c.typ)
- }
- rec[i] = int8(y)
- continue
- case qInt16:
- if y < math.MinInt16 || y > math.MaxInt16 {
- return overflow(y, c.typ)
- }
- rec[i] = int16(y)
- continue
- case qInt32:
- if y < math.MinInt32 || y > math.MaxInt32 {
- return overflow(y, c.typ)
- }
- rec[i] = int32(y)
- continue
- case qInt64:
- if y < math.MinInt64 || y > math.MaxInt64 {
- return overflow(y, c.typ)
- }
- rec[i] = int64(y)
- continue
- case qString:
- case qUint8:
- if y < 0 || y > math.MaxUint8 {
- return overflow(y, c.typ)
- }
- rec[i] = uint8(y)
- continue
- case qUint16:
- if y < 0 || y > math.MaxUint16 {
- return overflow(y, c.typ)
- }
- rec[i] = uint16(y)
- continue
- case qUint32:
- if y < 0 {
- return overflow(y, c.typ)
- }
- rec[i] = uint32(y)
- continue
- case qUint64:
- if y < 0 {
- return overflow(y, c.typ)
- }
- rec[i] = uint64(y)
- continue
- case qBigInt:
- rec[i] = big.NewInt(y)
- continue
- case qBigRat:
- rec[i] = big.NewRat(1, 1).SetInt64(y)
- continue
- }
- case idealUint:
- y := uint64(v.(idealUint))
- switch c.typ {
- case qBool:
- case qComplex64:
- rec[i] = complex(float32(y), 0)
- continue
- case qComplex128:
- rec[i] = complex(float64(y), 0)
- continue
- case qFloat32:
- rec[i] = float32(y)
- continue
- case qFloat64:
- rec[i] = float64(y)
- continue
- case qInt8:
- if y > math.MaxInt8 {
- return overflow(y, c.typ)
- }
- rec[i] = int8(y)
- continue
- case qInt16:
- if y > math.MaxInt16 {
- return overflow(y, c.typ)
- }
- rec[i] = int16(y)
- continue
- case qInt32:
- if y > math.MaxInt32 {
- return overflow(y, c.typ)
- }
- rec[i] = int32(y)
- continue
- case qInt64:
- if y > math.MaxInt64 {
- return overflow(y, c.typ)
- }
- rec[i] = int64(y)
- continue
- case qString:
- rec[i] = string(y)
- continue
- case qUint8:
- if y > math.MaxUint8 {
- return overflow(y, c.typ)
- }
- rec[i] = uint8(y)
- continue
- case qUint16:
- if y > math.MaxUint16 {
- return overflow(y, c.typ)
- }
- rec[i] = uint16(y)
- continue
- case qUint32:
- if y > math.MaxUint32 {
- return overflow(y, c.typ)
- }
- rec[i] = uint32(y)
- continue
- case qUint64:
- rec[i] = uint64(y)
- continue
- case qBigInt:
- rec[i] = big.NewInt(0).SetUint64(y)
- continue
- case qBigRat:
- ii := big.NewInt(0).SetUint64(y)
- rec[i] = big.NewRat(1, 1).SetInt(ii)
- continue
- }
- }
- return fmt.Errorf("cannot use %v (type %T) in assignment to, or comparison with, column %s (type %s)", v, ideal(v), c.name, typeStr(c.typ))
- }
- }
- return
- }
- //TODO collate1 should return errors instead of panicing
- func collate1(a, b interface{}) int {
- switch x := a.(type) {
- case nil:
- if b != nil {
- return -1
- }
- return 0
- case bool:
- switch y := b.(type) {
- case nil:
- return 1
- case bool:
- if !x && y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- default:
- // Make bool collate before anything except nil and
- // other bool for index seeking first non NULL value.
- return -1
- }
- case idealComplex:
- switch y := b.(type) {
- case nil:
- return 1
- case idealComplex:
- if x == y {
- return 0
- }
- if real(x) < real(y) {
- return -1
- }
- if real(x) > real(y) {
- return 1
- }
- if imag(x) < imag(y) {
- return -1
- }
- return 1
- case complex64:
- {
- x, y := complex64(x), complex64(y)
- if x == y {
- return 0
- }
- if real(x) < real(y) {
- return -1
- }
- if real(x) > real(y) {
- return 1
- }
- if imag(x) < imag(y) {
- return -1
- }
- return 1
- }
- case complex128:
- {
- x := complex128(x)
- if x == y {
- return 0
- }
- if real(x) < real(y) {
- return -1
- }
- if real(x) > real(y) {
- return 1
- }
- if imag(x) < imag(y) {
- return -1
- }
- return 1
- }
- default:
- panic("internal error 012")
- }
- case idealUint:
- switch y := b.(type) {
- case nil:
- return 1
- case idealUint:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case uint8:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case uint16:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case uint32:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case uint64:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case uint:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 013")
- }
- case idealRune:
- switch y := b.(type) {
- case nil:
- return 1
- case idealRune:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case int8:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case int16:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case int32:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case int64:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case int:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 014")
- }
- case idealInt:
- switch y := b.(type) {
- case nil:
- return 1
- case idealInt:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case int8:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case int16:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case int32:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case int64:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case int:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 015")
- }
- case idealFloat:
- switch y := b.(type) {
- case nil:
- return 1
- case idealFloat:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case float32:
- {
- x, y := float64(x), float64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case float64:
- {
- x, y := float64(x), float64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 016")
- }
- case complex64:
- switch y := b.(type) {
- case nil:
- return 1
- case complex64:
- if x == y {
- return 0
- }
- if real(x) < real(y) {
- return -1
- }
- if real(x) > real(y) {
- return 1
- }
- if imag(x) < imag(y) {
- return -1
- }
- return 1
- case idealComplex:
- {
- x, y := complex64(x), complex64(y)
- if x == y {
- return 0
- }
- if real(x) < real(y) {
- return -1
- }
- if real(x) > real(y) {
- return 1
- }
- if imag(x) < imag(y) {
- return -1
- }
- return 1
- }
- default:
- panic("internal error 017")
- }
- case complex128:
- switch y := b.(type) {
- case nil:
- return 1
- case complex128:
- if x == y {
- return 0
- }
- if real(x) < real(y) {
- return -1
- }
- if real(x) > real(y) {
- return 1
- }
- if imag(x) < imag(y) {
- return -1
- }
- return 1
- case idealComplex:
- {
- x, y := complex128(x), complex128(y)
- if x == y {
- return 0
- }
- if real(x) < real(y) {
- return -1
- }
- if real(x) > real(y) {
- return 1
- }
- if imag(x) < imag(y) {
- return -1
- }
- return 1
- }
- default:
- panic("internal error 018")
- }
- case float32:
- switch y := b.(type) {
- case nil:
- return 1
- case float32:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case idealFloat:
- {
- x, y := float32(x), float32(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 019")
- }
- case float64:
- switch y := b.(type) {
- case nil:
- return 1
- case float64:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case idealFloat:
- {
- x, y := float64(x), float64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 020")
- }
- case int8:
- switch y := b.(type) {
- case nil:
- return 1
- case int8:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case idealInt:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 021")
- }
- case int16:
- switch y := b.(type) {
- case nil:
- return 1
- case int16:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case idealInt:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 022")
- }
- case int32:
- switch y := b.(type) {
- case nil:
- return 1
- case int32:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case idealInt:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 023")
- }
- case int64:
- switch y := b.(type) {
- case nil:
- return 1
- case int64:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case idealInt:
- {
- x, y := int64(x), int64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 024")
- }
- case uint8:
- switch y := b.(type) {
- case nil:
- return 1
- case uint8:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case idealInt:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case idealUint:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 025")
- }
- case uint16:
- switch y := b.(type) {
- case nil:
- return 1
- case uint16:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case idealInt:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case idealUint:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 026")
- }
- case uint32:
- switch y := b.(type) {
- case nil:
- return 1
- case uint32:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case idealInt:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case idealUint:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 027")
- }
- case uint64:
- switch y := b.(type) {
- case nil:
- return 1
- case uint64:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- case idealInt:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- case idealUint:
- {
- x, y := uint64(x), uint64(y)
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- }
- default:
- panic("internal error 028")
- }
- case string:
- switch y := b.(type) {
- case nil:
- return 1
- case string:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- default:
- panic("internal error 029")
- }
- case []byte:
- switch y := b.(type) {
- case nil:
- return 1
- case []byte:
- return bytes.Compare(x, y)
- default:
- panic("internal error 030")
- }
- case *big.Int:
- switch y := b.(type) {
- case nil:
- return 1
- case *big.Int:
- return x.Cmp(y)
- case idealInt:
- {
- y := big.NewInt(int64(y))
- return x.Cmp(y)
- }
- case idealUint:
- {
- u := big.NewInt(0)
- u.SetUint64(uint64(y))
- return x.Cmp(u)
- }
- default:
- panic("internal error 031")
- }
- case *big.Rat:
- switch y := b.(type) {
- case nil:
- return 1
- case *big.Rat:
- return x.Cmp(y)
- case idealInt:
- {
- y := big.NewRat(int64(y), 1)
- return x.Cmp(y)
- }
- case idealUint:
- {
- u := big.NewInt(0)
- u.SetUint64(uint64(y))
- var y big.Rat
- y.SetInt(u)
- return x.Cmp(&y)
- }
- default:
- panic("internal error 032")
- }
- case time.Time:
- switch y := b.(type) {
- case nil:
- return 1
- case time.Time:
- if x.Before(y) {
- return -1
- }
- if x.Equal(y) {
- return 0
- }
- return 1
- default:
- panic("internal error 033")
- }
- case time.Duration:
- switch y := b.(type) {
- case nil:
- return 1
- case time.Duration:
- if x < y {
- return -1
- }
- if x == y {
- return 0
- }
- return 1
- default:
- panic("internal error 034")
- }
- case chunk:
- switch y := b.(type) {
- case nil:
- return 1
- case chunk:
- a, err := x.expand()
- if err != nil {
- panic(err)
- }
- b, err := y.expand()
- if err != nil {
- panic(err)
- }
- return collate1(a, b)
- default:
- panic("internal error 035")
- }
- default:
- //dbg("%T(%v) %T(%v)", a, a, b, b)
- panic("internal error 036")
- }
- }
- //TODO collate should return errors from collate1
- func collate(x, y []interface{}) (r int) {
- //defer func() { dbg("%v %v -> %v", x, y, r) }()
- nx, ny := len(x), len(y)
- switch {
- case nx == 0 && ny != 0:
- return -1
- case nx == 0 && ny == 0:
- return 0
- case nx != 0 && ny == 0:
- return 1
- }
- r = 1
- if nx > ny {
- x, y, r = y, x, -r
- }
- for i, xi := range x {
- if c := collate1(xi, y[i]); c != 0 {
- return c * r
- }
- }
- if nx == ny {
- return 0
- }
- return -r
- }
- var collators = map[bool]func(a, b []interface{}) int{false: collateDesc, true: collate}
- func collateDesc(a, b []interface{}) int {
- return -collate(a, b)
- }
- func isOrderedType(v interface{}) (y interface{}, r bool, err error) {
- //dbg("====")
- //dbg("%T(%v)", v, v)
- //defer func() { dbg("%T(%v)", y, y) }()
- switch x := v.(type) {
- case idealFloat, idealInt, idealRune, idealUint,
- float32, float64,
- int8, int16, int32, int64,
- uint8, uint16, uint32, uint64,
- string:
- return v, true, nil
- case *big.Int, *big.Rat, time.Time, time.Duration:
- return x, true, nil
- case chunk:
- if y, err = x.expand(); err != nil {
- return
- }
- return isOrderedType(y)
- }
- return v, false, nil
- }
- var isSystemName = map[string]bool{
- "__Column": true,
- "__Column2": true,
- "__Index": true,
- "__Index2": true,
- "__Index2_Column": true,
- "__Index2_Expr": true,
- "__Table": true,
- }
- func qnames(l []string) []string {
- r := make([]string, len(l))
- for i, v := range l {
- r[i] = fmt.Sprintf("%q", v)
- }
- return r
- }
|