LGTM, except for 1 comment.

@@ -862,10 +861,6 @@ sqlite3AddDefaultValue(Parse * pParse, ExprSpan * pSpan)
 * a primary key (and this is the second primary key) then create an
 * error.
 *
- * Set the Table.iPKey field of the table under construction to be the
- * index of the INTEGER PRIMARY KEY column.
- * Table.iPKey is set to -1 if there is no INTEGER PRIMARY KEY.
- *
 * If the key is not an INTEGER PRIMARY KEY, then create a unique
 * index for the key.  No index is created for INTEGER PRIMARY KEYs.
 */
@@ -923,14 +918,24 @@ sqlite3AddPrimaryKey(Parse * pParse, /* Parsing context */
    (pTab->def->fields[iCol].type == FIELD_TYPE_INTEGER) &&
    sortOrder != SORT_ORDER_DESC) {
assert(autoInc == 0 || autoInc == 1);
- pTab->iPKey = iCol;
- pTab->keyConf = (u8) onError;
if (autoInc) {
pTab->iAutoIncPKey = iCol;
pTab->tabFlags |= TF_Autoincrement;
}
- if (pList)
- pParse->iPkSortOrder = pList->a[0].sort_order;
+ struct sqlite3 *db = pParse->db;
+ struct ExprList *list;
+ struct Token token;
+ sqlite3TokenInit(&token, pTab->def->fields[iCol].name);
+ list = sql_expr_list_append(db, NULL,
+     sqlite3ExprAlloc(db, TK_ID,
+      &token, 0));
+ if (list == NULL)
+ return;

I guess here should also be goto primary_key_exit;