Skip to content

版本号比较问题 #856

Description

@denymz

部署方式 | How to Deploy

使用一键部署脚本 | Using zealot-docker on-click install (Default)

部署版本 | Version

nightly (Default)

反代服务 | Reverse Proxy

kong-2.8.1

已阅读文档 | Read the document

  • 已阅读 | Yes

描述 | Description

/api/app/latest 接口获取更新版本存在较大问题,不能正确获取最新版本,经过排查定位到以下代码。

def find_since_version(bundle_id, release_version, build_version)
releases.where("release_version >= '#{release_version}'")
.where("build_version > '#{build_version}'")
.where(bundle_id: bundle_id)
.order(id: :desc)
end

具体表现如下:
数据库认为版本号“1.0.10” 小于 “1.0.2” 大于 “1.0.1”。
SQL语句: select '1.0.10' > '1.0.1';
结果:t (true)
SQL语句: sselect '1.0.10' > '1.0.2';
结果:f (false)
同时 build_version 的比较也存在类似问题;
SQL语句: select '10' > '1';
结果:t (true)
SQL语句: sselect '10' > '2';
结果:f (false)
根本原因是postgres的字符串比较问题,导致/api/app/latest 产生了一些莫名其妙的Bug。

两种修复方案:

  1. postgres 安装pg_semver 扩展,以支持semver数据类型,修改release_version为semver类型,修改build_version为int类型。
  2. 将build_version字段数据类型改为int,修改build_version查询条件为>=, 并且去掉查询中release_version 的 where条件,仅比较 build_version 字段。

个人建议使用第二种方案进行修复,相比第一种较为简单,同时只根据build_version进行版本更新判断并无不妥, 毕竟build_version 只能为数字,且只能增大不能减小。

问题日志 | Relevant log output

No response

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions