查詢透過 TCP/IP 或 Unix Domain 套接字的傳入資料包到達後端。它被載入到一個字串中,然後傳遞給解析器(parser),在那裡詞法掃描器 scan.l 將查詢分解成標記(詞語)。解析器使用 gram.y 和標記來識別查詢型別,並載入適當的特定於查詢的結構,例如 CreateStmt 或 SelectStmt。
然後,語句被識別為複雜語句(SELECT / INSERT / UPDATE / DELETE)或簡單語句,例如 CREATE ROLE, ANALYZE, 等。不需要執行器的簡單實用命令由 命令(commands)模組中的特定於語句的函式處理。複雜語句需要更多的處理。
解析器接收復雜查詢,並建立一個包含複雜查詢所使用的所有元素的Query結構。Query.jointree 儲存FROM和WHERE子句,它由 transformFromClause() 和 transformWhereClause() 填充。查詢中引用的每個表都由一個 RangeTblEntry 表示,它們被連結在一起形成查詢的範圍表(range table),該表由 transformFromClause() 生成。Query.rtable 儲存查詢的範圍表。
某些查詢,如SELECT,返回資料列。其他查詢,如INSERT和UPDATE,指定被查詢修改的列。這些列引用被轉換為 TargetEntry 條目,它們被連結在一起構成查詢的目標列表(target list)。目標列表儲存在 Query.targetList 中,它由 transformTargetList() 生成。
其他查詢元素,例如聚合函式(SUM())、GROUP BY 和ORDER BY 也儲存在各自的 Query 欄位中。
下一步是將 Query 由可能適用的檢視(VIEWS)或規則(RULES)進行修改。這是由 重寫(rewrite)系統執行的。
最佳化器(optimizer)使用 Query 結構來確定 RangeTable 中每個表的最佳表連線順序和連線型別,使用 Query.jointree(FROM和WHERE子句)來考慮最佳索引使用。
然後,路徑(path)模組生成一個最佳的Plan,其中包含執行查詢所需的操作。然後,Plan 被傳遞給執行器(executor)進行執行,並將結果返回給客戶端。Plan 實際上是一組節點,以樹形結構排列,有一個頂層節點和各種子節點。
還有許多其他模組支援此基本功能。可以透過點選流程圖來訪問它們。