google-cloud-bigquery 3.31.0__tar.gz → 3.32.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. {google_cloud_bigquery-3.31.0/google_cloud_bigquery.egg-info → google_cloud_bigquery-3.32.0}/PKG-INFO +2 -2
  2. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/_job_helpers.py +42 -1
  3. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/client.py +3 -12
  4. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/dataset.py +210 -16
  5. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/enums.py +20 -0
  6. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/job/query.py +15 -0
  7. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/table.py +177 -26
  8. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/version.py +1 -1
  9. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0/google_cloud_bigquery.egg-info}/PKG-INFO +2 -2
  10. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google_cloud_bigquery.egg-info/requires.txt +1 -1
  11. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/pyproject.toml +1 -1
  12. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/test_pandas.py +1 -6
  13. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/test_query_config.py +5 -0
  14. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test__job_helpers.py +12 -0
  15. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_dataset.py +507 -14
  16. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_dbapi_cursor.py +1 -0
  17. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_job_retry.py +13 -5
  18. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_table.py +169 -8
  19. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/LICENSE +0 -0
  20. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/MANIFEST.in +0 -0
  21. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/README.rst +0 -0
  22. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/__init__.py +0 -0
  23. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/_helpers.py +0 -0
  24. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/_http.py +0 -0
  25. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/_pandas_helpers.py +0 -0
  26. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/_pyarrow_helpers.py +0 -0
  27. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/_tqdm_helpers.py +0 -0
  28. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/_versions_helpers.py +0 -0
  29. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/dbapi/__init__.py +0 -0
  30. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/dbapi/_helpers.py +0 -0
  31. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/dbapi/connection.py +0 -0
  32. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/dbapi/cursor.py +0 -0
  33. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/dbapi/exceptions.py +0 -0
  34. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/dbapi/types.py +0 -0
  35. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/encryption_configuration.py +0 -0
  36. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/exceptions.py +0 -0
  37. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/external_config.py +0 -0
  38. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/format_options.py +0 -0
  39. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/iam.py +0 -0
  40. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/job/__init__.py +0 -0
  41. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/job/base.py +0 -0
  42. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/job/copy_.py +0 -0
  43. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/job/extract.py +0 -0
  44. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/job/load.py +0 -0
  45. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/magics/__init__.py +0 -0
  46. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/magics/line_arg_parser/__init__.py +0 -0
  47. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/magics/line_arg_parser/exceptions.py +0 -0
  48. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/magics/line_arg_parser/lexer.py +0 -0
  49. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/magics/line_arg_parser/parser.py +0 -0
  50. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/magics/line_arg_parser/visitors.py +0 -0
  51. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/magics/magics.py +0 -0
  52. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/model.py +0 -0
  53. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/opentelemetry_tracing.py +0 -0
  54. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/py.typed +0 -0
  55. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/query.py +0 -0
  56. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/retry.py +0 -0
  57. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/routine/__init__.py +0 -0
  58. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/routine/routine.py +0 -0
  59. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/schema.py +0 -0
  60. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery/standard_sql.py +0 -0
  61. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery_v2/__init__.py +0 -0
  62. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery_v2/types/__init__.py +0 -0
  63. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery_v2/types/encryption_config.py +0 -0
  64. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery_v2/types/model.py +0 -0
  65. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery_v2/types/model_reference.py +0 -0
  66. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery_v2/types/standard_sql.py +0 -0
  67. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google/cloud/bigquery_v2/types/table_reference.py +0 -0
  68. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google_cloud_bigquery.egg-info/SOURCES.txt +0 -0
  69. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google_cloud_bigquery.egg-info/dependency_links.txt +0 -0
  70. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/google_cloud_bigquery.egg-info/top_level.txt +0 -0
  71. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/setup.cfg +0 -0
  72. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/setup.py +0 -0
  73. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/__init__.py +0 -0
  74. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/characters.json +0 -0
  75. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/characters.jsonl +0 -0
  76. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/colors.avro +0 -0
  77. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/numeric_38_12.parquet +0 -0
  78. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/people.csv +0 -0
  79. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/scalars.csv +0 -0
  80. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/scalars.jsonl +0 -0
  81. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/scalars_extreme.jsonl +0 -0
  82. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/scalars_schema.json +0 -0
  83. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/scalars_schema_csv.json +0 -0
  84. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/data/schema.json +0 -0
  85. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/scrub_datasets.py +0 -0
  86. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/__init__.py +0 -0
  87. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/conftest.py +0 -0
  88. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/helpers.py +0 -0
  89. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/test_arrow.py +0 -0
  90. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/test_client.py +0 -0
  91. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/test_job_retry.py +0 -0
  92. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/test_list_rows.py +0 -0
  93. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/test_magics.py +0 -0
  94. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/test_query.py +0 -0
  95. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/system/test_structs.py +0 -0
  96. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/__init__.py +0 -0
  97. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/_helpers/__init__.py +0 -0
  98. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/_helpers/test_cell_data_parser.py +0 -0
  99. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/_helpers/test_data_frame_cell_data_parser.py +0 -0
  100. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/_helpers/test_scalar_query_param_parser.py +0 -0
  101. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/conftest.py +0 -0
  102. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/helpers.py +0 -0
  103. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/__init__.py +0 -0
  104. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/helpers.py +0 -0
  105. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/test_base.py +0 -0
  106. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/test_copy.py +0 -0
  107. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/test_extract.py +0 -0
  108. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/test_load.py +0 -0
  109. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/test_load_config.py +0 -0
  110. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/test_query.py +0 -0
  111. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/test_query_pandas.py +0 -0
  112. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/job/test_query_stats.py +0 -0
  113. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/line_arg_parser/__init__.py +0 -0
  114. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/line_arg_parser/test_lexer.py +0 -0
  115. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/line_arg_parser/test_parser.py +0 -0
  116. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/line_arg_parser/test_visitors.py +0 -0
  117. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/model/__init__.py +0 -0
  118. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/model/test_model.py +0 -0
  119. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/model/test_model_reference.py +0 -0
  120. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/routine/__init__.py +0 -0
  121. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/routine/test_remote_function_options.py +0 -0
  122. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/routine/test_routine.py +0 -0
  123. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/routine/test_routine_argument.py +0 -0
  124. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/routine/test_routine_reference.py +0 -0
  125. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test__helpers.py +0 -0
  126. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test__http.py +0 -0
  127. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test__pandas_helpers.py +0 -0
  128. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test__pyarrow_helpers.py +0 -0
  129. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test__versions_helpers.py +0 -0
  130. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_client.py +0 -0
  131. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_create_dataset.py +0 -0
  132. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_dbapi__helpers.py +0 -0
  133. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_dbapi_connection.py +0 -0
  134. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_dbapi_types.py +0 -0
  135. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_delete_dataset.py +0 -0
  136. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_encryption_configuration.py +0 -0
  137. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_external_config.py +0 -0
  138. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_format_options.py +0 -0
  139. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_legacy_types.py +0 -0
  140. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_list_datasets.py +0 -0
  141. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_list_jobs.py +0 -0
  142. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_list_models.py +0 -0
  143. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_list_projects.py +0 -0
  144. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_list_routines.py +0 -0
  145. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_list_tables.py +0 -0
  146. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_magics.py +0 -0
  147. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_opentelemetry_tracing.py +0 -0
  148. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_packaging.py +0 -0
  149. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_query.py +0 -0
  150. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_retry.py +0 -0
  151. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_schema.py +0 -0
  152. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_signature_compatibility.py +0 -0
  153. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_standard_sql_types.py +0 -0
  154. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_table_arrow.py +0 -0
  155. {google_cloud_bigquery-3.31.0 → google_cloud_bigquery-3.32.0}/tests/unit/test_table_pandas.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: google-cloud-bigquery
