
createExtension函数
首先看createExtension函数,该函数首先调用check_valid_extension_name函数在任何访问文件系统之前检测extension的名字的合法性;调用get_extension_oid检测数据库是否已经安装该扩展(参加PostgreSQL数据库TableAM——systable操作);使用全局变量creating_extension确保同一时刻只能创建一个扩展;通过遍历CreateExtensionStmt结构体,初始化d_schema、d_new_version、d_old_version、d_cascade等变量;最后调用CreateExtensionInternal(stmt->extname, schemaName, versionName, oldVersionName, cascade, NIL, true)函数。
CreateExtensionInternal函数
static ObjectAddress CreateExtensionInternal(char *extensionName, char *schemaName, const char *versionName, const char *oldVersionName, bool cascade, List *parents, bool is_create)当指定cascade,如果依赖的扩展需要被安装,则会递归调用CreateExtensionInternal函数。parent列表参数包含已经安装的扩展。
read_extension_control_file读取primary control file,主要调用parse_extension_control_file函数。parse_extension_control_file函数解析控制文件,取出调用具体版本,文件名等信息。如果version为NULL,则进行primary file的处理;否则进行optional auxiliary文件的处理。get_extension_control_filename(control->name)函数获取文件全路径sharepath/extension/extname.control。将文件内容读取并将键值内容转换ConfigVariable列表,并将其值赋给ExtensionControlFile结构体相应的成员。
CreateExtensionInternal函数如果没有获得versionName,则需要取pcontrol->default_version作为versionName。
CreateExtensionInternal函数下面的逻辑是寻找指定版本扩展的脚本,如果没有该版本的脚本,则寻找更新版本的脚本(identify_update_path)。
get_extension_script_filename函数调用如下:
get_ext_ver_list():遍历所有.sql文件获取所有版本节点。
find_install_path():根据目标节点选择最短路径以及相对应的起始节点。
find_update_path():最短路径算法Dijkstra的实现。
get_extension_script_filename获取sql文件名,规则如下:
版本命名的规则:扩展名 +“–”+“版本号”+ .sql (eg:cube–1.2.sql)
版本与版本之间的升级采用“–”连接。(eg:cube–1.2–1.3.sql)
Target 版本由控制文件中的default_version确定。
根据目标版本选择最短路径。

为需要按照的目标版本获取control参数,read_extension_aux_control_file获取aux控制文件ExtensionControlFile结构体。
先通过schemaName获取schemaOid,如果control->schema不为NULL,使用control->schema作为schemaName,再通过该schemaName获取schemaOid,如果不存在相关schemaOid,则通过CreateSchemaCommand创建Schema。
如果control->schema为NULL,判别先通过schemaName获取的schemaOid是否为合法,不合法则从默认creation namespace获取该schemaOid所代表的scchemaName。
查找该扩展依赖的其他扩展,并安装它们,并将get_required_extension和get_extension_schema函数放入get_extension_schema和requiredSchemas列表。
InsertExtensionTuple():把控制文件的信息保存到Tuple中。
execute_sql_string():解析sql文件。先调用pg_parse_query将sql转换成parsetree_list。
然后执行pg_analyze_and_rewrite(),pg_plan_queries(),ExecutorRun()对每一个parse tree重写执行。

















