当前位置: 首页 > news >正文

网站如何建设手机版网页微信文件夹储存在什么位置

网站如何建设手机版,网页微信文件夹储存在什么位置,长沙微推广平台,网站系统ALTER TABLE(SET attribute_option) ATExecSetOptions 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。…

ALTER TABLE(SET attribute_option)

  • ATExecSetOptions 函数

声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。
本文主要参考了 OpenGauss5.1.0 的开源代码和《OpenGauss数据库源码解析》一书

  ALTER COLUMN ... SET attribute_option 是一种 SQL 命令,用于修改数据库表中特定列的属性选项。在 OpenGauss 中,这种命令可以用来改变列的默认值、是否允许为空、数据类型等属性,以满足不同的业务需求或数据结构变更。
  在 OpenGauss 的源代码中,处理 ALTER COLUMN SETALTER COLUMN RESET 的逻辑通常涉及到调用 ATExecSetOptions 函数。例如,当 SQL 命令中包含 SET ( options ) 时,会执行 ATExecSetOptions 函数来实际应用这些选项,而当包含 RESET ( options ) 时,则会反向执行这些选项的重置操作
  ATExecSetOptions 函数的作用是根据传入的参数,对指定表的特定列应用或重置属性选项。这包括解析和验证命令中的选项,然后更新表的元数据,确保数据库表的结构变更符合预期并且安全。这个函数不仅仅负责修改列的默认值,还可能涉及到其他属性的调整,如约束条件或索引的更新
  总之,通过 ALTER COLUMN ... SET attribute_option 命令和相关的函数调用,OpenGauss 提供了强大的能力来动态调整和管理数据库表的结构,从而支持复杂的应用和业务需求变化。