3
- Version: 3.31.0
3
+ Version: 3.32.0
4
4
  Summary: Google BigQuery API client library
5
5
  Author-email: Google LLC <googleapis-packages@google.com>
6
6
  License: Apache 2.0
@@ -33,7 +33,7 @@ Requires-Dist: grpcio<2.0.0,>=1.47.0; extra == "bqstorage"
33
33
  Requires-Dist: grpcio<2.0.0,>=1.49.1; python_version >= "3.11" and extra == "bqstorage"
34
34
  Requires-Dist: pyarrow>=4.0.0; extra == "bqstorage"
35
35
  Provides-Extra: pandas
36
- Requires-Dist: pandas>=1.1.4; extra == "pandas"
36
+ Requires-Dist: pandas>=1.3.0; extra == "pandas"
37
37
  Requires-Dist: pandas-gbq>=0.26.1; extra == "pandas"
38
38
  Requires-Dist: grpcio<2.0.0,>=1.47.0; extra == "pandas"
39
39
  Requires-Dist: grpcio<2.0.0,>=1.49.1; python_version >= "3.11" and extra == "pandas"
@@ -39,7 +39,9 @@ import copy
39
39
  import functools
40
40
  import os
41
41
  import uuid
42
+ import textwrap
42
43
  from typing import Any, Dict, Optional, TYPE_CHECKING, Union
