diff --git a/superset-frontend/src/datasource/DatasourceEditor.jsx b/superset-frontend/src/datasource/DatasourceEditor.jsx index 89b8b7a03a..81ced4b575 100644 --- a/superset-frontend/src/datasource/DatasourceEditor.jsx +++ b/superset-frontend/src/datasource/DatasourceEditor.jsx @@ -616,7 +616,13 @@ class DatasourceEditor extends React.PureComponent { 'values from the table. Typically the intent would be to limit the scan ' + 'by applying a relative time filter on a partitioned or indexed time-related field.', )} - control={} + control={ + + } /> )} {this.state.isSqla && ( diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index cd93e46bb5..a05c63e1b4 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -502,7 +502,7 @@ class SqlaTable( # pylint: disable=too-many-public-methods,too-many-instance-at table_name = Column(String(250), nullable=False) main_dttm_col = Column(String(250)) database_id = Column(Integer, ForeignKey("dbs.id"), nullable=False) - fetch_values_predicate = Column(String(1000)) + fetch_values_predicate = Column(Text) owners = relationship(owner_class, secondary=sqlatable_user, backref="tables") database: Database = relationship( "Database", diff --git a/superset/migrations/versions/07071313dd52_change_fetch_values_predicate_to_text.py b/superset/migrations/versions/07071313dd52_change_fetch_values_predicate_to_text.py new file mode 100644 index 0000000000..320fb55a35 --- /dev/null +++ b/superset/migrations/versions/07071313dd52_change_fetch_values_predicate_to_text.py @@ -0,0 +1,84 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""change_fetch_values_predicate_to_text + +Revision ID: 07071313dd52 +Revises: 6d20ba9ecb33 +Create Date: 2021-08-09 17:32:56.204184 + +""" + +# revision identifiers, used by Alembic. +revision = "07071313dd52" +down_revision = "6d20ba9ecb33" + +import logging + +import sqlalchemy as sa +from alembic import op +from sqlalchemy import and_, func, or_ +from sqlalchemy.dialects import postgresql +from sqlalchemy.sql.schema import Table + +from superset import db +from superset.connectors.sqla.models import SqlaTable + + +def upgrade(): + with op.batch_alter_table("tables") as batch_op: + batch_op.alter_column( + "fetch_values_predicate", + existing_type=sa.String(length=1000), + type_=sa.Text(), + existing_nullable=True, + ) + + +def remove_value_if_too_long(): + bind = op.get_bind() + session = db.Session(bind=bind) + + # it will be easier for users to notice that their field has been deleted rather than truncated + # so just remove it if it won't fit back into the 1000 string length column + try: + rows = ( + session.query(SqlaTable) + .filter(func.length(SqlaTable.fetch_values_predicate) > 1000) + .all() + ) + + for row in rows: + row.fetch_values_predicate = None + + logging.info("%d values deleted", len(rows)) + + session.commit() + session.close() + except Exception as ex: + logging.warning(ex) + + +def downgrade(): + remove_value_if_too_long() + + with op.batch_alter_table("tables") as batch_op: + batch_op.alter_column( + "fetch_values_predicate", + existing_type=sa.Text(), + type_=sa.String(length=1000), + existing_nullable=True, + )