@@ -171,23 +171,22 @@ let get_column index attr =
171171 let format_t_get_column type_name =
172172 sprintf " (T.get_column_%s%s stmt %u)" type_name nullable_suffix index
173173 in
174- let rec format_column_expr attr =
175- match attr with
176- | { domain ={ t = Union {ctors; _} ; _ } ; _ } when ! Sqlgg_config. enum_as_poly_variant ->
177- sprintf " (%s.get_column%s stmt %u)" (get_enum_name ctors) nullable_suffix index
178- | { domain ={ t = Union _ ; _ } ; _ } as c ->
179- format_column_expr { c with domain = { c.domain with t = Text } }
180- | _ ->
181- match Sql.Meta. find_opt attr.meta " module" with
182- | None ->
183- let lang_type_name = L. as_lang_type attr.domain in
184- format_t_get_column lang_type_name
185- | Some m ->
174+ let format_column_expr attr =
175+ match Sql.Meta. find_opt attr.meta " module" with
176+ | Some m ->
186177 let runtime_repr_name = L. as_runtime_repr_name attr.domain in
187178 let inner_get_column_expr = format_t_get_column runtime_repr_name in
188179 let get_column = " get_column" in
189180 let get_column_name = get_column |> Sql.Meta. find_opt attr.meta |> Option. default get_column in
190181 sprintf " (%s.%s%s %s)" m get_column_name nullable_suffix inner_get_column_expr
182+ | None ->
183+ begin match attr.domain with
184+ | { t = Union { ctors; _ } ; _ } ->
185+ sprintf " (%s.get_column%s stmt %u)" (get_enum_name ctors) nullable_suffix index
186+ | _ ->
187+ let lang_type_name = L. as_lang_type attr.domain in
188+ format_t_get_column lang_type_name
189+ end
191190 in
192191 format_column_expr attr
193192
@@ -286,28 +285,32 @@ let match_variant_pattern i name args ~is_poly =
286285 else
287286 variant_name ^ " (" ^ String. concat " , " patterns ^ " )"
288287
289- let rec set_param ~meta index param =
288+ let set_param ~meta index param =
290289 let nullable = is_param_nullable param in
291290 let pname = show_param_name param index in
292291 let ptype = show_param_type param in
293292 let set_param_nullable v r = output " begin match %s with None -> T.set_param_null p | Some %s -> %s end;" pname v r in
294- match param with
295- | { typ = { t =Union _ ; _} ; _ } as c when not ! Sqlgg_config. enum_as_poly_variant -> set_param ~meta index { c with typ = { c.typ with t = Text } }
296- | { typ = { t =Union {ctors; _} ; _} ; _ } when nullable -> set_param_nullable " v" @@ (get_enum_name ctors) ^ " .set_param p v"
297- | { typ = { t =Union {ctors; _} ; _ } ; _ } -> output " %s.set_param p %s;" (get_enum_name ctors) pname
298- | param' ->
299- let module_ = Sql.Meta. find_opt meta " module" in
300- match module_ with
301- | None -> if nullable then set_param_nullable " v" @@ sprintf " T.set_param_%s %s" (show_param_type param') " p v"
302- else output " T.set_param_%s p %s;" ptype pname
303- | Some m ->
293+ let module_ = Sql.Meta. find_opt meta " module" in
294+ match module_ with
295+ | Some m ->
304296 let set_param = " set_param" in
305297 let set_param_name = set_param |> Sql.Meta. find_opt meta |> Option. default set_param in
306- let runtime_repr_name = L. as_runtime_repr_name param' .typ in
298+ let runtime_repr_name = L. as_runtime_repr_name param.typ in
307299 if nullable then
308- set_param_nullable pname @@ sprintf " T.set_param_%s p (%s);" runtime_repr_name (sprintf " %s.%s %s" m set_param_name pname)
300+ set_param_nullable pname @@ sprintf " T.set_param_%s p (%s);" runtime_repr_name (sprintf " %s.%s %s" m set_param_name pname)
309301 else
310302 output " T.set_param_%s p (%s);" runtime_repr_name (sprintf " %s.%s %s" m set_param_name pname)
303+ | None ->
304+ match param with
305+ | { typ = { t =Union { ctors; _ } ; _ } ; _ } when nullable ->
306+ set_param_nullable " v" @@ (get_enum_name ctors) ^ " .set_param p v"
307+ | { typ = { t =Union { ctors; _ } ; _ } ; _ } ->
308+ output " %s.set_param p %s;" (get_enum_name ctors) pname
309+ | param' ->
310+ if nullable then
311+ set_param_nullable " v" @@ sprintf " T.set_param_%s %s" (show_param_type param') " p v"
312+ else
313+ output " T.set_param_%s p %s;" ptype pname
311314
312315let set_var index var =
313316 let execute_generators = List. iter (fun f -> f () ) in
@@ -532,16 +535,16 @@ let output_params_binder index vars =
532535
533536
534537let make_to_literal meta typ =
535- let rec go domain = match domain with
536- | { Type. t = Union _ ; _ } when not ! Sqlgg_config. enum_as_poly_variant -> go { domain with Type. t = Text }
537- | { Type. t = Union { ctors; _ } ; _ } -> sprintf " %s.to_literal " (get_enum_name ctors)
538- | t -> match Sql.Meta. find_opt meta " module " with
539- | None -> sprintf " T.Types.%s.to_literal " ( Sql.Type. type_name t)
540- | Some m ->
541- let set_param = " set_param " in
542- let set_param_name = set_param |> Sql.Meta. find_opt meta |> Option. default set_param in
543- sprintf " (fun v -> T.Types.%s.%s_to_literal ( %s.%s v)) " (Sql.Type. type_name t) ( L. as_runtime_repr_name t) m set_param_name
544- in go typ
538+ match Sql.Meta. find_opt meta " module " with
539+ | Some m ->
540+ let set_param = " set_param " in
541+ let set_param_name = set_param |> Sql.Meta. find_opt meta |> Option. default set_param in
542+ let trait_type_name = match typ. Type. t with | Union _ -> " Text " | StringLiteral _ -> " Text " | _ -> Sql.Type. type_name typ in
543+ sprintf " (fun v -> T.Types.%s.%s_to_literal (%s.%s v)) " trait_type_name ( L. as_runtime_repr_name typ) m set_param_name
544+ | None ->
545+ match typ. Type. t with
546+ | Union { ctors; _ } -> sprintf " %s.to_literal " (get_enum_name ctors)
547+ | _ -> sprintf " T.Types.%s.to_literal " ( Sql.Type. type_name typ)
545548
546549let gen_in_substitution meta var =
547550 if Option. is_none var.id.label then failwith " empty label in IN param" ;
@@ -742,25 +745,34 @@ let generate_enum_modules stmts =
742745 | Datetime | Decimal | Any | StringLiteral _ | Json_path | One_or_all -> None
743746 in
744747
745- let schemas_to_enums schemas = schemas |> List. filter_map (fun { domain; _ } -> get_enum domain) in
746-
747- let rec vars_to_enums vars = List. concat_map (function
748- | Single ({ typ; _ }, _)
749- | SingleIn ({ typ; _ } , _ ) -> typ |> get_enum |> option_list
750- | SharedVarsGroup (vars, _)
751- | OptionActionChoice (_, vars, _, _)
752- | ChoiceIn { vars; _ } -> vars_to_enums vars
753- | Choice (_ , ctor_list ) ->
754- List. concat_map ( function
755- | Simple (_ , vars ) -> Option. map vars_to_enums vars |> option_list |> List. concat
756- | Verbatim _ -> []
757- ) ctor_list
758- | TupleList (_ , ValueRows { types; _ } ) ->
759- List. concat_map (fun typ -> typ |> get_enum |> option_list) types
760- | TupleList (_ , Where_in (types , _ , _ )) ->
761- List. concat_map (fun (typ , _ ) -> typ |> get_enum |> option_list) types
762- | TupleList (_ , Insertion schema ) -> schemas_to_enums schema
763- ) vars in
748+ let meta_has_module m = Sql.Meta. mem m " module" in
749+
750+ let schemas_to_enums schemas =
751+ List. filter_map (fun { domain; meta; _ } ->
752+ if meta_has_module meta then None else get_enum domain
753+ ) schemas
754+ in
755+
756+ let rec vars_to_enums vars =
757+ let enum_opt typ = typ |> get_enum |> option_list in
758+ let enum_opt_with_meta typ meta = if meta_has_module meta then [] else enum_opt typ in
759+ List. concat_map (function
760+ | Single ({ typ; _ }, meta)
761+ | SingleIn ({ typ; _ } , meta ) -> enum_opt_with_meta typ meta
762+ | SharedVarsGroup (vars, _)
763+ | OptionActionChoice (_, vars, _, _)
764+ | ChoiceIn { vars; _ } -> vars_to_enums vars
765+ | Choice (_ , ctor_list ) ->
766+ List. concat_map ( function
767+ | Simple (_ , vars ) -> Option. map vars_to_enums vars |> option_list |> List. concat
768+ | Verbatim _ -> []
769+ ) ctor_list
770+ | TupleList (_ , ValueRows { types; _ } ) ->
771+ List. concat_map enum_opt types
772+ | TupleList (_ , Where_in (types , _ , _ )) ->
773+ List. concat_map (fun (typ , meta ) -> enum_opt_with_meta typ meta) types
774+ | TupleList (_ , Insertion schema ) -> schemas_to_enums schema
775+ ) vars in
764776
765777 Hashtbl. reset enums_hash_tbl;
766778
@@ -794,8 +806,6 @@ let generate_enum_modules stmts =
794806 end 0 result in
795807 ()
796808 )
797-
798- let generate_enum_modules stmts = if ! Sqlgg_config. enum_as_poly_variant then generate_enum_modules stmts
799809
800810let generate ~gen_io name stmts =
801811(*
0 commit comments