Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JSON_VALUE does not seem to accept dynamic SQL #357

Open
Vektrat opened this issue Oct 7, 2024 · 0 comments
Open

JSON_VALUE does not seem to accept dynamic SQL #357

Vektrat opened this issue Oct 7, 2024 · 0 comments
Labels
bug Something isn't working

Comments

@Vektrat
Copy link

Vektrat commented Oct 7, 2024

What happened?

I've written a small client to publish UDFs from a SQL file to BigQuery, I've tried to do so in Golang and Python, with the same erroneous results (the error is coming from the server, bigquery_emulator).

The code is working in BigQuery studio, and even when uploading it to BigQuery via official GCP tooling, so unless I'm wrong somewhere I believe the issue may lay at the emulator's server side.

The failing part of the simplified code is this (note that I'm registering the function as an UDF to GCP, not executing it):

WHEN JSON_VALUE(param_1, param_2) IS NOT NULL THEN...

With the error:

big-query-testing > Traceback (most recent call last):
big-query-testing >   File "/gcl-builds/bigquery/XXX/testing/XXX_tests.py", line 50, in <module>
big-query-testing >     rows = query_job.result()   # waits for query to finish
big-query-testing >   File "/usr/local/lib/python3.10/site-packages/google/cloud/bigquery/job/query.py", line 1681, in result
big-query-testing >     while not is_job_done():
big-query-testing >   File "/usr/local/lib/python3.10/site-packages/google/api_core/retry/retry_unary.py", line 293, in retry_wrapped_func
big-query-testing >     return retry_target(
big-query-testing >   File "/usr/local/lib/python3.10/site-packages/google/api_core/retry/retry_unary.py", line 153, in retry_target
big-query-testing >     _retry_error_helper(
big-query-testing >   File "/usr/local/lib/python3.10/site-packages/google/api_core/retry/retry_base.py", line 212, in _retry_error_helper
big-query-testing >     raise final_exc from source_exc
big-query-testing >   File "/usr/local/lib/python3.10/site-packages/google/api_core/retry/retry_unary.py", line 144, in retry_target
big-query-testing >     result = target()
big-query-testing >   File "/usr/local/lib/python3.10/site-packages/google/cloud/bigquery/job/query.py", line 1630, in is_job_done
big-query-testing >     raise job_failed_exception
big-query-testing > google.api_core.exceptions.InternalServerError: 500 failed to analyze: INVALID_ARGUMENT: JSONPath must be a string literal or query parameter [at 7:18]; message: failed to analyze: INVALID_ARGUMENT: JSONPath must be a string literal or query parameter [at 7:18], reason: jobInternalError

However, this works:

WHEN JSON_VALUE(param_1, "any text") IS NOT NULL THEN...

What did you expect to happen?

I'd expect for the bigquery_emulator to accept this JSON function nomenclature just like BigQuery studio and GCP tools are.

How can we reproduce it (as minimally and precisely as possible)?

Failing code example:

CREATE OR REPLACE FUNCTION `project.dataset.ffff`(product_json STRING, product_name STRING) RETURNS STRING AS ((
    WITH whatever AS (
    SELECT '{"product_id": "101", "product_name": "Widget", "price": 9.99}' AS product_json
)

    SELECT 
        JSON_VALUE(product_json, product_name)
    FROM 
        whatever
));

Working code example:

CREATE OR REPLACE FUNCTION `project.dataset.ffff`(product_json STRING, product_name STRING) RETURNS STRING AS ((
    WITH whatever AS (
    SELECT '{"product_id": "101", "product_name": "Widget", "price": 9.99}' AS product_json
)

    SELECT 
        JSON_VALUE(product_json, '$.product_name')
    FROM 
        whatever
));

Anything else we need to know?

No response

@Vektrat Vektrat added the bug Something isn't working label Oct 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant