From ccab36735148891d992fafadae7c91b23725b911 Mon Sep 17 00:00:00 2001 From: Vikram Rangnekar Date: Sun, 24 May 2020 17:43:54 -0400 Subject: [PATCH] fix: make array variables work again --- .gitignore | 1 + core/args.go | 44 +++++++++++++++++++- core/internal/allow/allow.go | 4 -- core/internal/psql/query.go | 14 ++++++- core/internal/qcode/qcode.go | 11 +++-- docs/website/.firebase/hosting.YnVpbGQ.cache | 40 ------------------ 6 files changed, 63 insertions(+), 51 deletions(-) delete mode 100644 docs/website/.firebase/hosting.YnVpbGQ.cache diff --git a/.gitignore b/.gitignore index 67dc351..9773565 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,5 @@ release .gofuzz *-fuzz.zip *.test +.firebase diff --git a/core/args.go b/core/args.go index af35fa7..ef32244 100644 --- a/core/args.go +++ b/core/args.go @@ -41,6 +41,10 @@ func (c *scontext) argMap() func(w io.Writer, tag string) (int, error) { } v := fields[0].Value + if isJsonScalarArray(v) { + return w.Write(jsonListToValues(v)) + } + // Open and close quotes if len(v) >= 2 && v[0] == '"' && v[len(v)-1] == '"' { fields[0].Value = v[1 : len(v)-1] @@ -118,13 +122,17 @@ func (c *scontext) argList(args [][]byte) ([]interface{}, error) { if v, ok := fields[string(av)]; ok { switch v[0] { case '[', '{': - vars[i] = v + if isJsonScalarArray(v) { + vars[i] = jsonListToValues(v) + } else { + vars[i] = v + } + default: var val interface{} if err := json.Unmarshal(v, &val); err != nil { return nil, err } - vars[i] = val } @@ -163,6 +171,38 @@ func escSQuote(b []byte) []byte { return buf.Bytes() } +func isJsonScalarArray(b []byte) bool { + if b[0] != '[' || b[len(b)-1] != ']' { + return false + } + for i := range b { + switch b[i] { + case '{': + return false + case '[', ' ', '\t', '\n': + continue + default: + return true + } + } + return true +} + +func jsonListToValues(b []byte) []byte { + s := 0 + for i := 1; i < len(b)-1; i++ { + if b[i] == '"' && s%2 == 0 { + b[i] = '\'' + } + if b[i] == '\\' { + s++ + } else { + s = 0 + } + } + return b[1 : len(b)-1] +} + func argErr(name string) error { return fmt.Errorf("query requires variable '%s' to be set", name) } diff --git a/core/internal/allow/allow.go b/core/internal/allow/allow.go index edf54e5..e0cfe93 100644 --- a/core/internal/allow/allow.go +++ b/core/internal/allow/allow.go @@ -239,8 +239,6 @@ func (al *List) save(item Item) error { qd := &schema.QueryDocument{} if err := qd.Parse(item.Query); err != nil { - fmt.Println("##", item.Query) - return err } @@ -248,8 +246,6 @@ func (al *List) save(item Item) error { query := buf.String() buf.Reset() - // fmt.Println(">", query) - item.Name = QueryName(query) item.key = strings.ToLower(item.Name) diff --git a/core/internal/psql/query.go b/core/internal/psql/query.go index dd96d34..b7acf48 100644 --- a/core/internal/psql/query.go +++ b/core/internal/psql/query.go @@ -1027,9 +1027,9 @@ func (c *compilerContext) renderOp(ex *qcode.Exp, ti *DBTableInfo) error { case qcode.OpLesserThan: io.WriteString(c.w, `<`) case qcode.OpIn: - io.WriteString(c.w, `IN`) + io.WriteString(c.w, `= ANY`) case qcode.OpNotIn: - io.WriteString(c.w, `NOT IN`) + io.WriteString(c.w, `!= ANY`) case qcode.OpLike: io.WriteString(c.w, `LIKE`) case qcode.OpNotLike: @@ -1175,6 +1175,16 @@ func (c *compilerContext) renderVal(ex *qcode.Exp, vars map[string]string, col * io.WriteString(c.w, `)`) case ok: squoted(c.w, val) + case ex.Op == qcode.OpIn || ex.Op == qcode.OpNotIn: + io.WriteString(c.w, ` (string_to_array('{{`) + io.WriteString(c.w, ex.Val) + io.WriteString(c.w, `}}', ',')`) + + io.WriteString(c.w, ` :: `) + io.WriteString(c.w, col.Type) + io.WriteString(c.w, `[])`) + return + default: io.WriteString(c.w, ` '{{`) io.WriteString(c.w, ex.Val) diff --git a/core/internal/qcode/qcode.go b/core/internal/qcode/qcode.go index 2add02d..d5ee494 100644 --- a/core/internal/qcode/qcode.go +++ b/core/internal/qcode/qcode.go @@ -344,17 +344,17 @@ func (com *Compiler) compileQuery(qc *QCode, op *Operation, role string) error { case QTInsert: if trv.insert.block { - return fmt.Errorf("insert blocked: %s", field.Name) + return fmt.Errorf("%s, insert blocked: %s", role, field.Name) } case QTUpdate: if trv.update.block { - return fmt.Errorf("update blocked: %s", field.Name) + return fmt.Errorf("%s, update blocked: %s", role, field.Name) } case QTDelete: if trv.delete.block { - return fmt.Errorf("delete blocked: %s", field.Name) + return fmt.Errorf("%s, delete blocked: %s", role, field.Name) } } @@ -1030,10 +1030,15 @@ func setListVal(ex *Exp, node *Node) { case NodeFloat: ex.ListType = ValFloat } + } else { + ex.Val = node.Val + return } + for i := range node.Children { ex.ListVal = append(ex.ListVal, node.Children[i].Val) } + } func setWhereColName(ex *Exp, node *Node) { diff --git a/docs/website/.firebase/hosting.YnVpbGQ.cache b/docs/website/.firebase/hosting.YnVpbGQ.cache deleted file mode 100644 index 241bb83..0000000 --- a/docs/website/.firebase/hosting.YnVpbGQ.cache +++ /dev/null @@ -1,40 +0,0 @@ -01a106d5.06939d67.js,1589776216137,2e1ce67f6cf79a8a8e2070fc4ea4a6104ac73a5b26a1ab10b62f6cd8e45a8074 -1.1c32171f.js.LICENSE.txt,1589776216144,31b4d50dbbd144da150dcdcf0ccef8f6cf8b6b5204d5c9adde3b24466777fad5 -0e384e19.7f29b403.js,1589776216137,e2c3882226f2a601b65e4bb1fdb771296c1946f9f125c90af4a8f451dfd2c867 -19.fdfbe826.js.LICENSE.txt,1589776216145,6ad95a8099127a8d42b5ace6d148064b1d3e922174f08d75d0ee2220ebeacd0b -17896441.183211f5.js,1589776216137,7736db62d7498a8d3a10a617b1bdfac08c8f29dc03329f4ad3320f2571c223c0 -20ac7829.c04b4a1e.js,1589776216137,5b95f479848ccd6959630d4a24bd551d0dbc74457911e9b6f3498655bfaf8ea7 -1.1c32171f.js,1589776216137,5441b74bfad9f5a37ba0e6123621c73c3e3b9064bda6b9dcf62fdb7381bf8e41 -2.8f12478f.js,1589776216137,3ac7ca0df8fca86145f5decbd86c8adfbc6b5b11a5be96fc96cc9bc33d6306e6 -395f47e2.28d67f37.js,1589776216137,8a9b6bc2afdd99ca2b1827c8289352fab6163e30151b9701c29a7863b6cd00b6 -404.html,1589776218438,0a748eaa7614b1982623360ba8554c0f498b0796ead3cc429a2c84d287084b50 -3d9c95a4.c89589de.js,1589776216137,d5c45e5a3671f303683451d448e2e5d5b464f041cde683af6e824b9e7f951412 -9225b3a9.a5e6036b.js,1589776216137,ec9a0d4b34d8751f74348d0da369625a18f320c9ed5ab3c5ccf047ead2551bd8 -741df2ae.e13b96b2.js,1589776216137,12028f0cbdf783ac91ea42db64d91190ebd4df24cc74162f953aacc75d16d078 -969d212d.9fc45877.js,1589776216138,8323c9f2db042bfaa2ebba43d9500bed881a694d0bfc27fd796cec95bb032dc5 -c4f5d8e4.47e70b85.js,1589776216145,6f986b48720724e7c8a715812b5f6625c71c8eca258bb4b410a447eb5da52734 -index.html,1589776218438,89f81ec3d3be439a827bd61448dcaddb71c33422df7baa88a7bbcdf784dbc0b2 -98ce8162.b5ace15d.js,1589776216137,935e1c6dd08f7e9d0d00221559b95f0f649e28ddf64be6bbb7b3e65bae1aba72 -main.e30d99cd.js.LICENSE.txt,1589776216144,1d906c3b83eacffe298d21eeb73e6e73e96310983224783d236195098e6765a7 -runtime~main.366c29ad.js,1589776216145,0e550cc9522cd99c5fa4097c7db629eef56127a7f8ade0b7c9954cc8f6a01239 -5043549d.62508ecf.js,1589776216137,383959b80d2b0c6416e83c9640ea03c666fe92c407e13a6f022b58072feeafd2 -99e04881.197dcef6.js,1589776216144,af99883cbd4d58fbac7cbf814be33032b77bc8daf856aed54bdf0bf27ed5708d -sitemap.xml,1589776218455,660ed269bf0306ba47ecdfb638e487147784d614c43c6c4a8e84194973baf183 -styles.9155f1d2.js,1589776216137,f1e0863928710e67338dc88c37f47ef3ff164d36c4bba40d005561094c9c3284 -db32d859.a032827a.js,1589776216145,36d575ffad747898726a97cb7a3551e636f744218595bea5c060536eb8d8390f -docs/advanced/index.html,1589776218439,31171870786a597597de9417978a27253581c013962e39959ae4c0777bf86c28 -docs/deploy/index.html,1589776218440,7a4735edb93006311b704e62b843bf89bc4354fdf0fdc22a0c5802e39878c193 -docs/home/index.html,1589776218440,c7fbb0c1084c6ef8858775c5083b6b416b8188942d4402a5a625eadb3bc00942 -docs/intro/index.html,1589776218440,c7a50ae98c0b279f422e55c2eeb9f7ba1c7c1a8bcac07be11fd6e05ced224094 -img/super-graph-logo.svg,1589776218438,66a865c4936f44ea811464b967f221b615b7553e85dca0d6f1ef620da3911857 -docs/react/index.html,1589776218440,f76fc976f3491d9aacf19ce3b34bee1339f87c673a9da95f192683615618f210 -docs/why/index.html,1589776218440,4aa380fe4e5d8476645e368d1f708d5d1344331c572383db823c3499fa0c99cc -docs/security/index.html,1589776218440,0c7d466dc143935db8c02a448952cae2465635e4b6782b1682449bbd56807917 -styles.8ee0cad4.css,1589776216137,34b2e79c5c5b1f7afda4376e422e8ccb2c3c04213ca09d788f0c68ecf153d6e6 -docs/config/index.html,1589776218440,25b6e87a42c163ac966e80acebca8708f56ae95ba8f3ed8b98ff7fd70ca5a222 -docs/internals/index.html,1589776218440,b6f2136a1c832f421a46329fb1f39269d820c55a0dfc9351848271a5501d8e6e -docs/start/index.html,1589776218440,485ec2c61117d8940d8028f34d51d421995a814d5b9d4d5a1870adaed48aec2c -docs/graphql/index.html,1589776218440,3bd79f703fe67656884f3121bfddc3a4fc4d9e5bb2bf9271c94014058fbbd806 -main.e30d99cd.js,1589776216144,98a4087d6f537aaddbc1225aaabfb4d12d1394772deb618d4d457685cee59311 -19.fdfbe826.js,1589776216144,b8abb73aea5fc0aa50d7e8b8bd38984e3b3aec62de2faf66fb3e55fd1428f8a7 -server.bundle.js,1589776218438,826db37f1de931e8b088c1ff20b4a3c2fe0c3d54d9ff4020e500f0df1b83a616