44
+ import warnings
43
45
 
44
46
  import google.api_core.exceptions as core_exceptions
45
47
  from google.api_core import retry as retries
@@ -198,6 +200,44 @@ def _validate_job_config(request_body: Dict[str, Any], invalid_key: str):
198
200
  raise ValueError(f"got unexpected key {repr(invalid_key)} in job_config")
199
201
 
200
202
 
203
+ def validate_job_retry(job_id: Optional[str], job_retry: Optional[retries.Retry]):
204
+ """Catch common mistakes, such as setting a job_id and job_retry at the same
205
+ time.
206
+ """
207
+ if job_id is not None and job_retry is not None:
208
+ # TODO(tswast): To avoid breaking changes but still allow a default
209
+ # query job retry, we currently only raise if they explicitly set a
210
+ # job_retry other than the default. In a future version, we may want to
211
+ # avoid this check for DEFAULT_JOB_RETRY and always raise.
212
+ if job_retry is not google.cloud.bigquery.retry.DEFAULT_JOB_RETRY:
213
+ raise TypeError(
214
+ textwrap.dedent(
215
+ """
216
+ `job_retry` was provided, but the returned job is
217
+ not retryable, because a custom `job_id` was
218
+ provided. To customize the job ID and allow for job
219
+ retries, set job_id_prefix, instead.
220
+ """
221
+ ).strip()
222
+ )
223
+ else:
224
+ warnings.warn(
225
+ textwrap.dedent(
226
+ """
227
+ job_retry must be explicitly set to None if job_id is set.
228
+ BigQuery cannot retry a failed job by using the exact
229
+ same ID. Setting job_id without explicitly disabling
230
+ job_retry will raise an error in the future. To avoid this
231
+ warning, either use job_id_prefix instead (preferred) or
232
+ set job_retry=None.
233
+ """
234
+ ).strip(),
235
+ category=FutureWarning,
236
+ # user code -> client.query / client.query_and_wait -> validate_job_retry
237
+ stacklevel=3,
238
+ )
239
+
240
+
201
241
  def _to_query_request(
202
242
  job_config: Optional[job.QueryJobConfig] = None,
203
243
  *,
@@ -308,7 +348,7 @@ def query_jobs_query(
308
348
  project: str,
309
349
  retry: retries.Retry,
310
350
  timeout: Optional[float],
311
- job_retry: retries.Retry,
351
+ job_retry: Optional[retries.Retry],
312
352
  ) -> job.QueryJob:
313
353
  """Initiate a query using jobs.query with jobCreationMode=JOB_CREATION_REQUIRED.
314
354
 
@@ -564,6 +604,7 @@ def _supported_by_jobs_query(request_body: Dict[str, Any]) -> bool:
564
604
  "maximumBytesBilled",
565
605
  "requestId",
566
606
  "createSession",
607
+ "writeIncrementalResults",
567
608
  }
568
609
 
569
610
  unsupported_keys = request_keys - keys_allowlist
@@ -3388,7 +3388,7 @@ class Client(ClientWithProject):
3388
3388
  project: Optional[str] = None,
3389
3389
  retry: retries.Retry = DEFAULT_RETRY,
3390
3390
  timeout: TimeoutType = DEFAULT_TIMEOUT,
3391
- job_retry: retries.Retry = DEFAULT_JOB_RETRY,
3391
+ job_retry: Optional[retries.Retry] = DEFAULT_JOB_RETRY,
3392
3392
  api_method: Union[str, enums.QueryApiMethod] = enums.QueryApiMethod.INSERT,
3393
3393
  ) -> job.QueryJob:
3394
3394
  """Run a SQL query.
@@ -3455,18 +3455,9 @@ class Client(ClientWithProject):
3455
3455
  class, or if both ``job_id`` and non-``None`` non-default
3456
3456
  ``job_retry`` are provided.
3457
3457
  """
3458
- job_id_given = job_id is not None
3459
- if (
3460
- job_id_given
3461
- and job_retry is not None
3462
- and job_retry is not DEFAULT_JOB_RETRY
3463
- ):
3464
- raise TypeError(
3465
- "`job_retry` was provided, but the returned job is"
3466
- " not retryable, because a custom `job_id` was"
3467
- " provided."
3468
- )
3458
+ _job_helpers.validate_job_retry(job_id, job_retry)
3469
3459
 
3460
+ job_id_given = job_id is not None
3470
3461
  if job_id_given and api_method == enums.QueryApiMethod.QUERY:
3471
3462
  raise TypeError(
3472
3463
  "`job_id` was provided, but the 'QUERY' `api_method` was requested."
@@ -19,6 +19,7 @@ from __future__ import absolute_import
19
19
  import copy
20
20
 
21
21
  import typing
22
+ from typing import Optional, List, Dict, Any, Union
22
23
 
23
24
  import google.cloud._helpers # type: ignore
24
25
 
@@ -29,8 +30,6 @@ from google.cloud.bigquery.table import Table, TableReference
29
30
  from google.cloud.bigquery.encryption_configuration import EncryptionConfiguration
30
31
  from google.cloud.bigquery import external_config
31
32
 
32
- from typing import Optional, List, Dict, Any, Union
33
-
34
33
 
35
34
  def _get_table_reference(self, table_id: str) -> TableReference:
36
35
  """Constructs a TableReference.
@@ -299,12 +298,15 @@ class AccessEntry(object):
299
298
  role: Optional[str] = None,
300
299
  entity_type: Optional[str] = None,
301
300
  entity_id: Optional[Union[Dict[str, Any], str]] = None,
301
+ **kwargs,
302
302
  ):
