code: public String translate(final Values values) {
          final ArrayList<Values.Row> rows = new ArrayList<>(values.getRows());
          final String[] aliases = values.getAliases();
  
          // If aliases does not exist, throw an exception.
          // Otherwise, apply them to the columns.
          if (aliases == null || aliases.length == 0) {
              throw new DatabaseEngineRuntimeException("Values requires aliases to avoid ambiguous columns names.");
          } else {
              rows.forEach(row -> {
                  final List<Expression> expressions = row.getExpressions();
                  for (int i = 0; i < expressions.size() && i < aliases.length; i++) {
                      // DISCLAIMER : May have side-effects because will change the state of the row's expressions.
                      expressions.get(i).alias(aliases[i]);
                  }
              });
          }
  
          // Put each row on a select for union operator to work.
          final List<Expression> rowsWithSelect = rows.stream()
                  .map(SqlBuilder::select)
                  .collect(Collectors.toList());
  
          // By default, use UNION ALL to express VALUES.
          // This way, only engines that support VALUES will implement it.
          // Since the amount of values can be quite large, a linear UNION can cause Stack Overflow.
          // To avoid it, we model this UNION as a binary tree.
          final Union union = rowsToUnion(rowsWithSelect);
  
          if (values.isEnclosed()) {
              union.enclose();
          }
  
          return translate(union);
      }
docs: Translates Values.
  
  @param values a values.
  @return values translation.