 (s/defschema WhereSchema
   [WhereClauseSchema])
 
-(s/defschema ColumnsSchema
-  [(s/one s/Keyword :first-col) s/Keyword])
+(s/defschema UpdateColumnSchema
+  s/Keyword)
+
+(s/defschema UpdateColumnsSchema
+  [(s/one UpdateColumnSchema :first-col) UpdateColumnSchema])
+
+(s/defschema SelectColumnSchema
+  (s/conditional
+   keyword? s/Keyword
+   :else CQLRaw))
+
+(s/defschema SelectColumnsSchema
+  [(s/one SelectColumnSchema :first-col) SelectColumnSchema])
 
 (s/defschema OrderByClauseSchema
   [(s/one s/Keyword :order-by-col)

   (s/optional-key :if-exists) s/Bool
   (s/optional-key :if-not-exists) s/Bool
   (s/optional-key :using) UpsertUsingSchema
   (s/optional-key :set-columns) ColumnsSchema})

(s/defn update-statement
  "returns a Hayt update statement"

   [er-cassandra.key :refer [flatten-key extract-key-equality-clause]]
   [er-cassandra.session :as session])
  (:import
   [er_cassandra.session Session]
   [qbits.hayt.cql CQLRaw]))

;; low-level record-based cassandra statement generation and execution
;;
