infiniflow/ragflow · error · ConnectorValidationError

At least one content column must be specified.

Error message

At least one content column must be specified.

What it means

validate_connector_settings requires at least one content column; content_columns defines which fields become indexed document content, so an empty list means the connector would ingest nothing meaningful.

Source

Thrown at common/data_source/bigquery_connector.py:595

        from api.db.services.connector_service import ConnectorService

        updated_conf = copy.deepcopy(self._sync_config)
        updated_conf["sync_cursor_value"] = self.serialize_cursor_value(self._pending_sync_cursor_value)
        updated_conf["sync_cursor_id"] = self._pending_sync_cursor_id
        ConnectorService.update_by_id(self._sync_connector_id, {"config": updated_conf})
        self._sync_config = updated_conf

    # ------------------------------------------------------------------ #
    # Validation
    # ------------------------------------------------------------------ #
    def validate_connector_settings(self) -> None:
        """Validate settings via SELECT 1 plus a dry-run of the configured base query."""
        if not self._credentials:
            raise ConnectorMissingCredentialError("BigQuery credentials not loaded.")
        if not self.project_id:
            raise ConnectorValidationError("BigQuery project_id is required.")
        if not self.content_columns:
            raise ConnectorValidationError("At least one content column must be specified.")
        if not self.query and not (self.dataset_id and self.table_id):
            raise ConnectorValidationError("BigQuery requires either a custom query or both dataset_id and table_id.")

        try:
            client = self._get_client()

            # Cheap connectivity check.
            client.query(
                "SELECT 1",
                job_config=self._build_query_job_config(),
                location=self.location or None,
            ).result()

            # Free cost/validity check of the actual base query.
            dry_run_job = client.query(
                self._wrap_query(self._build_base_query()),
                job_config=self._build_query_job_config(dry_run=True),
                location=self.location or None,

View on GitHub (pinned to 554fb1133a)

Solutions

  1. Set content_columns to one or more columns present in the base query, e.g. ['body']
  2. Verify the key is exactly content_columns and the list is non-empty

Example fix

// before
config = {"content_columns": [], ...}

// after
config = {"content_columns": ["title", "body"], ...}
Defensive patterns

Strategy: validation

Validate before calling

if not config.get("content_columns"):
    raise ValueError("content_columns must list at least one column to ingest")

Try / catch

try:
    conn.validate_connector_settings()
except ConnectorValidationError as e:
    if "content column" in str(e):
        config["content_columns"] = infer_content_columns(schema); revalidate()
    else:
        raise

Prevention

When it happens

Trigger: content_columns empty or missing from config during validation.

Common situations: User configures only metadata/id/timestamp columns; form serialization drops empty arrays; key typo like contentColumns.

Related errors


AI-assisted analysis of infiniflow/ragflow@554fb1133a (2026-08-15). Data as JSON: /api/errors/7346fc3f9fca7c99. Report an issue: GitHub.