prestodb/presto · error · SemanticException

INVALID_SESSION_PROPERTY

INVALID_SESSION_PROPERTY

Error message

Invalid session property '%s'

What it means

SetSessionTask validates SET SESSION property names: a property must have at most two parts (system property, or connector.property). A name with more than two dot-separated parts is rejected with SemanticException(INVALID_SESSION_PROPERTY). This enforces Presto's <catalog>.<property> or bare-property session naming scheme.

Source

Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/SetSessionTask.java:58

import static java.lang.String.format;

public class SetSessionTask
        implements SessionTransactionControlTask<SetSession>
{
    @Override
    public String getName()
    {
        return "SET SESSION";
    }

    @Override
    public ListenableFuture<?> execute(SetSession statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, QueryStateMachine stateMachine, List<Expression> parameters, String query)
    {
        Session session = stateMachine.getSession();
        QualifiedName propertyName = statement.getName();
        List<String> parts = propertyName.getParts();
        if (parts.size() > 2) {
            throw new SemanticException(INVALID_SESSION_PROPERTY, statement, "Invalid session property '%s'", propertyName);
        }

        // validate the property name
        PropertyMetadata<?> propertyMetadata;
        if (parts.size() == 1) {
            accessControl.checkCanSetSystemSessionProperty(session.getIdentity(), session.getAccessControlContext(), parts.get(0));
            propertyMetadata = metadata.getSessionPropertyManager().getSystemSessionPropertyMetadata(parts.get(0))
                    .orElseThrow(() -> new SemanticException(INVALID_SESSION_PROPERTY, statement, "Session property %s does not exist", statement.getName()));
        }
        else {
            ConnectorId connectorId = getConnectorIdOrThrow(stateMachine.getSession(), metadata, parts.get(0), statement, catalogError);
            accessControl.checkCanSetCatalogSessionProperty(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), parts.get(0), parts.get(1));
            propertyMetadata = metadata.getSessionPropertyManager().getConnectorSessionPropertyMetadata(connectorId, parts.get(1))
                    .orElseThrow(() -> new SemanticException(INVALID_SESSION_PROPERTY, statement, "Session property %s does not exist", statement.getName()));
        }

        Type type = propertyMetadata.getSqlType();
        Object objectValue;

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Collapse the property to at most two parts: SET SESSION catalog.property = value.
  2. Look up the exact session property name via SHOW SESSION and use it verbatim.
  3. If a deeper key is intended as a connector property, check the connector docs for its flat session-property name.

Example fix

-- before
SET SESSION hive.storage.format.values = ORC
-- after
SET SESSION hive.orc_bloom_filter_fpp = 0.05
Defensive patterns

Strategy: validation

Validate before calling

SHOW SESSION; -- confirm exact property name and its part count before SET SESSION
if (propName.split('.').length > 2) throw new Error(`Invalid session property: ${propName}`);

Type guard

function isValidSessionProperty(name) {
  return /^[A-Za-z_][\w]*(\.[A-Za-z_][\w]*)?$/.test(name);
}

Try / catch

try {
  await run(`SET SESSION ${prop} = ${value}`);
} catch (e) {
  if (e.message.includes("Invalid session property")) {
    console.error(`Use at most catalog.property format; run SHOW SESSION to list valid names`);
  }
  throw e;
}

Prevention

When it happens

Trigger: SET SESSION a.b.c = value where the property name has three or more dot-separated parts.

Common situations: Copy-pasting JVM-style or hierarchical property keys (e.g. hive.storage.format.foo) into SET SESSION; tools generating property names with extra namespace segments; confusion between connector properties and catalog-level flags.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/a134ca113b51631b. Report an issue: GitHub.