Lua stable multi-key sorter with nil last

Lua
local function sort_records(rows, keys)
  local deco = {}
  for i, row in ipairs(rows) do deco[i] = { row = row, pos = i } end
  local function cmp(a, b)
    for _, key in ipairs(keys) do
      local va, vb = a.row[key], b.row[key] -- nil sorts last
      if va == nil and vb ~= nil then return false end
      if vb == nil and va ~= nil then return true end
      if va ~= vb then return va < vb end
    end
    return a.pos < b.pos
  end
  table.sort(deco, cmp)
  for i, d in ipairs(deco) do rows[i] = d.row end
  return rows
end

return sort_records