Java Code Examples for org.apache.calcite.sql.SqlSetOption#getScope()

The following examples show how to use org.apache.calcite.sql.SqlSetOption#getScope() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: SetOptionHandler.java    From Bats with Apache License 2.0 4 votes vote down vote up
@Override
public PhysicalPlan getPlan(SqlNode sqlNode) throws ValidationException, ForemanSetupException {
  final SqlSetOption option = unwrap(sqlNode, SqlSetOption.class);
  final SqlNode value = option.getValue();
  if (value != null && !(value instanceof SqlLiteral)) {
    throw UserException.validationError()
        .message("Drill does not support assigning non-literal values in SET statements.")
        .build(logger);
  }

  final QueryOptionManager options = context.getOptions();
  final String scope = option.getScope();
  final OptionValue.OptionScope optionScope;
  if (scope == null) { // No scope mentioned assumed SESSION
    optionScope = OptionScope.SESSION;
  } else {
    switch (scope.toLowerCase()) {
    case "session":
      optionScope = OptionScope.SESSION;
      // Skip writing profiles for "ALTER SESSION SET" queries
      if (options.getBoolean(ExecConstants.SKIP_ALTER_SESSION_QUERY_PROFILE)) {
        logger.debug("Will not write profile for ALTER SESSION SET ... ");
        context.skipWritingProfile(true);
      }
      break;
    case "system":
      optionScope = OptionScope.SYSTEM;
      break;
    default:
      throw UserException.validationError()
          .message("Invalid OPTION scope %s. Scope must be SESSION or SYSTEM.", scope)
          .build(logger);
    }
  }

  if (optionScope == OptionScope.SYSTEM) {
    // If the user authentication is enabled, make sure the user who is trying to change the system option has
    // administrative privileges.
    if (context.isUserAuthenticationEnabled() &&
        !ImpersonationUtil.hasAdminPrivileges(
          context.getQueryUserName(),
          ExecConstants.ADMIN_USERS_VALIDATOR.getAdminUsers(options),
          ExecConstants.ADMIN_USER_GROUPS_VALIDATOR.getAdminUserGroups(options))) {
      throw UserException.permissionError()
          .message("Not authorized to change SYSTEM options.")
          .build(logger);
    }
  }

  final String optionName = option.getName().toString();

  // Currently, we convert multi-part identifier to a string.
  final OptionManager chosenOptions = options.getOptionManager(optionScope);

  if (value != null) { // SET option
    final Object literalObj = sqlLiteralToObject((SqlLiteral) value);
    chosenOptions.setLocalOption(optionName, literalObj);
  } else { // RESET option
    if ("ALL".equalsIgnoreCase(optionName)) {
      chosenOptions.deleteAllLocalOptions();
    } else {
      chosenOptions.deleteLocalOption(optionName);
    }
  }

  return DirectPlan.createDirectPlan(context, true, String.format("%s updated.", optionName));
}
 
Example 2
Source File: SqlAlterTableSetOption.java    From dremio-oss with Apache License 2.0 4 votes vote down vote up
public SqlAlterTableSetOption(SqlParserPos pos, SqlIdentifier table, SqlSetOption sqlSetOption) {
  super(pos, sqlSetOption.getScope(), sqlSetOption.getName(), sqlSetOption.getValue());
  this.table = table;
}
 
Example 3
Source File: SetOptionHandler.java    From dremio-oss with Apache License 2.0 4 votes vote down vote up
@Override
public List<SimpleCommandResult> toResult(String sql, SqlNode sqlNode) throws ValidationException, RelConversionException, IOException,
    ForemanSetupException {
  final OptionValidatorListing optionValidatorProvider = session.getOptions().getOptionValidatorListing();
  final QueryOptionManager queryOptionManager = new QueryOptionManager(optionValidatorProvider);
  final OptionManager options = OptionManagerWrapper.Builder.newBuilder()
    .withOptionManager(new DefaultOptionManager(optionValidatorProvider))
    .withOptionManager(new EagerCachingOptionManager(context.getSystemOptionManager()))
    .withOptionManager(session.getSessionOptionManager())
    .withOptionManager(queryOptionManager)
    .build();
  final SqlSetOption option = SqlNodeUtil.unwrap(sqlNode, SqlSetOption.class);
  final String name = option.getName().toString();

  final SqlNode value = option.getValue();
  if (value != null && !(value instanceof SqlLiteral)) {
    throw UserException.validationError()
        .message("Dremio does not support assigning non-literal values in SET statements.")
        .build(logger);
  }

  final String scope = option.getScope();
  final OptionValue.OptionType type;
  if (scope == null) { // No scope mentioned assumed SESSION
    type = OptionType.SESSION;
  } else {
    switch (scope.toLowerCase()) {
      case "session":
        type = OptionType.SESSION;
        break;
      case "system":
        type = OptionType.SYSTEM;
        break;
      default:
        throw UserException.validationError()
            .message("Invalid OPTION scope %s. Scope must be SESSION or SYSTEM.", scope)
            .build(logger);
    }
  }

  // Currently, we convert multi-part identifier to a string.
  if (value != null) { // SET option
    final OptionValue optionValue = createOptionValue(name, type, (SqlLiteral) value);
    options.setOption(optionValue);
  } else { // RESET option
    if ("ALL".equalsIgnoreCase(name)) {
      session.setDefaultSchemaPath(null);
      options.deleteAllOptions(type);
    } else {
      options.deleteOption(name, type);
    }
  }


  return Collections.singletonList(SimpleCommandResult.successful("%s updated.", name));
}