{"record":{"id":"03e552ec60eb8b9e","repo":"mlflow/mlflow","slug":"invalid-comparator-for-tag-comparator","errorCode":null,"errorMessage":"Invalid comparator for tag: {comparator}","messagePattern":"Invalid comparator for tag: (.+?)","errorType":"validation","errorClass":"MlflowException","httpStatus":null,"severity":"warning","filePath":"mlflow/store/model_registry/sqlalchemy_store.py","lineNumber":613,"sourceCode":"            key = f[\"key\"]\n            comparator = f[\"comparator\"]\n            value = f[\"value\"]\n            if type_ == \"attribute\":\n                if key != \"name\":\n                    raise MlflowException(\n                        f\"Invalid attribute name: {key}\", error_code=INVALID_PARAMETER_VALUE\n                    )\n                if comparator not in (\"=\", \"!=\", \"LIKE\", \"ILIKE\"):\n                    raise MlflowException(\n                        f\"Invalid comparator for attribute: {comparator}\",\n                        error_code=INVALID_PARAMETER_VALUE,\n                    )\n                attr = getattr(SqlRegisteredModel, key)\n                attr_filter = SearchUtils.get_sql_comparison_func(comparator, dialect)(attr, value)\n                attribute_filters.append(attr_filter)\n            elif type_ == \"tag\":\n                if comparator not in (\"=\", \"!=\", \"LIKE\", \"ILIKE\"):\n                    raise MlflowException.invalid_parameter_value(\n                        f\"Invalid comparator for tag: {comparator}\"\n                    )\n                if key not in tag_filters:\n                    key_filter = SearchUtils.get_sql_comparison_func(\"=\", dialect)(\n                        SqlRegisteredModelTag.key, key\n                    )\n                    tag_filters[key] = [key_filter]\n                    tag_filters[key].extend(tag_where_clauses)\n\n                val_filter = SearchUtils.get_sql_comparison_func(comparator, dialect)(\n                    SqlRegisteredModelTag.value, value\n                )\n                tag_filters[key].append(val_filter)\n            else:\n                raise MlflowException(\n                    f\"Invalid token type: {type_}\", error_code=INVALID_PARAMETER_VALUE\n                )\n","sourceCodeStart":595,"sourceCodeEnd":631,"githubUrl":"https://github.com/mlflow/mlflow/blob/6a27f2decc0b76eb1b54af31849784addb357dbc/mlflow/store/model_registry/sqlalchemy_store.py#L595-L631","documentation":"For tag filter expressions (tags.key = 'value' style), only =, !=, LIKE and ILIKE comparators are supported; any other comparator raises an invalid-parameter MlflowException raised via MlflowException.invalid_parameter_value.","triggerScenarios":"Passing a filter like \"tags.env > 'prod'\" or \"tags.\"team\" IN ('a','b')\" to search_registered_models; tag keys with quotes/escapes mis-parsed can also yield unexpected comparator values.","commonSituations":"Copy-paste from run/experiment search filters which support more operators; template-built filters interpolating operators from configuration; typos like '==' instead of '='.","solutions":["Restrict tag comparators to =, !=, LIKE, ILIKE, e.g. \"tags.env = 'prod'\"","Replace unsupported operators with several = queries joined client-side, or use LIKE patterns","Fix typos such as == to = and validate filters before calling the API"],"exampleFix":"// before\nclient.search_registered_models(\"tags.env != null or tags.env > 'dev'\")\n// after\nclient.search_registered_models(\"tags.env = 'dev'\")","handlingStrategy":"validation","validationCode":"import re\nALLOWED = {\"=\", \"!=\", \"LIKE\", \"ILIKE\"}\n# e.g. \"tags.env = 'prod'\"\nm = re.match(r\"tags\\.([\\w.\\-]+)\\s*(=|!=|LIKE|ILIKE)\\s*'(.*)'$\", filter_string.strip())\nif not m or m.group(2) not in ALLOWED:\n    raise ValueError(\"Tag filters support only =, !=, LIKE, ILIKE\")","typeGuard":null,"tryCatchPattern":"from mlflow.exceptions import MlflowException\ntry:\n    result = client.search_registered_models(filter_string=f)\nexcept MlflowException as e:\n    if 'Invalid comparator for tag' in str(e):\n        result = [m for m in client.search_registered_models() if matches_client_side(m, f)]\n    else:\n        raise","preventionTips":["Use only =, !=, LIKE, ILIKE for tag filters","Fix typos like '==' before sending filters","Restrict range operators to client-side filtering of search results","Reuse a single validated filter-builder for all model search calls"],"tags":["search","filter-syntax","tags","validation"],"backgroundTag":"invalid-search-filter","analyzedSha":"6a27f2decc0b76eb1b54af31849784addb357dbc","analyzedAt":"2026-08-29T20:54:51.419Z","schemaVersion":2},"datasetVersion":"2026-08-29T22:17:34.462Z"}