303
- self._properties = {}
303
+ self._properties: Dict[str, Any] = {}
304
304
  if entity_type is not None:
305
305
  self._properties[entity_type] = entity_id
306
306
  self._properties["role"] = role
307
- self._entity_type = entity_type
307
+ self._entity_type: Optional[str] = entity_type
308
+ for prop, val in kwargs.items():
309
+ setattr(self, prop, val)
308
310
 
309
311
  @property
310
312
  def role(self) -> Optional[str]:
@@ -331,6 +333,9 @@ class AccessEntry(object):
331
333
  if isinstance(value, str):
332
334
  value = DatasetReference.from_string(value).to_api_repr()
333
335
 
336
+ if isinstance(value, DatasetReference):
337
+ value = value.to_api_repr()
338
+
334
339
  if isinstance(value, (Dataset, DatasetListItem)):
335
340
  value = value.reference.to_api_repr()
336
341
 
@@ -438,15 +443,65 @@ class AccessEntry(object):
438
443
  def special_group(self, value):
439
444
  self._properties["specialGroup"] = value
440
445
 
446
+ @property
447
+ def condition(self) -> Optional["Condition"]:
448
+ """Optional[Condition]: The IAM condition associated with this entry."""
449
+ value = typing.cast(Dict[str, Any], self._properties.get("condition"))
450
+ return Condition.from_api_repr(value) if value else None
451
+
452
+ @condition.setter
453
+ def condition(self, value: Union["Condition", dict, None]):
454
+ """Set the IAM condition for this entry."""
455
+ if value is None:
456
+ self._properties["condition"] = None
457
+ elif isinstance(value, Condition):
458
+ self._properties["condition"] = value.to_api_repr()
459
+ elif isinstance(value, dict):
460
+ self._properties["condition"] = value
461
+ else:
462
+ raise TypeError("condition must be a Condition object, dict, or None")
463
+
441
464
  @property
