coldbox-modules / quick

A ColdBox ORM Engine
https://quick.ortusbooks.com
MIT License
23 stars 19 forks source link

QuickQB.update - invalid argument type assumption leading to expression exception #246

Open davidAtInleague opened 7 months ago

davidAtInleague commented 7 months ago

quick 7.3.1

quick/models/QuickQb.cfc

Hit a case where Quick tries to treat a string as a struct, e.g. in the following, if values is something like {someColumn: "someValue"}

    public any function update(
        struct values  = {},
        struct options = {},
        boolean toSql  = false
    ) {
        for ( var key in arguments.values ) {
            if ( structKeyExists( arguments.values[ key ], "isQuickBuilder" ) ) {
                arguments.values[ key ] = arguments.values[ key ].getQb();
            }

The structKeyExists becomes structKeyExists( "someValue", "isQuickBuilder" ) which fails with "cannot convert string to struct".

Our current workaround is:

diff --git a/modules/quick/models/QuickQB.cfc b/modules/quick/models/QuickQB.cfc
index 457378a20..2567f341d 100755
--- a/modules/quick/models/QuickQB.cfc
+++ b/modules/quick/models/QuickQB.cfc
@@ -305,6 +305,9 @@ component
        boolean toSql  = false
    ) {
        for ( var key in arguments.values ) {
+           if ( isNull( arguments.values[ key ] ) || isSimpleValue( arguments.values[ key ] ) ) {
+               continue;
+           }
            if ( structKeyExists( arguments.values[ key ], "isQuickBuilder" ) ) {
                arguments.values[ key ] = arguments.values[ key ].getQb();
            }
elpete commented 3 months ago

Do you have a way to reproduce this? All the code in Quick that calls .update first generates query param structs using the generateQueryParamStruct method on QuickBuilder.