         @_set_fields = []
         # Which fields *must* be included in any set query
         @_required_set_fields = {}
-        @_allowed_set_fields = {}  # and which are *allowed* to be set
         for field in misc.keys(@_query[@_table][0])
             if @_client_query?.set?.fields?[field]?
                 @_set_fields.push(field)
-                @_allowed_set_fields[field] = true
             if @_client_query?.set?.required_fields?[field]?
                 @_required_set_fields[field] = true
 

            return

        changed = @_changes()

        # Send our changes to the server.
        query = []
        saved_objs = []
        for key in misc.keys(changed).sort()  # sort so that behavior is more predictable = faster (e.g., sync patches are in order); the keys are strings so default sort is fine
            c = changed[key]
            obj = {"#{@_primary_key}":key}   # NOTE: this may get replaced below with proper javascript, e.g., for compound primary key
            for k in @_set_fields
                v = c.new_val.get(k)
                if v? and @_allowed_set_fields[k]
                    if @_required_set_fields[k] or not immutable.is(v, c.old_val?.get(k))
                        if immutable.Iterable.isIterable(v)
                            obj[k] = v.toJS()

            if not options.push?
                console.warn("bug -- options (=#{misc.to_json(options)}) must be an array")
                options = []
            options.push({heartbeat:if client.is_project() then 1 else 4})
    else
        options = [{heartbeat:if client.is_project() then 1 else 4}]

    key = json_stable_stringify(query:query, options:options, debounce_interval:debounce_interval)
    #console.log("sync_table #{key}")