442
465
  def entity_type(self) -> Optional[str]:
443
466
  """The entity_type of the entry."""
467
+
468
+ # The api_repr for an AccessEntry object is expected to be a dict with
469
+ # only a few keys. Two keys that may be present are role and condition.
470
+ # Any additional key is going to have one of ~eight different names:
471
+ # userByEmail, groupByEmail, domain, dataset, specialGroup, view,
472
+ # routine, iamMember
473
+
474
+ # if self._entity_type is None, see if it needs setting
475
+ # i.e. is there a key: value pair that should be associated with
476
+ # entity_type and entity_id?
477
+ if self._entity_type is None:
478
+ resource = self._properties.copy()
479
+ # we are empyting the dict to get to the last `key: value`` pair
480
+ # so we don't keep these first entries
481
+ _ = resource.pop("role", None)
482
+ _ = resource.pop("condition", None)
483
+
484
+ try:
485
+ # we only need entity_type, because entity_id gets set elsewhere.
486
+ entity_type, _ = resource.popitem()
487
+ except KeyError:
488
+ entity_type = None
489
+
490
+ self._entity_type = entity_type
491
+
444
492
  return self._entity_type
445
493
 
446
494
  @property
447
495
  def entity_id(self) -> Optional[Union[Dict[str, Any], str]]:
448
496
  """The entity_id of the entry."""
449
- return self._properties.get(self._entity_type) if self._entity_type else None
497
+ if self.entity_type:
498
+ entity_type = self.entity_type
499
+ else:
500
+ return None
501
+ return typing.cast(
502
+ Optional[Union[Dict[str, Any], str]],
503
+ self._properties.get(entity_type, None),
504
+ )
450
505
 
451
506
  def __eq__(self, other):
452
507
  if not isinstance(other, AccessEntry):
@@ -465,7 +520,16 @@ class AccessEntry(object):
465
520
  Returns:
466
521
  Tuple: The contents of this :class:`~google.cloud.bigquery.dataset.AccessEntry`.
467
522
  """
523
+
468
524
  properties = self._properties.copy()
525
+
526
+ # Dicts are not hashable.
527
+ # Convert condition to a hashable datatype(s)
528
+ condition = properties.get("condition")
529
+ if isinstance(condition, dict):
530
+ condition_key = tuple(sorted(condition.items()))
531
+ properties["condition"] = condition_key
532
+
469
533
  prop_tup = tuple(sorted(properties.items()))
470
534
  return (self.role, self._entity_type, self.entity_id, prop_tup)
471
535
 
@@ -492,19 +556,11 @@ class AccessEntry(object):
492
556
  Returns:
493
557
  google.cloud.bigquery.dataset.AccessEntry:
494
558
  Access entry parsed from ``resource``.
495
-
496
- Raises:
497
- ValueError:
498
- If the resource has more keys than ``role`` and one additional
499
- key.
500
559
  """
501
- entry = resource.copy()
502
- role = entry.pop("role", None)
503
- entity_type, entity_id = entry.popitem()
504
- if len(entry) != 0:
505
- raise ValueError("Entry has unexpected keys remaining.", entry)
506
560
 
507
- return cls(role, entity_type, entity_id)
561
+ access_entry = cls()
562
+ access_entry._properties = resource.copy()
563
+ return access_entry
508
564
 
509
565
 
510
566
  class Dataset(object):
@@ -533,6 +589,7 @@ class Dataset(object):
533
589
  "default_rounding_mode": "defaultRoundingMode",
534
590
  "resource_tags": "resourceTags",
535
591
  "external_catalog_dataset_options": "externalCatalogDatasetOptions",
592
+ "access_policy_version": "accessPolicyVersion",
536
593
  }
537
594
 
538
595
  def __init__(self, dataset_ref) -> None:
@@ -923,6 +980,16 @@ class Dataset(object):
923
980
  self._PROPERTY_TO_API_FIELD["external_catalog_dataset_options"]
924
981
  ] = (value.to_api_repr() if value is not None else None)
925
982
 
