| 402 | |
| 403 | class JSONIn(ProcessJSONLHSMixin, lookups.In): |
| 404 | def resolve_expression_parameter(self, compiler, connection, sql, param): |
| 405 | sql, params = super().resolve_expression_parameter( |
| 406 | compiler, |
| 407 | connection, |
| 408 | sql, |
| 409 | param, |
| 410 | ) |
| 411 | if not connection.features.has_native_json_field and ( |
| 412 | not hasattr(param, "as_sql") or isinstance(param, expressions.Value) |
| 413 | ): |
| 414 | if connection.vendor == "oracle": |
| 415 | value = param.value if hasattr(param, "value") else json.loads(param) |
| 416 | sql = "%s(JSON_OBJECT('value' VALUE %%s FORMAT JSON), '$.value')" |
| 417 | if isinstance(value, (list, dict)): |
| 418 | sql %= "JSON_QUERY" |
| 419 | else: |
| 420 | sql %= "JSON_VALUE" |
| 421 | elif connection.vendor == "mysql" or ( |
| 422 | connection.vendor == "sqlite" |
| 423 | and params[0] not in connection.ops.jsonfield_datatype_values |
| 424 | ): |
| 425 | sql = "JSON_EXTRACT(%s, '$')" |
| 426 | if connection.vendor == "mysql" and connection.mysql_is_mariadb: |
| 427 | sql = "JSON_UNQUOTE(%s)" % sql |
| 428 | return sql, params |
| 429 | |
| 430 | def process_lhs(self, compiler, connection): |
| 431 | sql, params = super().process_lhs(compiler, connection) |