code: Index addExprIndex(int[] col, Expression[] indexExprs, HsqlName name, boolean unique, boolean migrating, Expression predicate) {
  
          Index newindex;
  
          if (table.isEmpty(session) || table.isIndexingMutable()) {
              newindex = table.createAndAddExprIndexStructure(name, col, indexExprs, unique, migrating, false);
          } else {
              newindex = table.createIndexStructure(name, col, null, null,
                      unique, migrating, false, false).withExpressions(indexExprs);
  
              Table tn = table.moveDefinition(session, table.tableType, null,
                                              null, newindex, -1, 0, emptySet,
                                              emptySet);
              // for all sessions move the data
              tn.moveData(session, table, -1, 0);
              database.persistentStoreCollection.releaseStore(table);
  
              table = tn;
  
              setNewTableInSchema(table);
              updateConstraints(table, emptySet);
          }
  
          database.schemaManager.addSchemaObject(newindex);
          database.schemaManager.recompileDependentObjects(table);
  
          if (predicate != null) {
              newindex = newindex.withPredicate(predicate);
          }
  
          return newindex;
      }
docs: A VoltDB extended variant of addIndex that supports indexed generalized non-column expressions.
  
  @param cols int[]
  @param indexExprs Expression[]
  @param name HsqlName
  @param unique boolean
  @param predicate Expression
  @return new index