Como o rowid é determinado na inserção do sqlite?

Eu gostaria de prever (realmente fazer engenharia reversa) o rowid de qualquer linha a ser inserida em uma tabela sqlite (para reconstruir um fluxo de inserções sqlite usando o rowid de algumas tabelas como chave estrangeira em outras tabelas). A inserção pode ocorrer após uma sequência arbitrária de inserções e exclusões. Como o rowid é determinado pelo sqlite na inserção?

É um contador sempre crescente?

int64_t next_rowid() {
  static int64_t r = 0;
  return ++r;
}

Talvez a menor linha não esteja em uso?

// Algorithm description, not (likely) working code
static sorted_set<int64_t> deleted;
static int64_t top = 0;
int64_t next_rowid() {
  if(deleted.size()==0) deleted.push(++top);
  return deleted.pop_front();
}
void delete_rowid(int64_t r) {
  deleted.push(r);
}

Algum outro esquema?

Não especificado?

questionAnswers(2)

yourAnswerToTheQuestion