{"record":{"id":"10680dd844675890","repo":"infiniflow/ragflow","slug":"bigquery-timestamp-column-type-field-type-is-n","errorCode":null,"errorMessage":"BigQuery timestamp column type '{field_type}' is not supported as a cursor.","messagePattern":"BigQuery timestamp column type '(.+?)' is not supported as a cursor\\.","errorType":"validation","errorClass":"ConnectorValidationError","httpStatus":null,"severity":"error","filePath":"common/data_source/bigquery_connector.py","lineNumber":259,"sourceCode":"            return dry_run_job.schema or []\n\n    def _get_cursor_column_field_type(self) -> str:\n        \"\"\"Resolve the BigQuery field type of the timestamp column.\"\"\"\n        client = self._get_client()\n        schema = self._resolve_schema(client)\n\n        for field in schema:\n            if field.name == self.timestamp_column:\n                return field.field_type\n        raise ConnectorValidationError(f\"BigQuery timestamp column '{self.timestamp_column}' was not found in the schema.\")\n\n    def _resolve_cursor_param_type(self) -> str:\n        if self._cursor_param_type is not None:\n            return self._cursor_param_type\n        field_type = (self._get_cursor_column_field_type() or \"\").upper()\n        param_type = _CURSOR_PARAM_TYPE_MAP.get(field_type)\n        if param_type is None:\n            raise ConnectorValidationError(f\"BigQuery timestamp column type '{field_type}' is not supported as a cursor.\")\n        self._cursor_param_type = param_type\n        return param_type\n\n    def _make_cursor_param(self, name: str, value: Any, param_type: str):\n        return bigquery.ScalarQueryParameter(name, param_type, value)\n\n    def _build_time_filtered_query(\n        self,\n        base_query: str,\n        start: Any = None,\n        end: Any = None,\n        start_id: Any = None,\n    ) -> Tuple[str, List[Any]]:\n        wrapped = self._wrap_query(base_query)\n        if not self.timestamp_column or (start is None and end is None):\n            return wrapped, []\n\n        param_type = self._resolve_cursor_param_type()","sourceCodeStart":241,"sourceCodeEnd":277,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/common/data_source/bigquery_connector.py#L241-L277","documentation":"Raised when the timestamp column exists but its BigQuery field type is not in _CURSOR_PARAM_TYPE_MAP, so the connector cannot bind it as a typed ScalarQueryParameter for cursor filtering.","triggerScenarios":"timestamp_column pointing at a STRING, BOOL, FLOAT, or RECORD/STRUCT column; only types mapped in _CURSOR_PARAM_TYPE_MAP (typically TIMESTAMP/DATETIME/DATE and numeric ids like INT64) are accepted.","commonSituations":"Timestamps stored as ISO strings; using a FLOAT 'epoch seconds' column as cursor; struct-typed columns.","solutions":["Point timestamp_column at a real TIMESTAMP/DATETIME/DATE column","Or CAST the column in a custom query: SELECT CAST(ts AS TIMESTAMP) AS ts ...","If the column is genuinely unsupported, remove timestamp_column and use id_column-based cursoring or full sync"],"exampleFix":"// before\nconfig = {\"timestamp_column\": \"ts_str\", ...}  # STRING column\n\n// after\nconfig = {\"query\": \"SELECT *, CAST(ts_str AS TIMESTAMP) AS ts FROM `p.d.t`\", \"timestamp_column\": \"ts\", ...}","handlingStrategy":"validation","validationCode":"SUPPORTED = {\"TIMESTAMP\", \"DATETIME\", \"DATE\", \"INT64\"}\nsql = \"SELECT data_type FROM region-us.INFORMATION_SCHEMA.COLUMNS WHERE ...\"\nft = client.query(sql).result()  # fetch type of timestamp_column\nif ft.upper() not in SUPPORTED:\n    raise ValueError(f\"{ft} not usable as cursor; cast in query or pick another column\")","typeGuard":null,"tryCatchPattern":"try:\n    conn.validate_connector_settings()\nexcept ConnectorValidationError as e:\n    if \"not supported as a cursor\" in str(e):\n        switch_to_cast_query_or_id_cursor()\n    else:\n        raise","preventionTips":["Prefer native TIMESTAMP columns for cursors","Wrap string timestamps in CAST(... AS TIMESTAMP) inside custom queries","Keep _CURSOR_PARAM_TYPE_MAP-supported types in mind when designing sync schemas"],"tags":["bigquery","types","incremental-sync","validation"],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}