code: @NonNull
      @Override
      public ResultSet execute() throws CouchbaseLiteException {
          try {
              final C4QueryOptions options = new C4QueryOptions();
              if (parameters == null) { parameters = new Parameters(); }
  
              final AllocSlice params = parameters.encode();
              final C4QueryEnumerator c4enum;
              synchronized (getDatabase().getLock()) {
                  check();
                  c4enum = c4query.run(options, params);
              }
              return new ResultSet(this, c4enum, columnNames);
          }
          catch (LiteCoreException e) {
              throw CBLStatus.convertException(e);
          }
      }
docs: Executes the query. The returning a result set that enumerates result rows one at a time.
  You can run the query any number of times, and you can even have multiple ResultSet active at
  once.
  <p>
  The results come from a snapshot of the database taken at the moment the run() method
  is called, so they will not reflect any changes made to the database afterwards.
  </p>
  
  @return the ResultSet for the query result.
  @throws CouchbaseLiteException if there is an error when running the query.