foreign(foreignInfo) {
    const compiler = this;

    if (this.method !== 'create' && this.method !== 'createIfNot') {
      foreignInfo.column = Array.isArray(foreignInfo.column)
        ? foreignInfo.column
        : [foreignInfo.column];
      foreignInfo.column = foreignInfo.column.map((column) =>
        this.client.customWrapIdentifier(column, identity)
      );
      foreignInfo.inTable = this.client.customWrapIdentifier(
        foreignInfo.inTable,
        identity
      );
      foreignInfo.references = Array.isArray(foreignInfo.references)
        ? foreignInfo.references
        : [foreignInfo.references];
      foreignInfo.references = foreignInfo.references.map((column) =>
        this.client.customWrapIdentifier(column, identity)
      );

      this.pushQuery({
        sql: `PRAGMA table_info(${this.tableName()})`,
        statementsProducer(pragma, connection) {
          return compiler.client
            .ddl(compiler, pragma, connection)
            .foreign(foreignInfo);
        },
      });
    }
  }
Add a foreign key constraint to an existing table

@NOTE The `createQuery` method above handles foreign key constraints on table creation. Don't do
      anything regarding table creation in this method

@param {object} foreignInfo - Information about the current column foreign setup
@param {string | string[]} [foreignInfo.column] - Column in the current constraint
@param {string | undefined} foreignInfo.keyName - Name of the foreign key constraint
@param {string | string[]} foreignInfo.references - What column it references in the other table
@param {string} foreignInfo.inTable - What table is referenced in this constraint
@param {string} [foreignInfo.onUpdate] - What to do on updates
@param {string} [foreignInfo.onDelete] - What to do on deletions