crucible-emulator 0.1.0a2__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 (590) hide show
  1. crucible_emulator-0.1.0a2/.dockerignore +16 -0
  2. crucible_emulator-0.1.0a2/.github/CODEOWNERS +1 -0
  3. crucible_emulator-0.1.0a2/.github/ISSUE_TEMPLATE/bug_report.yml +43 -0
  4. crucible_emulator-0.1.0a2/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. crucible_emulator-0.1.0a2/.github/ISSUE_TEMPLATE/unsupported_feature.yml +33 -0
  6. crucible_emulator-0.1.0a2/.github/dependabot.yml +29 -0
  7. crucible_emulator-0.1.0a2/.github/workflows/ci.yml +194 -0
  8. crucible_emulator-0.1.0a2/.github/workflows/corpus-record.yml +100 -0
  9. crucible_emulator-0.1.0a2/.github/workflows/release.yml +96 -0
  10. crucible_emulator-0.1.0a2/.gitignore +13 -0
  11. crucible_emulator-0.1.0a2/.pre-commit-config.yaml +33 -0
  12. crucible_emulator-0.1.0a2/AGENTS.md +36 -0
  13. crucible_emulator-0.1.0a2/CHANGELOG.md +39 -0
  14. crucible_emulator-0.1.0a2/CODE_OF_CONDUCT.md +84 -0
  15. crucible_emulator-0.1.0a2/CONTRIBUTING.md +68 -0
  16. crucible_emulator-0.1.0a2/LICENSE +202 -0
  17. crucible_emulator-0.1.0a2/NOTICE +4 -0
  18. crucible_emulator-0.1.0a2/PKG-INFO +162 -0
  19. crucible_emulator-0.1.0a2/README.md +131 -0
  20. crucible_emulator-0.1.0a2/SECURITY.md +24 -0
  21. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/any_value.yaml +14 -0
  22. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_empty_input.yaml +15 -0
  23. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_ignore_nulls.yaml +16 -0
  24. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_ignore_nulls_distinct.yaml +19 -0
  25. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_ignore_nulls_order_limit_offset.yaml +24 -0
  26. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_null_element.yaml +16 -0
  27. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_order_by_limit_data.yaml +24 -0
  28. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/array_agg_order_limit.yaml +16 -0
  29. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/countif.yaml +14 -0
  30. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/group_by_ordinal.yaml +19 -0
  31. crucible_emulator-0.1.0a2/corpus/bigquery/aggregate/string_agg.yaml +15 -0
  32. crucible_emulator-0.1.0a2/corpus/bigquery/array/array_concat.yaml +16 -0
  33. crucible_emulator-0.1.0a2/corpus/bigquery/array/array_length.yaml +14 -0
  34. crucible_emulator-0.1.0a2/corpus/bigquery/array/array_length_null.yaml +14 -0
  35. crucible_emulator-0.1.0a2/corpus/bigquery/array/array_subquery.yaml +16 -0
  36. crucible_emulator-0.1.0a2/corpus/bigquery/array/array_to_string.yaml +14 -0
  37. crucible_emulator-0.1.0a2/corpus/bigquery/array/array_to_string_null_text.yaml +14 -0
  38. crucible_emulator-0.1.0a2/corpus/bigquery/array/generate_array.yaml +16 -0
  39. crucible_emulator-0.1.0a2/corpus/bigquery/array/offset_out_of_range.yaml +15 -0
  40. crucible_emulator-0.1.0a2/corpus/bigquery/array/offset_zero.yaml +14 -0
  41. crucible_emulator-0.1.0a2/corpus/bigquery/array/safe_offset_out_of_range.yaml +15 -0
  42. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/anonymous_column_names.yaml +21 -0
  43. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/array_concat_operator_type.yaml +16 -0
  44. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/column_name_case_preserved.yaml +21 -0
  45. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/ctas_types.yaml +24 -0
  46. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/float_literal_is_float64.yaml +17 -0
  47. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/insert_and_select_types.yaml +59 -0
  48. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/insert_float_into_int64_error.yaml +16 -0
  49. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/insert_int64_into_float64_coerces.yaml +17 -0
  50. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/insert_string_literal_into_date.yaml +17 -0
  51. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/integer_literal_arithmetic_is_int64.yaml +15 -0
  52. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/numeric_literal_keeps_precision.yaml +14 -0
  53. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/numeric_multiplication_keeps_scale_9.yaml +14 -0
  54. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/select_star_keeps_stored_case.yaml +17 -0
  55. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/sum_int64_is_int64.yaml +17 -0
  56. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/sum_int64_overflow_error.yaml +16 -0
  57. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/table_name_is_case_sensitive.yaml +17 -0
  58. crucible_emulator-0.1.0a2/corpus/bigquery/backbone/union_mismatched_columns.yaml +6 -0
  59. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_1e20_to_int64_error.yaml +14 -0
  60. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_0_1_to_numeric.yaml +14 -0
  61. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_1e30_to_numeric_error.yaml +15 -0
  62. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_halfway_to_int64_column.yaml +20 -0
  63. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_halfway_to_int64_literals.yaml +24 -0
  64. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_to_int.yaml +14 -0
  65. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_float_to_numeric_rounds_nine_places.yaml +19 -0
  66. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_nan_to_int64_error.yaml +16 -0
  67. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_negative_float_to_int.yaml +15 -0
  68. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_numeric_0_1_to_float64.yaml +14 -0
  69. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_numeric_to_int64_rounding.yaml +16 -0
  70. crucible_emulator-0.1.0a2/corpus/bigquery/cast/cast_string_to_int.yaml +15 -0
  71. crucible_emulator-0.1.0a2/corpus/bigquery/cast/safe_cast_float.yaml +14 -0
  72. crucible_emulator-0.1.0a2/corpus/bigquery/cast/safe_cast_invalid_string.yaml +14 -0
  73. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_date_compact_error.yaml +15 -0
  74. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_date_iso.yaml +14 -0
  75. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_date_leading_space.yaml +14 -0
  76. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_date_one_digit_fields.yaml +14 -0
  77. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_date_with_time_error.yaml +15 -0
  78. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_comma_error.yaml +15 -0
  79. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_decimal.yaml +14 -0
  80. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_empty_error.yaml +15 -0
  81. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_exponent.yaml +14 -0
  82. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_hex_error.yaml +15 -0
  83. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_inf.yaml +14 -0
  84. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_nan.yaml +14 -0
  85. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_neg_inf.yaml +14 -0
  86. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_float_padded_spaces.yaml +14 -0
  87. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_30_digits_error.yaml +14 -0
  88. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_decimal.yaml +14 -0
  89. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_exponent.yaml +15 -0
  90. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_nan_error.yaml +15 -0
  91. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_round_nine_places.yaml +15 -0
  92. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_numeric_round_nine_places_negative.yaml +15 -0
  93. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_parse_date_compact.yaml +14 -0
  94. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_parse_date_invalid_day_error.yaml +15 -0
  95. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_parse_date_year_month.yaml +15 -0
  96. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_date_only.yaml +14 -0
  97. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_fraction_six.yaml +15 -0
  98. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_no_zone.yaml +15 -0
  99. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_not_a_time_error.yaml +14 -0
  100. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_offset.yaml +14 -0
  101. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_one_digit_fields.yaml +14 -0
  102. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_seven_fraction_digits_error.yaml +14 -0
  103. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_t_separator.yaml +14 -0
  104. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_utc_name.yaml +14 -0
  105. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_z_suffix.yaml +14 -0
  106. crucible_emulator-0.1.0a2/corpus/bigquery/cast_string/cast_string_timestamp_zone_name.yaml +15 -0
  107. crucible_emulator-0.1.0a2/corpus/bigquery/conditional/greatest_null.yaml +14 -0
  108. crucible_emulator-0.1.0a2/corpus/bigquery/conditional/if_null_condition.yaml +14 -0
  109. crucible_emulator-0.1.0a2/corpus/bigquery/conditional/is_distinct_from_null.yaml +15 -0
  110. crucible_emulator-0.1.0a2/corpus/bigquery/conditional/least_null.yaml +14 -0
  111. crucible_emulator-0.1.0a2/corpus/bigquery/conditional/nullif.yaml +14 -0
  112. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_add_month_end.yaml +15 -0
  113. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_diff_day.yaml +14 -0
  114. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_diff_month.yaml +14 -0
  115. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_diff_year.yaml +15 -0
  116. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_from_parts.yaml +14 -0
  117. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_from_timestamp.yaml +15 -0
  118. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_sub_month_end.yaml +15 -0
  119. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_trunc_month.yaml +14 -0
  120. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/date_trunc_week.yaml +15 -0
  121. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/datetime_diff_day_across_midnight.yaml +15 -0
  122. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/datetime_from_timestamp.yaml +14 -0
  123. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/datetime_sub_day.yaml +14 -0
  124. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/extract_dayofweek.yaml +14 -0
  125. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/extract_week_sunday_start.yaml +15 -0
  126. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/format_date.yaml +14 -0
  127. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/format_date_space_padded_day.yaml +15 -0
  128. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/generate_date_array.yaml +18 -0
  129. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/parse_date.yaml +14 -0
  130. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/safe_parse_timestamp_array_element.yaml +15 -0
  131. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/timestamp_add_minute.yaml +15 -0
  132. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/timestamp_diff_day.yaml +16 -0
  133. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/timestamp_diff_hour.yaml +15 -0
  134. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/timestamp_from_string.yaml +14 -0
  135. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/timestamp_sub_hour.yaml +15 -0
  136. crucible_emulator-0.1.0a2/corpus/bigquery/date_time/unix_seconds_array_element.yaml +14 -0
  137. crucible_emulator-0.1.0a2/corpus/bigquery/errors/array_with_null_element_in_result.yaml +14 -0
  138. crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_empty_string_to_int64.yaml +13 -0
  139. crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_string_to_int64_exponent.yaml +14 -0
  140. crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_string_to_int64_hex.yaml +14 -0
  141. crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_string_to_int64_negative_hex.yaml +15 -0
  142. crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_string_to_int64_plus_sign.yaml +15 -0
  143. crucible_emulator-0.1.0a2/corpus/bigquery/errors/cast_string_to_int64_whitespace.yaml +14 -0
  144. crucible_emulator-0.1.0a2/corpus/bigquery/errors/div_by_zero_error.yaml +13 -0
  145. crucible_emulator-0.1.0a2/corpus/bigquery/errors/division_by_zero_from_data.yaml +16 -0
  146. crucible_emulator-0.1.0a2/corpus/bigquery/errors/ieee_divide_by_zero.yaml +15 -0
  147. crucible_emulator-0.1.0a2/corpus/bigquery/errors/int64_multiplication_overflow.yaml +14 -0
  148. crucible_emulator-0.1.0a2/corpus/bigquery/errors/mod_by_zero_error.yaml +13 -0
  149. crucible_emulator-0.1.0a2/corpus/bigquery/errors/null_array_in_result_is_empty.yaml +14 -0
  150. crucible_emulator-0.1.0a2/corpus/bigquery/errors/null_array_in_struct_is_empty.yaml +14 -0
  151. crucible_emulator-0.1.0a2/corpus/bigquery/errors/null_array_length_is_null.yaml +14 -0
  152. crucible_emulator-0.1.0a2/corpus/bigquery/errors/offset_negative.yaml +13 -0
  153. crucible_emulator-0.1.0a2/corpus/bigquery/errors/ordinal_out_of_range.yaml +13 -0
  154. crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_cast_string_with_fraction_to_int64.yaml +15 -0
  155. crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_divide_by_zero_with_data.yaml +19 -0
  156. crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_ordinal_out_of_range.yaml +14 -0
  157. crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_parse_json_valid.yaml +14 -0
  158. crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_prefix_keeps_argument_error.yaml +14 -0
  159. crucible_emulator-0.1.0a2/corpus/bigquery/errors/safe_prefix_suppresses_function_error.yaml +14 -0
  160. crucible_emulator-0.1.0a2/corpus/bigquery/hash/farm_fingerprint.yaml +15 -0
  161. crucible_emulator-0.1.0a2/corpus/bigquery/hash/to_hex_md5.yaml +15 -0
  162. crucible_emulator-0.1.0a2/corpus/bigquery/hash/to_hex_sha256.yaml +15 -0
  163. crucible_emulator-0.1.0a2/corpus/bigquery/json/json_extract_array.yaml +16 -0
  164. crucible_emulator-0.1.0a2/corpus/bigquery/json/json_query_array.yaml +15 -0
  165. crucible_emulator-0.1.0a2/corpus/bigquery/json/json_type_all_kinds.yaml +31 -0
  166. crucible_emulator-0.1.0a2/corpus/bigquery/json/json_type_array.yaml +14 -0
  167. crucible_emulator-0.1.0a2/corpus/bigquery/json/json_type_number.yaml +14 -0
  168. crucible_emulator-0.1.0a2/corpus/bigquery/json/json_value_array.yaml +16 -0
  169. crucible_emulator-0.1.0a2/corpus/bigquery/json/json_value_number.yaml +15 -0
  170. crucible_emulator-0.1.0a2/corpus/bigquery/json/json_value_object.yaml +15 -0
  171. crucible_emulator-0.1.0a2/corpus/bigquery/json/json_value_string.yaml +14 -0
  172. crucible_emulator-0.1.0a2/corpus/bigquery/json/parse_json.yaml +15 -0
  173. crucible_emulator-0.1.0a2/corpus/bigquery/json/safe_parse_json.yaml +15 -0
  174. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string.yaml +15 -0
  175. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_bytes.yaml +15 -0
  176. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_datetime.yaml +15 -0
  177. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_datetime_fraction_000001.yaml +17 -0
  178. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_datetime_fraction_123.yaml +17 -0
  179. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_datetime_fraction_123456.yaml +17 -0
  180. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_datetime_fraction_none.yaml +16 -0
  181. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_float_whole.yaml +15 -0
  182. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_nan_infinity.yaml +17 -0
  183. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_null.yaml +16 -0
  184. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_numeric.yaml +15 -0
  185. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_numeric_integer.yaml +16 -0
  186. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_numeric_large.yaml +16 -0
  187. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_numeric_tiny.yaml +16 -0
  188. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_struct_field_case.yaml +21 -0
  189. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time.yaml +15 -0
  190. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time_fraction_000001.yaml +15 -0
  191. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time_fraction_123.yaml +15 -0
  192. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time_fraction_123456.yaml +15 -0
  193. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time_fraction_5.yaml +15 -0
  194. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_time_fraction_none.yaml +15 -0
  195. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_timestamp.yaml +17 -0
  196. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_timestamp_fraction.yaml +17 -0
  197. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_timestamp_fraction_000001.yaml +16 -0
  198. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_timestamp_fraction_123.yaml +16 -0
  199. crucible_emulator-0.1.0a2/corpus/bigquery/json/to_json_string_timestamp_fraction_123456.yaml +16 -0
  200. crucible_emulator-0.1.0a2/corpus/bigquery/math/abs.yaml +14 -0
  201. crucible_emulator-0.1.0a2/corpus/bigquery/math/divide_by_zero_error.yaml +14 -0
  202. crucible_emulator-0.1.0a2/corpus/bigquery/math/divide_integers.yaml +14 -0
  203. crucible_emulator-0.1.0a2/corpus/bigquery/math/power.yaml +14 -0
  204. crucible_emulator-0.1.0a2/corpus/bigquery/math/round_half.yaml +15 -0
  205. crucible_emulator-0.1.0a2/corpus/bigquery/math/round_negative_half.yaml +14 -0
  206. crucible_emulator-0.1.0a2/corpus/bigquery/math/round_numeric.yaml +15 -0
  207. crucible_emulator-0.1.0a2/corpus/bigquery/math/safe_divide_by_zero.yaml +14 -0
  208. crucible_emulator-0.1.0a2/corpus/bigquery/ordering/null_ordering_asc.yaml +16 -0
  209. crucible_emulator-0.1.0a2/corpus/bigquery/ordering/null_ordering_desc.yaml +16 -0
  210. crucible_emulator-0.1.0a2/corpus/bigquery/regexp/parse_date_of_regexp_extract_group.yaml +19 -0
  211. crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_contains.yaml +14 -0
  212. crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_extract.yaml +14 -0
  213. crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_extract_all.yaml +16 -0
  214. crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_extract_empty_match.yaml +15 -0
  215. crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_extract_group.yaml +15 -0
  216. crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_extract_no_match.yaml +14 -0
  217. crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_replace_all.yaml +14 -0
  218. crucible_emulator-0.1.0a2/corpus/bigquery/regexp/regexp_replace_backreference.yaml +14 -0
  219. crucible_emulator-0.1.0a2/corpus/bigquery/statements/alter_table_add_column_if_not_exists.yaml +23 -0
  220. crucible_emulator-0.1.0a2/corpus/bigquery/statements/alter_table_set_options.yaml +18 -0
  221. crucible_emulator-0.1.0a2/corpus/bigquery/statements/ctas_month_partition.yaml +17 -0
  222. crucible_emulator-0.1.0a2/corpus/bigquery/statements/ctas_partition_cluster_options.yaml +24 -0
  223. crucible_emulator-0.1.0a2/corpus/bigquery/statements/ctas_range_bucket_partition.yaml +18 -0
  224. crucible_emulator-0.1.0a2/corpus/bigquery/statements/drop_table_then_select.yaml +16 -0
  225. crucible_emulator-0.1.0a2/corpus/bigquery/statements/insert_int64_array_into_float64_array.yaml +17 -0
  226. crucible_emulator-0.1.0a2/corpus/bigquery/statements/leading_json_comment.yaml +16 -0
  227. crucible_emulator-0.1.0a2/corpus/bigquery/statements/merge_duplicate_source_match_error.yaml +20 -0
  228. crucible_emulator-0.1.0a2/corpus/bigquery/statements/merge_keyed_updates_and_inserts.yaml +28 -0
  229. crucible_emulator-0.1.0a2/corpus/bigquery/statements/merge_on_false_inserts.yaml +28 -0
  230. crucible_emulator-0.1.0a2/corpus/bigquery/statements/view_with_options.yaml +16 -0
  231. crucible_emulator-0.1.0a2/corpus/bigquery/string/concat_null.yaml +14 -0
  232. crucible_emulator-0.1.0a2/corpus/bigquery/string/concat_operator_null.yaml +14 -0
  233. crucible_emulator-0.1.0a2/corpus/bigquery/string/format.yaml +14 -0
  234. crucible_emulator-0.1.0a2/corpus/bigquery/string/format_float_two_places.yaml +14 -0
  235. crucible_emulator-0.1.0a2/corpus/bigquery/string/format_integer_and_string.yaml +18 -0
  236. crucible_emulator-0.1.0a2/corpus/bigquery/string/format_null_argument.yaml +14 -0
  237. crucible_emulator-0.1.0a2/corpus/bigquery/string/initcap.yaml +15 -0
  238. crucible_emulator-0.1.0a2/corpus/bigquery/string/initcap_delimiters_array_element.yaml +14 -0
  239. crucible_emulator-0.1.0a2/corpus/bigquery/string/length.yaml +14 -0
  240. crucible_emulator-0.1.0a2/corpus/bigquery/string/lower.yaml +15 -0
  241. crucible_emulator-0.1.0a2/corpus/bigquery/string/lower_dotted_capital_i.yaml +14 -0
  242. crucible_emulator-0.1.0a2/corpus/bigquery/string/split.yaml +17 -0
  243. crucible_emulator-0.1.0a2/corpus/bigquery/string/split_empty_string.yaml +14 -0
  244. crucible_emulator-0.1.0a2/corpus/bigquery/string/starts_with.yaml +14 -0
  245. crucible_emulator-0.1.0a2/corpus/bigquery/string/string_compare_collation.yaml +15 -0
  246. crucible_emulator-0.1.0a2/corpus/bigquery/string/substr.yaml +14 -0
  247. crucible_emulator-0.1.0a2/corpus/bigquery/string/substr_negative_position.yaml +14 -0
  248. crucible_emulator-0.1.0a2/corpus/bigquery/string/to_hex.yaml +14 -0
  249. crucible_emulator-0.1.0a2/corpus/bigquery/string/trim.yaml +14 -0
  250. crucible_emulator-0.1.0a2/corpus/bigquery/string/trim_characters.yaml +15 -0
  251. crucible_emulator-0.1.0a2/corpus/bigquery/string/upper.yaml +15 -0
  252. crucible_emulator-0.1.0a2/corpus/bigquery/syntax/in_unnest.yaml +14 -0
  253. crucible_emulator-0.1.0a2/corpus/bigquery/syntax/qualify.yaml +15 -0
  254. crucible_emulator-0.1.0a2/corpus/bigquery/syntax/reserved_keyword_alias_error.yaml +15 -0
  255. crucible_emulator-0.1.0a2/corpus/bigquery/syntax/scalar_subquery_unaliased.yaml +14 -0
  256. crucible_emulator-0.1.0a2/corpus/bigquery/syntax/select_star_except.yaml +14 -0
  257. crucible_emulator-0.1.0a2/corpus/bigquery/syntax/select_star_replace.yaml +18 -0
  258. crucible_emulator-0.1.0a2/corpus/bigquery/syntax/unnest_struct_no_alias.yaml +15 -0
  259. crucible_emulator-0.1.0a2/corpus/bigquery/syntax/unnest_with_offset.yaml +20 -0
  260. crucible_emulator-0.1.0a2/corpus/bigquery/unnest/unnest_alias_wins_over_joined_column.yaml +33 -0
  261. crucible_emulator-0.1.0a2/corpus/bigquery/unnest/unnest_offset_without_alias.yaml +15 -0
  262. crucible_emulator-0.1.0a2/corpus/bigquery/unnest/unnest_struct_array_aliased.yaml +28 -0
  263. crucible_emulator-0.1.0a2/corpus/bigquery/unnest/unnest_struct_array_cross_join.yaml +28 -0
  264. crucible_emulator-0.1.0a2/corpus/bigquery/unnest/unnest_with_offset_from_data.yaml +23 -0
  265. crucible_emulator-0.1.0a2/corpus/bigquery/window/lag.yaml +15 -0
  266. crucible_emulator-0.1.0a2/corpus/bigquery/window/last_value_ignore_nulls.yaml +18 -0
  267. crucible_emulator-0.1.0a2/docker/Dockerfile +45 -0
  268. crucible_emulator-0.1.0a2/docs/adr/0001-one-dialect-per-process.md +22 -0
  269. crucible_emulator-0.1.0a2/docs/adr/0002-namespace-mapping.md +35 -0
  270. crucible_emulator-0.1.0a2/docs/adr/0003-concurrency-and-transactions.md +25 -0
  271. crucible_emulator-0.1.0a2/docs/adr/0004-bigquery-jobs-synchronous.md +31 -0
  272. crucible_emulator-0.1.0a2/docs/adr/0005-storage-and-admin.md +18 -0
  273. crucible_emulator-0.1.0a2/docs/adr/0006-security-hardening.md +29 -0
  274. crucible_emulator-0.1.0a2/docs/adr/0007-starlette-not-fastapi.md +20 -0
  275. crucible_emulator-0.1.0a2/docs/adr/0008-sqlglot-pinning-and-dialect-generators.md +33 -0
  276. crucible_emulator-0.1.0a2/docs/adr/0009-unsupported-constructs-raise.md +18 -0
  277. crucible_emulator-0.1.0a2/docs/adr/0010-schema-aware-translation.md +34 -0
  278. crucible_emulator-0.1.0a2/docs/adr/0011-runtime-error-parity.md +49 -0
  279. crucible_emulator-0.1.0a2/docs/adr/0012-timezones.md +33 -0
  280. crucible_emulator-0.1.0a2/docs/adr/0013-corpus-format-and-recording.md +79 -0
  281. crucible_emulator-0.1.0a2/docs/adr/0014-type-mapping-and-canonical-values.md +82 -0
  282. crucible_emulator-0.1.0a2/docs/architecture.md +203 -0
  283. crucible_emulator-0.1.0a2/docs/client-compat.md +747 -0
  284. crucible_emulator-0.1.0a2/examples/dbt-bigquery/.gitignore +1 -0
  285. crucible_emulator-0.1.0a2/examples/dbt-bigquery/README.md +50 -0
  286. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/.gitignore +4 -0
  287. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/.user.yml +1 -0
  288. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/README.md +7 -0
  289. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/dbt_project.yml +32 -0
  290. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/macros/cents_to_dollars.sql +3 -0
  291. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/customers.sql +18 -0
  292. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/customers.yml +31 -0
  293. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/orders.sql +23 -0
  294. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/orders.yml +7 -0
  295. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/products.sql +22 -0
  296. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/marts/products.yml +7 -0
  297. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_customers.sql +6 -0
  298. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_customers.yml +7 -0
  299. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_order_items.sql +6 -0
  300. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_order_items.yml +19 -0
  301. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_orders.sql +8 -0
  302. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_orders.yml +18 -0
  303. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_products.sql +7 -0
  304. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/models/staging/stg_products.yml +18 -0
  305. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/profiles.yml +12 -0
  306. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/seeds/raw_customers.csv +13 -0
  307. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/seeds/raw_order_items.csv +47 -0
  308. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/seeds/raw_orders.csv +25 -0
  309. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/seeds/raw_products.csv +7 -0
  310. crucible_emulator-0.1.0a2/examples/dbt-bigquery/corner_cafe/tests/order_totals_are_not_negative.sql +4 -0
  311. crucible_emulator-0.1.0a2/examples/dbt-bigquery/requirements.txt +2 -0
  312. crucible_emulator-0.1.0a2/examples/python-bigquery/01_basic_query.py +55 -0
  313. crucible_emulator-0.1.0a2/examples/python-bigquery/02_tables.py +67 -0
  314. crucible_emulator-0.1.0a2/examples/python-bigquery/03_load_csv.py +72 -0
  315. crucible_emulator-0.1.0a2/examples/python-bigquery/04_errors.py +51 -0
  316. crucible_emulator-0.1.0a2/examples/python-bigquery/README.md +36 -0
  317. crucible_emulator-0.1.0a2/examples/python-bigquery/requirements.txt +1 -0
  318. crucible_emulator-0.1.0a2/pyproject.toml +101 -0
  319. crucible_emulator-0.1.0a2/scripts/check-corpus-verified.sh +11 -0
  320. crucible_emulator-0.1.0a2/src/crucible/__init__.py +5 -0
  321. crucible_emulator-0.1.0a2/src/crucible/cli.py +102 -0
  322. crucible_emulator-0.1.0a2/src/crucible/corpus/__init__.py +0 -0
  323. crucible_emulator-0.1.0a2/src/crucible/corpus/case.py +212 -0
  324. crucible_emulator-0.1.0a2/src/crucible/corpus/cli.py +175 -0
  325. crucible_emulator-0.1.0a2/src/crucible/corpus/record.py +230 -0
  326. crucible_emulator-0.1.0a2/src/crucible/corpus/record_api.py +645 -0
  327. crucible_emulator-0.1.0a2/src/crucible/corpus/runner.py +159 -0
  328. crucible_emulator-0.1.0a2/src/crucible/dialects/__init__.py +23 -0
  329. crucible_emulator-0.1.0a2/src/crucible/dialects/base.py +45 -0
  330. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/__init__.py +0 -0
  331. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/ddl.py +339 -0
  332. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/dialect.py +37 -0
  333. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/dml.py +203 -0
  334. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/errors.py +39 -0
  335. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/generator.py +136 -0
  336. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/keywords.py +106 -0
  337. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/metadata.py +96 -0
  338. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/statements.py +212 -0
  339. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/__init__.py +57 -0
  340. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/arrays.py +14 -0
  341. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/common.py +84 -0
  342. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/dates.py +279 -0
  343. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/errors.py +330 -0
  344. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/json.py +302 -0
  345. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/literals.py +74 -0
  346. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/regexp.py +72 -0
  347. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/safe.py +70 -0
  348. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/strings.py +258 -0
  349. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/transforms/unnest.py +153 -0
  350. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/translate.py +347 -0
  351. crucible_emulator-0.1.0a2/src/crucible/dialects/bigquery/types.py +278 -0
  352. crucible_emulator-0.1.0a2/src/crucible/dialects/snowflake/__init__.py +0 -0
  353. crucible_emulator-0.1.0a2/src/crucible/engine/__init__.py +24 -0
  354. crucible_emulator-0.1.0a2/src/crucible/engine/catalog.py +156 -0
  355. crucible_emulator-0.1.0a2/src/crucible/engine/engine.py +129 -0
  356. crucible_emulator-0.1.0a2/src/crucible/engine/errors.py +99 -0
  357. crucible_emulator-0.1.0a2/src/crucible/engine/pipeline.py +131 -0
  358. crucible_emulator-0.1.0a2/src/crucible/engine/session.py +24 -0
  359. crucible_emulator-0.1.0a2/src/crucible/engine/types.py +26 -0
  360. crucible_emulator-0.1.0a2/src/crucible/py.typed +0 -0
  361. crucible_emulator-0.1.0a2/src/crucible/server/__init__.py +0 -0
  362. crucible_emulator-0.1.0a2/src/crucible/server/app.py +61 -0
  363. crucible_emulator-0.1.0a2/src/crucible/server/bigquery/__init__.py +0 -0
  364. crucible_emulator-0.1.0a2/src/crucible/server/bigquery/app.py +1058 -0
  365. crucible_emulator-0.1.0a2/src/crucible/server/bigquery/encoding.py +225 -0
  366. crucible_emulator-0.1.0a2/src/crucible/server/bigquery/errors.py +83 -0
  367. crucible_emulator-0.1.0a2/src/crucible/server/bigquery/jobs.py +375 -0
  368. crucible_emulator-0.1.0a2/src/crucible/server/bigquery/load.py +390 -0
  369. crucible_emulator-0.1.0a2/src/crucible/server/snowflake/__init__.py +0 -0
  370. crucible_emulator-0.1.0a2/src/crucible/server/snowflake/app.py +48 -0
  371. crucible_emulator-0.1.0a2/tests/__init__.py +0 -0
  372. crucible_emulator-0.1.0a2/tests/clients/test_bigquery_client.py +261 -0
  373. crucible_emulator-0.1.0a2/tests/corpus/test_corpus.py +43 -0
  374. crucible_emulator-0.1.0a2/tests/corpus/test_corpus_wire.py +77 -0
  375. crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/dbt_project.yml +9 -0
  376. crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/models/customer_signups.sql +4 -0
  377. crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/models/schema.yml +40 -0
  378. crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/models/vip_customers.sql +5 -0
  379. crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/models/vip_summary.sql +4 -0
  380. crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/profiles.yml +14 -0
  381. crucible_emulator-0.1.0a2/tests/dbt/bigquery_smoke/seeds/customers.csv +7 -0
  382. crucible_emulator-0.1.0a2/tests/dbt/test_dbt_bigquery.py +91 -0
  383. crucible_emulator-0.1.0a2/tests/fakes.py +41 -0
  384. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/00_datasets_insert.json +57 -0
  385. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/01_jobs_insert_ctas.json +74 -0
  386. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/02_jobs_get_ctas.json +394 -0
  387. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/03_jobs_insert_select.json +264 -0
  388. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/04_jobs_get_select.json +247 -0
  389. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/05_get_query_results.json +340 -0
  390. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/06_get_query_results_int64_timestamp.json +342 -0
  391. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/07_get_query_results_page_1.json +226 -0
  392. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/08_get_query_results_page_2.json +191 -0
  393. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/09_get_query_results_start_index.json +202 -0
  394. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/100_load_float_inf_nan_initiate.json +65 -0
  395. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/101_load_float_inf_nan_upload.json +81 -0
  396. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/102_load_float_inf_nan_jobs_get.json +101 -0
  397. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/103_load_float_inf_nan_select_insert.json +183 -0
  398. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/104_load_float_inf_nan_query_results.json +116 -0
  399. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/105_load_bad_value_initiate.json +65 -0
  400. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/106_load_bad_value_upload.json +81 -0
  401. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/107_load_bad_value_jobs_get.json +97 -0
  402. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/108_load_bad_value_select_insert.json +78 -0
  403. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/109_load_bool_upper_initiate.json +65 -0
  404. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/10_get_query_results_wait.json +137 -0
  405. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/110_load_bool_upper_upload.json +81 -0
  406. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/111_load_bool_upper_jobs_get.json +101 -0
  407. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/112_load_bool_upper_select_insert.json +190 -0
  408. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/113_load_bool_upper_query_results.json +91 -0
  409. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/114_load_bool_title_true_initiate.json +65 -0
  410. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/115_load_bool_title_true_upload.json +81 -0
  411. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/116_load_bool_title_true_jobs_get.json +109 -0
  412. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/117_load_bool_title_true_select_insert.json +183 -0
  413. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/118_load_bool_title_true_query_results.json +91 -0
  414. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/119_load_int_negative_initiate.json +65 -0
  415. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/11_jobs_query.json +71 -0
  416. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/120_load_int_negative_upload.json +81 -0
  417. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/121_load_int_negative_jobs_get.json +101 -0
  418. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/122_load_int_negative_select_insert.json +183 -0
  419. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/123_load_int_negative_query_results.json +91 -0
  420. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/124_load_int_plus_initiate.json +65 -0
  421. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/125_load_int_plus_upload.json +81 -0
  422. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/126_load_int_plus_jobs_get.json +101 -0
  423. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/127_load_int_plus_select_insert.json +183 -0
  424. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/128_load_int_plus_query_results.json +91 -0
  425. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/129_load_int_quoted_initiate.json +65 -0
  426. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/12_jobs_query_job_creation_optional.json +63 -0
  427. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/130_load_int_quoted_upload.json +81 -0
  428. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/131_load_int_quoted_jobs_get.json +109 -0
  429. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/132_load_int_quoted_select_insert.json +190 -0
  430. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/133_load_int_quoted_query_results.json +91 -0
  431. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/134_load_ts_t_no_z_initiate.json +65 -0
  432. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/135_load_ts_t_no_z_upload.json +81 -0
  433. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/136_load_ts_t_no_z_jobs_get.json +101 -0
  434. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/137_load_ts_t_no_z_select_insert.json +183 -0
  435. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/138_load_ts_t_no_z_query_results.json +91 -0
  436. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/139_load_ts_fraction_3_initiate.json +65 -0
  437. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/13_tables_get.json +125 -0
  438. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/140_load_ts_fraction_3_upload.json +81 -0
  439. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/141_load_ts_fraction_3_jobs_get.json +101 -0
  440. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/142_load_ts_fraction_3_select_insert.json +183 -0
  441. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/143_load_ts_fraction_3_query_results.json +91 -0
  442. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/144_load_date_invalid_initiate.json +65 -0
  443. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/145_load_date_invalid_upload.json +81 -0
  444. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/146_load_date_invalid_jobs_get.json +98 -0
  445. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/147_load_date_invalid_select_insert.json +78 -0
  446. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/148_load_numeric_many_digits_initiate.json +65 -0
  447. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/149_load_numeric_many_digits_upload.json +81 -0
  448. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/14_tables_get_anonymous.json +142 -0
  449. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/150_load_numeric_many_digits_jobs_get.json +97 -0
  450. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/151_load_numeric_many_digits_select_insert.json +78 -0
  451. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/152_load_string_escaped_quote_initiate.json +65 -0
  452. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/153_load_string_escaped_quote_upload.json +81 -0
  453. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/154_load_string_escaped_quote_jobs_get.json +109 -0
  454. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/155_load_string_escaped_quote_select_insert.json +183 -0
  455. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/156_load_string_escaped_quote_query_results.json +91 -0
  456. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/157_load_crlf_initiate.json +65 -0
  457. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/158_load_crlf_upload.json +81 -0
  458. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/159_load_crlf_jobs_get.json +101 -0
  459. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/15_tables_list.json +31 -0
  460. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/160_load_crlf_select_insert.json +183 -0
  461. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/161_load_crlf_query_results.json +91 -0
  462. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/162_tables_patch_add_column.json +225 -0
  463. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/163_jobs_insert_runtime_error.json +101 -0
  464. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/164_jobs_get_runtime_error.json +84 -0
  465. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/165_get_query_results_runtime_error.json +28 -0
  466. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/166_jobs_query_syntax_error.json +37 -0
  467. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/167_tables_get_not_found.json +26 -0
  468. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/168_jobs_insert_conflict.json +43 -0
  469. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/169_datasets_insert_conflict.json +31 -0
  470. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/16_datasets_get.json +49 -0
  471. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/170_jobs_insert_partitioned_day.json +74 -0
  472. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/171_tables_get_partitioned_day.json +67 -0
  473. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/172_jobs_insert_partitioned_hour.json +74 -0
  474. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/173_tables_get_partitioned_hour.json +53 -0
  475. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/174_jobs_insert_partitioned_month.json +74 -0
  476. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/175_tables_get_partitioned_month.json +53 -0
  477. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/176_jobs_insert_partitioned_range.json +74 -0
  478. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/177_tables_get_partitioned_range.json +57 -0
  479. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/178_tables_list_partitioned.json +381 -0
  480. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/179_tables_delete.json +13 -0
  481. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/17_datasets_list.json +33 -0
  482. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/18_routines_list.json +13 -0
  483. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/19_tabledata_list.json +224 -0
  484. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/20_tabledata_list_page_1.json +110 -0
  485. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/21_tabledata_list_page_2.json +75 -0
  486. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/22_tabledata_list_start_index.json +86 -0
  487. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/23_tabledata_list_int64_timestamp.json +226 -0
  488. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/24_tabledata_list_anonymous.json +224 -0
  489. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/25_jobs_insert_dml.json +74 -0
  490. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/26_jobs_get_dml.json +278 -0
  491. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/27_load_baseline_initiate.json +65 -0
  492. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/28_load_baseline_upload.json +81 -0
  493. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/29_load_baseline_jobs_get.json +101 -0
  494. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/30_load_baseline_select_insert.json +183 -0
  495. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/31_load_baseline_query_results.json +116 -0
  496. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/32_load_empty_fields_initiate.json +65 -0
  497. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/33_load_empty_fields_upload.json +81 -0
  498. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/34_load_empty_fields_jobs_get.json +101 -0
  499. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/35_load_empty_fields_select_insert.json +183 -0
  500. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/36_load_empty_fields_query_results.json +116 -0
  501. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/37_load_bool_t_initiate.json +65 -0
  502. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/38_load_bool_t_upload.json +81 -0
  503. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/39_load_bool_t_jobs_get.json +101 -0
  504. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/40_load_bool_t_select_insert.json +183 -0
  505. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/41_load_bool_t_query_results.json +91 -0
  506. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/42_load_bool_1_initiate.json +65 -0
  507. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/43_load_bool_1_upload.json +81 -0
  508. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/44_load_bool_1_jobs_get.json +101 -0
  509. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/45_load_bool_1_select_insert.json +183 -0
  510. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/46_load_bool_1_query_results.json +91 -0
  511. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/47_load_bool_yes_initiate.json +65 -0
  512. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/48_load_bool_yes_upload.json +81 -0
  513. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/49_load_bool_yes_jobs_get.json +110 -0
  514. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/50_load_bool_yes_select_insert.json +190 -0
  515. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/51_load_bool_yes_query_results.json +91 -0
  516. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/52_load_bool_mixed_case_initiate.json +65 -0
  517. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/53_load_bool_mixed_case_upload.json +81 -0
  518. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/54_load_bool_mixed_case_jobs_get.json +101 -0
  519. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/55_load_bool_mixed_case_select_insert.json +183 -0
  520. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/56_load_bool_mixed_case_query_results.json +91 -0
  521. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/57_load_ts_t_z_initiate.json +65 -0
  522. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/58_load_ts_t_z_upload.json +81 -0
  523. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/59_load_ts_t_z_jobs_get.json +110 -0
  524. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/60_load_ts_t_z_select_insert.json +183 -0
  525. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/61_load_ts_t_z_query_results.json +91 -0
  526. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/62_load_ts_utc_suffix_initiate.json +65 -0
  527. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/63_load_ts_utc_suffix_upload.json +81 -0
  528. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/64_load_ts_utc_suffix_jobs_get.json +111 -0
  529. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/65_load_ts_utc_suffix_select_insert.json +183 -0
  530. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/66_load_ts_utc_suffix_query_results.json +91 -0
  531. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/67_load_ts_offset_initiate.json +65 -0
  532. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/68_load_ts_offset_upload.json +81 -0
  533. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/69_load_ts_offset_jobs_get.json +120 -0
  534. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/70_load_ts_offset_select_insert.json +183 -0
  535. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/71_load_ts_offset_query_results.json +91 -0
  536. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/72_load_ts_epoch_initiate.json +65 -0
  537. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/73_load_ts_epoch_upload.json +81 -0
  538. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/74_load_ts_epoch_jobs_get.json +109 -0
  539. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/75_load_ts_epoch_select_insert.json +183 -0
  540. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/76_load_ts_epoch_query_results.json +91 -0
  541. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/77_load_ts_date_only_initiate.json +65 -0
  542. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/78_load_ts_date_only_upload.json +81 -0
  543. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/79_load_ts_date_only_jobs_get.json +97 -0
  544. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/80_load_ts_date_only_select_insert.json +78 -0
  545. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/81_load_ts_slashes_initiate.json +65 -0
  546. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/82_load_ts_slashes_upload.json +81 -0
  547. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/83_load_ts_slashes_jobs_get.json +110 -0
  548. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/84_load_ts_slashes_select_insert.json +183 -0
  549. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/85_load_ts_slashes_query_results.json +91 -0
  550. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/86_load_date_one_digit_initiate.json +65 -0
  551. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/87_load_date_one_digit_upload.json +81 -0
  552. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/88_load_date_one_digit_jobs_get.json +101 -0
  553. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/89_load_date_one_digit_select_insert.json +183 -0
  554. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/90_load_date_one_digit_query_results.json +91 -0
  555. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/91_load_date_slashes_initiate.json +65 -0
  556. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/92_load_date_slashes_upload.json +81 -0
  557. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/93_load_date_slashes_jobs_get.json +98 -0
  558. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/94_load_date_slashes_select_insert.json +78 -0
  559. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/95_load_numeric_exponent_initiate.json +65 -0
  560. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/96_load_numeric_exponent_upload.json +81 -0
  561. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/97_load_numeric_exponent_jobs_get.json +101 -0
  562. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/98_load_numeric_exponent_select_insert.json +183 -0
  563. crucible_emulator-0.1.0a2/tests/fixtures/bigquery_api/99_load_numeric_exponent_query_results.json +91 -0
  564. crucible_emulator-0.1.0a2/tests/unit/__init__.py +0 -0
  565. crucible_emulator-0.1.0a2/tests/unit/bigquery.py +41 -0
  566. crucible_emulator-0.1.0a2/tests/unit/conftest.py +11 -0
  567. crucible_emulator-0.1.0a2/tests/unit/redaction_samples/00_jobs_insert.json +46 -0
  568. crucible_emulator-0.1.0a2/tests/unit/test_bigquery_backbone.py +306 -0
  569. crucible_emulator-0.1.0a2/tests/unit/test_bigquery_fixtures.py +357 -0
  570. crucible_emulator-0.1.0a2/tests/unit/test_bigquery_job_lifecycle.py +236 -0
  571. crucible_emulator-0.1.0a2/tests/unit/test_bigquery_server.py +951 -0
  572. crucible_emulator-0.1.0a2/tests/unit/test_bq_arrays_unnest.py +161 -0
  573. crucible_emulator-0.1.0a2/tests/unit/test_bq_dates.py +265 -0
  574. crucible_emulator-0.1.0a2/tests/unit/test_bq_errors_and_safe.py +248 -0
  575. crucible_emulator-0.1.0a2/tests/unit/test_bq_json.py +88 -0
  576. crucible_emulator-0.1.0a2/tests/unit/test_bq_load_csv.py +319 -0
  577. crucible_emulator-0.1.0a2/tests/unit/test_bq_partitioning.py +66 -0
  578. crucible_emulator-0.1.0a2/tests/unit/test_bq_regexp.py +90 -0
  579. crucible_emulator-0.1.0a2/tests/unit/test_bq_statements.py +214 -0
  580. crucible_emulator-0.1.0a2/tests/unit/test_bq_strings.py +155 -0
  581. crucible_emulator-0.1.0a2/tests/unit/test_check_corpus_verified.py +59 -0
  582. crucible_emulator-0.1.0a2/tests/unit/test_corpus_case.py +196 -0
  583. crucible_emulator-0.1.0a2/tests/unit/test_corpus_record.py +444 -0
  584. crucible_emulator-0.1.0a2/tests/unit/test_corpus_runner.py +224 -0
  585. crucible_emulator-0.1.0a2/tests/unit/test_engine.py +220 -0
  586. crucible_emulator-0.1.0a2/tests/unit/test_fixture_redaction.py +207 -0
  587. crucible_emulator-0.1.0a2/tests/unit/test_record_api.py +298 -0
  588. crucible_emulator-0.1.0a2/tests/unit/test_release_workflow.py +34 -0
  589. crucible_emulator-0.1.0a2/tests/unit/test_server.py +61 -0
  590. crucible_emulator-0.1.0a2/uv.lock +1460 -0
@@ -0,0 +1,16 @@
1
+ .local
2
+ .venv
3
+ .git
4
+ .github
5
+ .claude
6
+ **/__pycache__
7
+ **/*.pyc
8
+ .pytest_cache
9
+ .ruff_cache
10
+ .mypy_cache
11
+ dist
12
+ build
13
+ **/*.egg-info
14
+ tests
15
+ corpus
16
+ examples
@@ -0,0 +1 @@
1
+ * @CallumWalterWhite
@@ -0,0 +1,43 @@
1
+ name: Bug report
2
+ description: Crucible returns a different result or error than real BigQuery, or crashes.
3
+ labels: ["bug"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Thanks for the report. Please do not include credentials, project IDs or private data.
9
+ For an "unsupported" error, use the "Unsupported feature" template instead.
10
+ - type: textarea
11
+ id: query
12
+ attributes:
13
+ label: Query or request
14
+ description: The smallest SQL (or API call) that shows the problem, with any CREATE TABLE / INSERT it needs.
15
+ render: sql
16
+ validations:
17
+ required: true
18
+ - type: textarea
19
+ id: bigquery
20
+ attributes:
21
+ label: What real BigQuery returns
22
+ description: Rows, types or the exact error message. Say if you have not checked against BigQuery.
23
+ validations:
24
+ required: true
25
+ - type: textarea
26
+ id: crucible
27
+ attributes:
28
+ label: What Crucible returns
29
+ description: Rows, types or the exact error message.
30
+ validations:
31
+ required: true
32
+ - type: input
33
+ id: version
34
+ attributes:
35
+ label: Crucible version
36
+ description: The Docker tag or `pip show crucible-emulator` version, or the commit if built from source.
37
+ validations:
38
+ required: true
39
+ - type: input
40
+ id: client
41
+ attributes:
42
+ label: Client and version
43
+ description: For example google-cloud-bigquery 3.46.1, dbt-core 1.12.6 with dbt-bigquery 1.12.1, or curl.
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Security vulnerability
4
+ url: https://github.com/CallumWalterWhite/crucible/blob/main/SECURITY.md
5
+ about: Report vulnerabilities privately as described in SECURITY.md, not in a public issue.
@@ -0,0 +1,33 @@
1
+ name: Unsupported feature
2
+ description: Crucible answers "Not supported by Crucible" for something you need.
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Please do not include credentials, project IDs or private data.
9
+ - type: input
10
+ id: message
11
+ attributes:
12
+ label: Error message
13
+ description: The full "Not supported by Crucible ..." message.
14
+ validations:
15
+ required: true
16
+ - type: textarea
17
+ id: query
18
+ attributes:
19
+ label: Query or request
20
+ description: The smallest SQL (or API call) that triggers it.
21
+ render: sql
22
+ validations:
23
+ required: true
24
+ - type: textarea
25
+ id: expected
26
+ attributes:
27
+ label: What real BigQuery returns
28
+ description: The rows or result you expect, if you know them.
29
+ - type: textarea
30
+ id: context
31
+ attributes:
32
+ label: Where you hit it
33
+ description: For example a dbt package or macro, a client method, or your own SQL.
@@ -0,0 +1,29 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "uv"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ groups:
8
+ minor-and-patch:
9
+ update-types:
10
+ - "minor"
11
+ - "patch"
12
+ - package-ecosystem: "github-actions"
13
+ directory: "/"
14
+ schedule:
15
+ interval: "weekly"
16
+ groups:
17
+ minor-and-patch:
18
+ update-types:
19
+ - "minor"
20
+ - "patch"
21
+ - package-ecosystem: "docker"
22
+ directory: "/docker"
23
+ schedule:
24
+ interval: "weekly"
25
+ groups:
26
+ minor-and-patch:
27
+ update-types:
28
+ - "minor"
29
+ - "patch"
@@ -0,0 +1,194 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_call:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ lint:
14
+ runs-on: ubuntu-24.04
15
+ steps:
16
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
17
+ with:
18
+ persist-credentials: false
19
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
20
+ - run: uv sync --locked --all-extras --group dev
21
+ - run: uv run ruff check
22
+ - run: uv run ruff format --check
23
+ - run: uv run pyright
24
+ - run: uv run lint-imports
25
+
26
+ corpus-guard:
27
+ if: github.event_name == 'pull_request'
28
+ runs-on: ubuntu-24.04
29
+ steps:
30
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
31
+ with:
32
+ persist-credentials: false
33
+ fetch-depth: 0
34
+ - name: Only corpus-record/ branches may set verified true (ADR 0013)
35
+ env:
36
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
37
+ HEAD_REF: ${{ github.head_ref }}
38
+ run: scripts/check-corpus-verified.sh "$BASE_SHA" "$HEAD_REF"
39
+
40
+ test:
41
+ runs-on: ubuntu-24.04
42
+ strategy:
43
+ fail-fast: false
44
+ matrix:
45
+ python: ["3.11", "3.12", "3.13"]
46
+ steps:
47
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
48
+ with:
49
+ persist-credentials: false
50
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
51
+ - run: uv sync --locked --all-extras --python ${{ matrix.python }}
52
+ - run: uv run pytest
53
+
54
+ docker:
55
+ runs-on: ubuntu-24.04
56
+ steps:
57
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
58
+ with:
59
+ persist-credentials: false
60
+ - uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
61
+ - name: Build image
62
+ uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
63
+ with:
64
+ context: .
65
+ file: docker/Dockerfile
66
+ tags: crucible:ci
67
+ load: true
68
+ push: false
69
+ - name: Start emulators and wait for health
70
+ run: |
71
+ wait_for_health() { # <container> <port>
72
+ for _ in $(seq 60); do
73
+ if curl -fsS --max-time 2 "http://127.0.0.1:$2/_crucible/health" >/dev/null; then
74
+ echo "$1 healthy on port $2"
75
+ return 0
76
+ fi
77
+ sleep 1
78
+ done
79
+ echo "$1 not healthy after 60s" >&2
80
+ docker logs "$1" >&2 || true
81
+ return 1
82
+ }
83
+ # The image sets CRUCIBLE_HOST=0.0.0.0, so the server listens on all container interfaces.
84
+ docker run -d --name crucible-bigquery -p 127.0.0.1:9050:9050 \
85
+ crucible:ci serve --dialect bigquery --port 9050
86
+ docker run -d --name crucible-snowflake -p 127.0.0.1:8080:8080 \
87
+ crucible:ci serve --dialect snowflake --port 8080
88
+ wait_for_health crucible-bigquery 9050
89
+ wait_for_health crucible-snowflake 8080
90
+
91
+ clients:
92
+ needs: docker
93
+ runs-on: ubuntu-24.04
94
+ strategy:
95
+ fail-fast: false
96
+ matrix:
97
+ include:
98
+ - dialect: bigquery
99
+ port: 9050
100
+ client: google-cloud-bigquery==3.27.0
101
+ - dialect: bigquery
102
+ port: 9050
103
+ client: google-cloud-bigquery
104
+ steps:
105
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
106
+ with:
107
+ persist-credentials: false
108
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
109
+ - uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
110
+ - name: Build image
111
+ uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
112
+ with:
113
+ context: .
114
+ file: docker/Dockerfile
115
+ tags: crucible:ci
116
+ load: true
117
+ push: false
118
+ - name: Start emulator and wait for health
119
+ env:
120
+ DIALECT: ${{ matrix.dialect }}
121
+ PORT: ${{ matrix.port }}
122
+ run: |
123
+ docker run -d --name crucible -p "127.0.0.1:${PORT}:${PORT}" \
124
+ crucible:ci serve --dialect "$DIALECT" --port "$PORT"
125
+ for _ in $(seq 60); do
126
+ if curl -fsS --max-time 2 "http://127.0.0.1:${PORT}/_crucible/health" >/dev/null; then
127
+ echo "healthy on port ${PORT}"
128
+ exit 0
129
+ fi
130
+ sleep 1
131
+ done
132
+ echo "not healthy after 60s" >&2
133
+ docker logs crucible >&2 || true
134
+ exit 1
135
+ - name: Run official client tests
136
+ env:
137
+ CLIENT_SPEC: ${{ matrix.client }}
138
+ DIALECT: ${{ matrix.dialect }}
139
+ CRUCIBLE_URL: http://127.0.0.1:${{ matrix.port }}
140
+ run: uv run --with "$CLIENT_SPEC" pytest -m clients tests/clients -k "$DIALECT"
141
+
142
+ dbt:
143
+ needs: docker
144
+ runs-on: ubuntu-24.04
145
+ strategy:
146
+ fail-fast: false
147
+ matrix:
148
+ include:
149
+ - dialect: bigquery
150
+ port: 9050
151
+ core: dbt-core==1.9.11
152
+ adapter: dbt-bigquery==1.9.0
153
+ - dialect: bigquery
154
+ port: 9050
155
+ core: dbt-core
156
+ adapter: dbt-bigquery
157
+ steps:
158
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
159
+ with:
160
+ persist-credentials: false
161
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
162
+ - uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
163
+ - name: Build image
164
+ uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
165
+ with:
166
+ context: .
167
+ file: docker/Dockerfile
168
+ tags: crucible:ci
169
+ load: true
170
+ push: false
171
+ - name: Start emulator and wait for health
172
+ env:
173
+ DIALECT: ${{ matrix.dialect }}
174
+ PORT: ${{ matrix.port }}
175
+ run: |
176
+ docker run -d --name crucible -p "127.0.0.1:${PORT}:${PORT}" \
177
+ crucible:ci serve --dialect "$DIALECT" --port "$PORT"
178
+ for _ in $(seq 60); do
179
+ if curl -fsS --max-time 2 "http://127.0.0.1:${PORT}/_crucible/health" >/dev/null; then
180
+ echo "healthy on port ${PORT}"
181
+ exit 0
182
+ fi
183
+ sleep 1
184
+ done
185
+ echo "not healthy after 60s" >&2
186
+ docker logs crucible >&2 || true
187
+ exit 1
188
+ - name: Run dbt tests
189
+ env:
190
+ CORE_SPEC: ${{ matrix.core }}
191
+ ADAPTER_SPEC: ${{ matrix.adapter }}
192
+ DIALECT: ${{ matrix.dialect }}
193
+ CRUCIBLE_URL: http://127.0.0.1:${{ matrix.port }}
194
+ run: uv run --with "$CORE_SPEC" --with "$ADAPTER_SPEC" pytest -m dbt tests/dbt -k "$DIALECT"
@@ -0,0 +1,100 @@
1
+ name: Corpus record
2
+
3
+ # Records corpus cases against a real warehouse, which spends credits. Manual runs only.
4
+ on:
5
+ workflow_dispatch:
6
+ inputs:
7
+ dialect:
8
+ description: Warehouse to record against
9
+ type: choice
10
+ options: [bigquery, snowflake]
11
+ required: true
12
+ path:
13
+ description: Directory for the recorded YAML. Empty means corpus/<dialect>
14
+ type: string
15
+ default: ""
16
+ max_bytes_billed:
17
+ description: BigQuery bytes-billed cap per query (ignored for Snowflake)
18
+ type: string
19
+ default: "104857600"
20
+
21
+ permissions:
22
+ contents: read
23
+
24
+ jobs:
25
+ record:
26
+ if: github.repository == 'CallumWalterWhite/crucible'
27
+ runs-on: ubuntu-24.04
28
+ environment: corpus-record
29
+ permissions:
30
+ contents: write
31
+ pull-requests: write
32
+ id-token: write # Workload Identity Federation
33
+ env:
34
+ DIALECT: ${{ inputs.dialect }}
35
+ steps:
36
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
37
+ with:
38
+ persist-credentials: false
39
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
40
+ - name: Install dependencies for the dialect
41
+ run: uv sync --locked --extra "record-$DIALECT"
42
+
43
+ # Workload Identity Federation: no long-lived key. The provider and service account are
44
+ # repository variables, not secrets; the service account only needs BigQuery job and
45
+ # dataset create/delete rights in the sandbox project.
46
+ - name: Authenticate to Google Cloud
47
+ if: inputs.dialect == 'bigquery'
48
+ uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0
49
+ with:
50
+ workload_identity_provider: ${{ vars.GCP_WORKLOAD_IDENTITY_PROVIDER }}
51
+ service_account: ${{ vars.GCP_SERVICE_ACCOUNT }}
52
+
53
+ - name: Set the BigQuery project
54
+ if: inputs.dialect == 'bigquery'
55
+ env:
56
+ BIGQUERY_PROJECT: ${{ vars.BIGQUERY_PROJECT }}
57
+ run: echo "BIGQUERY_PROJECT=$BIGQUERY_PROJECT" >> "$GITHUB_ENV"
58
+
59
+ # TODO(phase-5): move Snowflake to key-pair auth; password secrets are a stopgap.
60
+ - name: Write Snowflake credentials
61
+ if: inputs.dialect == 'snowflake'
62
+ env:
63
+ SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
64
+ SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }}
65
+ SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}
66
+ SNOWFLAKE_WAREHOUSE: ${{ secrets.SNOWFLAKE_WAREHOUSE }}
67
+ run: |
68
+ set -euo pipefail
69
+ echo "::add-mask::$SNOWFLAKE_PASSWORD"
70
+ {
71
+ echo "SNOWFLAKE_ACCOUNT=$SNOWFLAKE_ACCOUNT"
72
+ echo "SNOWFLAKE_USER=$SNOWFLAKE_USER"
73
+ echo "SNOWFLAKE_PASSWORD=$SNOWFLAKE_PASSWORD"
74
+ echo "SNOWFLAKE_WAREHOUSE=$SNOWFLAKE_WAREHOUSE"
75
+ } >> "$GITHUB_ENV"
76
+
77
+ - name: Record corpus cases
78
+ env:
79
+ INPUT_PATH: ${{ inputs.path }}
80
+ MAX_BYTES: ${{ inputs.max_bytes_billed }}
81
+ run: |
82
+ set -euo pipefail
83
+ path="${INPUT_PATH:-corpus/$DIALECT}"
84
+ echo "CORPUS_PATH=$path" >> "$GITHUB_ENV"
85
+ uv run --no-sync crucible corpus record \
86
+ --dialect "$DIALECT" \
87
+ --path "$path" \
88
+ --max-bytes-billed "$MAX_BYTES" \
89
+ --i-understand-this-spends-credits
90
+
91
+ - name: Open pull request with recorded cases
92
+ uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
93
+ with:
94
+ branch: corpus-record/${{ inputs.dialect }}
95
+ base: main
96
+ add-paths: ${{ env.CORPUS_PATH }}
97
+ commit-message: "corpus: record ${{ inputs.dialect }} cases"
98
+ title: "corpus: record ${{ inputs.dialect }} cases"
99
+ body: |
100
+ Recorded by workflow run ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}.
@@ -0,0 +1,96 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+ workflow_dispatch:
7
+ inputs:
8
+ dry_run:
9
+ description: Build everything but publish nothing
10
+ type: boolean
11
+ default: true
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ concurrency:
17
+ group: release-${{ github.ref }}
18
+ cancel-in-progress: false
19
+
20
+ jobs:
21
+ checks:
22
+ uses: ./.github/workflows/ci.yml
23
+
24
+ build:
25
+ runs-on: ubuntu-24.04
26
+ outputs:
27
+ version: ${{ steps.version.outputs.version }}
28
+ steps:
29
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
30
+ with:
31
+ persist-credentials: false
32
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
33
+ - name: Read package version
34
+ id: version
35
+ run: echo "version=$(uv version --short)" >> "$GITHUB_OUTPUT"
36
+ - name: Validate release tag
37
+ if: github.event_name == 'push' || inputs.dry_run == false
38
+ env:
39
+ PACKAGE_VERSION: ${{ steps.version.outputs.version }}
40
+ run: |
41
+ test "$GITHUB_REF_TYPE" = tag
42
+ test "$GITHUB_REF_NAME" = "v$PACKAGE_VERSION"
43
+ - run: uv build
44
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
45
+ with:
46
+ name: dist
47
+ path: dist/
48
+
49
+ pypi:
50
+ needs: [build, checks]
51
+ if: vars.PYPI_PUBLISHING_ENABLED == 'true' && (github.event_name == 'push' || inputs.dry_run == false)
52
+ runs-on: ubuntu-24.04
53
+ environment: pypi
54
+ permissions:
55
+ id-token: write
56
+ steps:
57
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
58
+ with:
59
+ name: dist
60
+ path: dist/
61
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
62
+
63
+ image:
64
+ needs: [build, checks]
65
+ runs-on: ubuntu-24.04
66
+ permissions:
67
+ contents: read
68
+ packages: write
69
+ steps:
70
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
71
+ with:
72
+ persist-credentials: false
73
+ - uses: docker/setup-qemu-action@99012661954931238ded8c8b007157a8430204e1 # v4.4.0
74
+ - uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
75
+ - name: Log in to GitHub Container Registry
76
+ if: github.event_name == 'push' || inputs.dry_run == false
77
+ uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
78
+ with:
79
+ registry: ghcr.io
80
+ username: ${{ github.actor }}
81
+ password: ${{ secrets.GITHUB_TOKEN }}
82
+ - name: Build and push image
83
+ uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
84
+ with:
85
+ context: .
86
+ file: docker/Dockerfile
87
+ platforms: linux/amd64,linux/arm64
88
+ push: ${{ github.event_name == 'push' || inputs.dry_run == false }}
89
+ tags: |
90
+ ghcr.io/callumwalterwhite/crucible-emulator:v${{ needs.build.outputs.version }}
91
+ ghcr.io/callumwalterwhite/crucible-emulator:latest
92
+ labels: |
93
+ org.opencontainers.image.source=https://github.com/${{ github.repository }}
94
+ org.opencontainers.image.version=${{ needs.build.outputs.version }}
95
+ org.opencontainers.image.revision=${{ github.sha }}
96
+ org.opencontainers.image.licenses=Apache-2.0
@@ -0,0 +1,13 @@
1
+ .local/
2
+ .venv/
3
+ __pycache__/
4
+ *.pyc
5
+ .pytest_cache/
6
+ .ruff_cache/
7
+ dist/
8
+ .claude/scheduled_tasks.lock
9
+ # google-github-actions/auth credential files
10
+ gha-creds-*.json
11
+ .claude/
12
+ .vscode/
13
+ logs/
@@ -0,0 +1,33 @@
1
+ # Install once with `uv run pre-commit install`. CI runs the same ruff, pyright and import-linter checks.
2
+ repos:
3
+ - repo: https://github.com/pre-commit/pre-commit-hooks
4
+ rev: v6.0.0
5
+ hooks:
6
+ - id: end-of-file-fixer
7
+ - id: trailing-whitespace
8
+ - id: check-yaml
9
+ - id: check-toml
10
+ - id: check-added-large-files
11
+
12
+ - repo: https://github.com/astral-sh/ruff-pre-commit
13
+ rev: v0.17.0
14
+ hooks:
15
+ - id: ruff-check
16
+ args: [--fix]
17
+ - id: ruff-format
18
+
19
+ - repo: local
20
+ hooks:
21
+ - id: pyright
22
+ name: pyright
23
+ entry: uv run pyright
24
+ language: system
25
+ types: [python]
26
+ pass_filenames: false
27
+
28
+ - id: lint-imports
29
+ name: lint-imports
30
+ entry: uv run lint-imports
31
+ language: system
32
+ types: [python]
33
+ pass_filenames: false
@@ -0,0 +1,36 @@
1
+ # AGENTS.md
2
+
3
+ Local BigQuery API emulator on DuckDB (Snowflake planned). Pre-alpha.
4
+
5
+ ## Commands (use `uv run`)
6
+
7
+ Setup: `uv sync --all-extras` then `uv run pre-commit install`.
8
+
9
+ Pre-PR checks (same as CI `lint` job, in this order):
10
+ ```sh
11
+ uv run ruff check
12
+ uv run ruff format --check
13
+ uv run pyright
14
+ uv run lint-imports
15
+ uv run pytest
16
+ ```
17
+ Default `pytest` runs only `tests/unit` + `tests/corpus`. Single test: `uv run pytest <path> [-k name]`. Single corpus case without a server: `uv run crucible corpus run --dialect bigquery --path corpus/bigquery/<area>/<case>.yaml`.
18
+
19
+ `clients`/`dbt` suites need a running Docker image + `CRUCIBLE_URL` (see `.github/workflows/ci.yml`); don't run them locally by default. `serve` needs the `server` extra (`--all-extras` covers it).
20
+
21
+ ## Architecture
22
+
23
+ Layers enforced by `import-linter` (`pyproject.toml`): `crucible.cli` → `crucible.server | crucible.corpus` → `crucible.dialects` → `crucible.engine`. `bigquery` and `snowflake` dialect packages never import each other; engine is warehouse-agnostic and sees dialects only via the `Dialect` protocol (type-checking only). Request flow: `server/<dialect>` → `engine.Pipeline` (`dialect.split` → `dialect.plan` → `SqlPlan | CommandPlan`) → `Result` → dialect types → wire response.
24
+
25
+ - `engine/`: `engine.py` (one DuckDB, UTC-pinned, cursor per request), `catalog.py` (quote all identifiers via `engine.catalog.quote()`), `session.py`, `pipeline.py`, `types.py`, `errors.py`.
26
+ - `dialects/<d>/`: `statements.py`, `translate.py` (schema-aware: qualify against live catalog, annotate, transform, generate with the dialect's own SQLGlot DuckDB-generator subclass), `ddl.py`, `dml.py`, `types.py`, `metadata.py`, `errors.py`, `dialect.py`.
27
+ - `dialects/<d>/transforms/`: one module per area; ordered list `PIPELINE` in `transforms/__init__.py` is the only ordering. Transforms run on the qualified type-annotated AST, must preserve `.type` on rebuilt nodes, and raise `CrucibleUnsupportedError` for anything inexact.
28
+ - `server/`: one Starlette app per dialect per process. BigQuery `:9050`, Snowflake `:8080`, bind `127.0.0.1` by default (`CRUCIBLE_HOST=0.0.0.0` only inside Docker). Health: `GET /_crucible/health`. Unknown endpoints return the warehouse's "not implemented" shape, never a generic 404. Never expose on a network — no auth by design.
29
+
30
+ ## Rules that fail CI or waste money
31
+
32
+ - **Unsupported means explicit.** Never return a best guess; raise `CrucibleUnsupportedError` (mapped to the warehouse error at the server edge). `docs/architecture.md` + ADRs are design truth; `CONTRIBUTING.md` has the workflow.
33
+ - **Corpus is the proof.** Cases live in `corpus/<dialect>/<area>/<case>.yaml`. Never hand-set `verified: true` or `recorded_at` — only `crucible corpus record` writes them, and CI (`scripts/check-corpus-verified.sh`) fails any PR outside `corpus-record/*` that adds `verified: true`. Contributors never run `record`/`record-api` (spends real warehouse credits, requires `--max-bytes-billed` + `--i-understand-this-spends-credits`, maintainers only).
34
+ - **Every response shape needs a one-line comment** citing the client source or official API doc. Upstream SQLGlot bugs go upstream; keep only a local workaround with a comment linking the upstream PR.
35
+ - **Exact pins** `sqlglot==30.22.0`, `duckdb==1.5.6` are deliberate (ADR 0008) — do not loosen. `pytz` is a core dep (DuckDB needs it for TZ values). Python 3.11–3.13; `pyright` is `strict` on `src` only; ruff line-length 100.
36
+ - **`docs/compatibility.md` is generated** from corpus/client results — never hand-edit. Wire fixtures in `tests/fixtures/bigquery_api/` are redacted in code before writing.
@@ -0,0 +1,39 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project does not yet follow semantic versioning.
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0a2] - 2026-10-20
11
+
12
+ ### Added
13
+
14
+ - Multipart uploads (`uploadType=multipart`) for CSV load jobs, used by dbt Fusion for seeds.
15
+ - CSV loads accept the BOOL spellings `True` and `False`, as written by Python tools.
16
+ - `examples/dbt-bigquery`: an original dbt project with seeds, views, tables, data tests and unit tests.
17
+ - README sections on supported dbt versions, current limits and alternatives.
18
+ - Issue templates for bug reports and unsupported features.
19
+
20
+ ### Changed
21
+
22
+ - The Python client examples moved to `examples/python-bigquery`.
23
+ - The project is described as a BigQuery emulator, with Snowflake planned.
24
+
25
+ ### Fixed
26
+
27
+ - `crucible corpus record-api` now removes stale fixtures with three-digit numbers.
28
+ - Time travel (`FOR SYSTEM_TIME AS OF`) and functions DuckDB lacks (such as `ST_*`) raise
29
+ `Not supported by Crucible` instead of a DuckDB parser or catalog error.
30
+
31
+ ## [0.1.0a1] - 2026-10-17
32
+
33
+ ### Added
34
+
35
+ - Initial project scaffolding.
36
+ - BigQuery translation backbone: schema-aware translation, output types from the BigQuery AST,
37
+ BigQuery literal typing, NUMERIC as DECIMAL(38,9), CREATE TABLE and INSERT with BigQuery coercion.
38
+ - BigQuery error parity, SAFE., function fixes, UNNEST, ARRAY_AGG and the statements dbt emits.
39
+ - `crucible corpus record-api`: redacted wire-format fixtures from the real BigQuery REST API.