bigquery-emulator icon indicating copy to clipboard operation
bigquery-emulator copied to clipboard

Fix error response status code when dataset or job already exists

Open leonasdev opened this issue 1 year ago • 2 comments

The official BigQuery documentation's error messages state that when creating a job, dataset, or table, a response of 409 should be returned if they already exist.

Currently, I have found that only the table portion has the correct response of 409, while the other two always respond with 500. Therefore, I am submitting this PR to fix this issue.

Additionally, the documentation mentions that The error also returns when a job's writeDisposition property is set to WRITE_EMPTY and the destination table accessed by the job already exists. I have not implemented this part, but it may be considered for future improvements.

This is my first PR of this repo, so please let me know if there are any issues with my PR. Thank you.

leonasdev avatar May 10 '23 12:05 leonasdev

I'm running into this too and was just about to consider contributing and fixing it. This is my workaround:

    def create_dataset(self, dataset, exists_ok=False):
        # The exists_ok flag doesn't seem to work with the emulator,
        # so work around it.
        try:
            return self._client.create_dataset(dataset, retry=None)
        except google.api_core.exceptions.InternalServerError as e:
            errors = e.errors
            dataset_basename = dataset.split('.')[-1]
            if exists_ok and re.match(rf'dataset {dataset_basename} is already created', errors[0]["message"]):
                return
            raise e

Obviously, it would be better to fix it in the emulator! Let me know if I can help with anything.

thuibr avatar Dec 05 '23 15:12 thuibr

@goccy hi just wondering what I can do to help get this PR through?

thuibr avatar Dec 13 '23 01:12 thuibr