ATExecSetOptions 函数

  ATExecSetOptions 函数是实现 ALTER COLUMN ... SET/RESET attribute_option 功能的核心逻辑。它通过修改指定表中特定列的属性选项,包括默认值是否允许为空等,具体步骤包括打开系统表获取目标列的元数据验证和更新选项值,最后将修改应用到系统目录并确保索引更新,从而保证数据库表结构的变更和一致性。其执行流程如下:

  1. 打开 pg_attribute 系统表,获取对应关系的独占锁。
  2. 在系统缓存中搜索并获取指定列名的元组
  3. 如果未找到有效的列元组,报错指示指定的列在目标表中不存在
  4. 从列元组中获取列的属性信息,包括列号attnum)等。
  5. 验证传入的选项参数确保其为列表(List)类型,并禁止为系统列设置选项。
  6. 根据传入的选项,使用 transformRelOptions 函数生成新的属性选项attoptions)的文本数组。
  7. 调用 attribute_reloptions 函数验证新生成的选项是否合法
  8. 准备一个新的替换数组,根据新选项是否为 NULL 设置相应的值。
  9. 使用 tableam_tops_modify_tuple 函数构建新的 HeapTuple 对象,用于更新系统表中的列元组。
  10. 释放之前获取的原始列元组缓存
  11. 使用 simple_heap_update 函数将更新后的新元组写入系统表中,并更新系统表的索引
  12. 设置返回的对象地址,指示操作的对象为目标表中的指定列
  13. 释放不再需要的 HeapTuple 对象。
  14. 关闭 pg_attribute 系统表,释放其占用的独占锁。
  15. 返回最终的对象地址,表示 ALTER COLUMN ... SET 操作的成功完成。

  函数源码如下所示:(路径:src\gausskernel\optimizer\commands\tablecmds.cpp

static ObjectAddress ATExecSetOptions(Relation rel, const char* colName, Node* options, bool isReset, LOCKMODE lockmode)
{// 打开属性关系的堆表Relation attrelation;// 原始元组、新元组和属性元组HeapTuple tuple, newtuple;Form_pg_attribute attrtuple;// 列号AttrNumber  attnum;// 数据、新选项Datum datum, newOptions;bool isnull = false;// 替换值数组Datum repl_val[Natts_pg_attribute];// 替换空值标志数组bool repl_null[Natts_pg_attribute];// 替换标志数组bool repl_repl[Natts_pg_attribute];// 返回对象地址ObjectAddress address;// 打开属性关系表attrelation = heap_open(AttributeRelationId, RowExclusiveLock);// 根据列名从系统缓存中查找元组tuple = SearchSysCacheAttName(RelationGetRelid(rel), colName);// 如果未找到有效元组,报错if (!HeapTupleIsValid(tuple))ereport(ERROR,(errcode(ERRCODE_UNDEFINED_COLUMN),errmsg("column \"%s\" of relation \"%s\" does not exist", colName, RelationGetRelationName(rel))));// 获取属性元组结构attrtuple = (Form_pg_attribute)GETSTRUCT(tuple);// 获取列号attnum = attrtuple->attnum;// 如果列号小于等于0,报错(不支持修改系统列)if (attnum <= 0)ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot alter system column \"%s\"", colName)));// 断言选项为列表类型Assert(IsA(options, List));// 禁止为属性设置选项ForbidToSetOptionsForAttribute((List*)options);// 生成新的建议 attoptions(文本数组)datum = SysCacheGetAttr(ATTNAME, tuple, Anum_pg_attribute_attoptions, &isnull);newOptions = transformRelOptions(isnull ? (Datum)0 : datum, (List*)options, NULL, NULL, false, isReset);// 验证新选项(void)attribute_reloptions(newOptions, true);// 构建新元组rc = memset_s(repl_null, sizeof(repl_null), false, sizeof(repl_null));securec_check(rc, "\0", "\0");rc = memset_s(repl_repl, sizeof(repl_repl), false, sizeof(repl_repl));securec_check(rc, "\0", "\0");// 构建新的元组并更新if (newOptions != (Datum)0)repl_val[Anum_pg_attribute_attoptions - 1] = newOptions;elserepl_null[Anum_pg_attribute_attoptions - 1] = true;repl_repl[Anum_pg_attribute_attoptions - 1] = true;newtuple = (HeapTuple) tableam_tops_modify_tuple(tuple, RelationGetDescr(attrelation), repl_val, repl_null, repl_repl);ReleaseSysCache(tuple);// 更新系统目录simple_heap_update(attrelation, &newtuple->t_self, newtuple);CatalogUpdateIndexes(attrelation, newtuple);ObjectAddressSubSet(address, RelationRelationId,RelationGetRelid(rel), attnum);tableam_tops_free_tuple(newtuple);// 关闭属性关系表heap_close(attrelation, RowExclusiveLock);// 返回对象地址return address;
}
http://www.yayakq.cn/news/564736/

相关文章:

  • 游戏ui设计师网站有哪些阿里云1M做网站
  • 该网站受海外服务器保护西安有哪些互联网公司
  • 企业手机网站cms系统腾讯推广联盟
  • wordpress 多个边栏网站建设优化石家庄
  • 做网站年入百万人力资源公司注册
  • 网站打开慢的解决方法seo的含义
  • 大连专业做网站西地那非片能延时多久有副作用吗
  • 手机网站建设的重点步骤郑州专业个人网站建设
  • 网站怎么盈利的个人网页生成器
  • 建筑案例的网站有哪些方面wordpress搜索用户
  • 网站的新闻栏与产品栏如何做金昌百度seo
  • 快照打开是网站网站不会做网站如何做seo
  • 部门规划书 网站建设手机网站相关
  • 东莞网站设地制作企业网站页面html
  • 上海中国建设银行招聘信息网站谷歌网站收录提交
  • 美丽说网站模板新葡京网址网站建设
  • 浏览器打开网站404关系建设的网站
  • 网站正在备案二十条优化
  • 做一家网站的成本商标查询网站
  • 甘肃企业模板建站信息自学网站开发软件开发
  • 成都知名网站建设公司句容网站建设开发
  • 自学python的网站小破站下载
  • 网站建设与维护试题含答案做下载网站用阿里云的什么产品
  • 做外贸如何浏览国外网站今天的新闻热点
  • 沈阳手机网站聚美优品网站建设的特点
  • 微信能否做门户网站深圳代理记账公司前十名
  • adsl服务器建网站怎么使用wordpress做网站
  • 网站开发怎么写源代码如何做网站
  • 承德网站推广天津网站建设班
  • 两个网站用一个空间长春网易网站建设