983
+ @property
984
+ def access_policy_version(self):
985
+ return self._properties.get("accessPolicyVersion")
986
+
987
+ @access_policy_version.setter
988
+ def access_policy_version(self, value):
989
+ if not isinstance(value, int) and value is not None:
990
+ raise ValueError("Pass an integer, or None")
991
+ self._properties["accessPolicyVersion"] = value
992
+
926
993
  @classmethod
927
994
  def from_string(cls, full_dataset_id: str) -> "Dataset":
928
995
  """Construct a dataset from fully-qualified dataset ID.
@@ -1074,3 +1141,130 @@ class DatasetListItem(object):
1074
1141
  model = _get_model_reference
1075
1142
 
1076
1143
  routine = _get_routine_reference
1144
+
1145
+
1146
+ class Condition(object):
1147
+ """Represents a textual expression in the Common Expression Language (CEL) syntax.
1148
+
1149
+ Typically used for filtering or policy rules, such as in IAM Conditions
1150
+ or BigQuery row/column access policies.
1151
+
1152
+ See:
1153
+ https://cloud.google.com/iam/docs/reference/rest/Shared.Types/Expr
1154
+ https://github.com/google/cel-spec
1155
+
1156
+ Args:
1157
+ expression (str):
1158
+ The condition expression string using CEL syntax. This is required.
1159
+ Example: ``resource.type == "compute.googleapis.com/Instance"``
1160
+ title (Optional[str]):
1161
+ An optional title for the condition, providing a short summary.
1162
+ Example: ``"Request is for a GCE instance"``
1163
+ description (Optional[str]):
1164
+ An optional description of the condition, providing a detailed explanation.
1165
+ Example: ``"This condition checks whether the resource is a GCE instance."``
1166
+ """
1167
+
1168
+ def __init__(
1169
+ self,
1170
+ expression: str,
1171
+ title: Optional[str] = None,
1172
+ description: Optional[str] = None,
1173
+ ):
1174
+ self._properties: Dict[str, Any] = {}
1175
+ # Use setters to initialize properties, which also handle validation
1176
+ self.expression = expression
1177
+ self.title = title
1178
+ self.description = description
1179
+
1180
+ @property
1181
+ def title(self) -> Optional[str]:
1182
+ """Optional[str]: The title for the condition."""
1183
+ return self._properties.get("title")
1184
+
1185
+ @title.setter
1186
+ def title(self, value: Optional[str]):
1187
+ if value is not None and not isinstance(value, str):
1188
+ raise ValueError("Pass a string for title, or None")
1189
+ self._properties["title"] = value
1190
+
1191
+ @property
1192
+ def description(self) -> Optional[str]:
1193
+ """Optional[str]: The description for the condition."""
1194
+ return self._properties.get("description")
1195
+
1196
+ @description.setter
1197
+ def description(self, value: Optional[str]):
1198
+ if value is not None and not isinstance(value, str):
1199
+ raise ValueError("Pass a string for description, or None")
1200
+ self._properties["description"] = value
1201
+
1202
+ @property
1203
+ def expression(self) -> str:
1204
+ """str: The expression string for the condition."""
1205
+
1206
+ # Cast assumes expression is always set due to __init__ validation
1207
+ return typing.cast(str, self._properties.get("expression"))
1208
+
1209
+ @expression.setter
1210
+ def expression(self, value: str):
1211
+ if not isinstance(value, str):
1212
+ raise ValueError("Pass a non-empty string for expression")
1213
+ if not value:
1214
+ raise ValueError("expression cannot be an empty string")
1215
+ self._properties["expression"] = value
1216
+
1217
+ def to_api_repr(self) -> Dict[str, Any]:
1218
+ """Construct the API resource representation of this Condition."""
1219
+ return self._properties
1220
+
1221
+ @classmethod
1222
+ def from_api_repr(cls, resource: Dict[str, Any]) -> "Condition":
1223
+ """Factory: construct a Condition instance given its API representation."""
1224
+
1225
+ # Ensure required fields are present in the resource if necessary
1226
+ if "expression" not in resource:
1227
+ raise ValueError("API representation missing required 'expression' field.")
1228
+
1229
+ return cls(
1230
+ expression=resource["expression"],
1231
+ title=resource.get("title"),
1232
+ description=resource.get("description"),
1233
+ )
1234
+
1235
+ def __eq__(self, other: object) -> bool:
1236
+ """Check for equality based on expression, title, and description."""
1237
+ if not isinstance(other, Condition):
1238
+ return NotImplemented
1239
+ return self._key() == other._key()
1240
+
1241
+ def _key(self):
1242
+ """A tuple key that uniquely describes this field.
1243
+ Used to compute this instance's hashcode and evaluate equality.
1244
+ Returns:
1245
+ Tuple: The contents of this :class:`~google.cloud.bigquery.dataset.AccessEntry`.
1246
+ """
1247
+
1248
+ properties = self._properties.copy()
1249
+
1250
+ # Dicts are not hashable.
1251
+ # Convert object to a hashable datatype(s)
1252
+ prop_tup = tuple(sorted(properties.items()))
1253
+ return prop_tup
1254
+
1255
+ def __ne__(self, other: object) -> bool:
1256
+ """Check for inequality."""
1257
+ return not self == other
1258
+
1259
+ def __hash__(self) -> int:
1260
+ """Generate a hash based on expression, title, and description."""
1261
+ return hash(self._key())
1262
+
1263
+ def __repr__(self) -> str:
1264
+ """Return a string representation of the Condition object."""
1265
+ parts = [f"expression={self.expression!r}"]
1266
+ if self.title is not None:
1267
+ parts.append(f"title={self.title!r}")
1268
+ if self.description is not None:
1269
+ parts.append(f"description={self.description!r}")
1270
+ return f"Condition({', '.join(parts)})"
@@ -338,6 +338,10 @@ class WriteDisposition(object):
338
338
  WRITE_TRUNCATE = "WRITE_TRUNCATE"
339
339
  """If the table already exists, BigQuery overwrites the table data."""
340
340
 
341
+ WRITE_TRUNCATE_DATA = "WRITE_TRUNCATE_DATA"
342
+ """For existing tables, truncate data but preserve existing schema
343
+ and constraints."""
344
+
341
345
  WRITE_EMPTY = "WRITE_EMPTY"
342
346
  """If the table already exists and contains data, a 'duplicate' error is
343
347
  returned in the job result."""
@@ -387,3 +391,19 @@ class RoundingMode(str, enum.Enum):
387
391
  ROUNDING_MODE_UNSPECIFIED = enum.auto()
388
392
  ROUND_HALF_AWAY_FROM_ZERO = enum.auto()
389
393
  ROUND_HALF_EVEN = enum.auto()
394
+
395
+
396
+ class BigLakeFileFormat(object):
397
+ FILE_FORMAT_UNSPECIFIED = "FILE_FORMAT_UNSPECIFIED"
398
+ """The default unspecified value."""
399
+
400
+ PARQUET = "PARQUET"
401
+ """Apache Parquet format."""
402
+
403
+
404
+ class BigLakeTableFormat(object):
405
+ TABLE_FORMAT_UNSPECIFIED = "TABLE_FORMAT_UNSPECIFIED"
406
+ """The default unspecified value."""
407
+
408
+ ICEBERG = "ICEBERG"
409
+ """Apache Iceberg format."""
@@ -674,6 +674,21 @@ class QueryJobConfig(_JobConfig):
674
674
  def write_disposition(self, value):
675
675
  self._set_sub_prop("writeDisposition", value)
676
676
 
677
+ @property
678
+ def write_incremental_results(self) -> Optional[bool]:
679
+ """This is only supported for a SELECT query using a temporary table.
680
+
681
+ If set, the query is allowed to write results incrementally to the temporary result
682
+ table. This may incur a performance penalty. This option cannot be used with Legacy SQL.
683
+
684
+ This feature is not generally available.
685
+ """
686
+ return self._get_sub_prop("writeIncrementalResults")
687
+
688
+ @write_incremental_results.setter
689
+ def write_incremental_results(self, value):
690
+ self._set_sub_prop("writeIncrementalResults", value)
691
+
677
692
  @property
678
693
  def table_definitions(self):
679
694
  """Dict[str, google.cloud.bigquery.external_config.ExternalConfig]: