PostgreSQL 詞法結(jié)構(gòu)

2021-08-26 17:14 更新
4.1.1. 標識符和關(guān)鍵詞
4.1.2. 常量
4.1.3. 操作符
4.1.4. 特殊字符
4.1.5. 注釋
4.1.6. 操作符優(yōu)先級

SQL輸入由一個命令序列組成。一個命令由一個記號的序列構(gòu)成,并由一個分號(;)終結(jié)。輸入流的末端也會標志一個命令的結(jié)束。具體哪些記號是合法的與具體命令的語法有關(guān)。

一個記號可以是一個關(guān)鍵詞、一個標識符、一個帶引號的標識符、一個literal(或常量)或者一個特殊字符符號。記號通常以空白(空格、制表符、新行)來分隔,但在無歧義時并不強制要求如此(唯一的例子是一個特殊字符緊挨著其他記號)。

例如,下面是一個(語法上)合法的SQL輸入:

SELECT * FROM MY_TABLE;
UPDATE MY_TABLE SET A = 5;
INSERT INTO MY_TABLE VALUES (3, 'hi there');

這是一個由三個命令組成的序列,每一行一個命令(盡管這不是必須地,在同一行中可以有超過一個命令,而且命令還可以被跨行分割)。

另外,注釋也可以出現(xiàn)在SQL輸入中。它們不是記號,它們和空白完全一樣。

根據(jù)標識命令、操作符、參數(shù)的記號不同,SQL的語法不很一致。最前面的一些記號通常是命令名,因此在上面的例子中我們通常會說一個SELECT、一個UPDATE和一個INSERT命令。但是例如UPDATE命令總是要求一個SET記號出現(xiàn)在一個特定位置,而INSERT則要求一個VALUES來完成命令。每個命令的精確語法規(guī)則在第 VI 部分中介紹。

4.1.1. 標識符和關(guān)鍵詞

上例中的SELECT、UPDATEVALUES記號是關(guān)鍵詞的例子,即SQL語言中具有特定意義的詞。記號MY_TABLEA則是標識符的例子。它們標識表、列或者其他數(shù)據(jù)庫對象的名字,取決于使用它們的命令。因此它們有時也被簡稱為名字。關(guān)鍵詞和標識符具有相同的詞法結(jié)構(gòu),這意味著我們無法在沒有語言知識的前提下區(qū)分一個標識符和關(guān)鍵詞。一個關(guān)鍵詞的完整列表可以在附錄 C中找到。

SQL標識符和關(guān)鍵詞必須以一個字母(a-z,也可以是帶變音符的字母和非拉丁字母)或一個下劃線(_)開始。后續(xù)字符可以是字母、下劃線(_)、數(shù)字(0-9)或美元符號($)。注意根據(jù)SQL標準的字母規(guī)定,美元符號是不允許出現(xiàn)在標識符中的,因此它們的使用可能會降低應(yīng)用的可移植性。SQL標準不會定義包含數(shù)字或者以下劃線開頭或結(jié)尾的關(guān)鍵詞,因此這種形式的標識符不會與未來可能的標準擴展沖突 。

系統(tǒng)中一個標識符的長度不能超過 NAMEDATALEN-1 字節(jié),在命令中可以寫超過此長度的標識符,但是它們會被截斷。默認情況下,NAMEDATALEN 的值為64,因此標識符的長度上限為63字節(jié)。如果這個限制有問題,可以在src/include/pg_config_manual.h中修改 NAMEDATALEN 常量。

關(guān)鍵詞和不被引號修飾的標識符是大小寫不敏感的。因此:

UPDATE MY_TABLE SET A = 5;

可以等價地寫成:

uPDaTE my_TabLE SeT a = 5;

一個常見的習(xí)慣是將關(guān)鍵詞寫成大寫,而名稱寫成小寫,例如:

UPDATE my_table SET a = 5;

這里還有第二種形式的標識符:受限標識符被引號修飾的標識符。它是由雙引號(")包圍的一個任意字符序列。一個受限標識符總是一個標識符而不會是一個關(guān)鍵字。因此"select"可以用于引用一個名為select的列或者表,而一個沒有引號修飾的select則會被當(dāng)作一個關(guān)鍵詞,從而在本應(yīng)使用表或列名的地方引起解析錯誤。在上例中使用受限標識符的例子如下:

UPDATE "my_table" SET "a" = 5;

受限標識符可以包含任何字符,除了代碼為0的字符(如果要包含一個雙引號,則寫兩個雙引號)。這使得可以構(gòu)建原本不被允許的表或列的名稱,例如包含空格或花號的名字。但是長度限制依然有效。

引用標識符也使其區(qū)分大小寫,而未引用的名稱總是折疊成小寫。例如,標識符FOO、foo"foo"PostgreSQL中被認為是相同的,但是"Foo""FOO"與這三個不同,并且彼此不同。(在PostgreSQL中,將不帶引號的名稱折疊為小寫與SQL標準不兼容,SQL標準規(guī)定不帶引號的名稱應(yīng)折疊為大寫。因此,根據(jù)標準,foo應(yīng)等同于"FOO"而不是"foo"。如果您想編寫可移植應(yīng)用程序,建議您始終引用某個特定的名稱,或者永遠不要引用它。)

一種受限標識符的變體允許包括轉(zhuǎn)義的用代碼點標識的Unicode字符。這種變體以U&(大寫或小寫U跟上一個花號)開始,后面緊跟雙引號修飾的名稱,兩者之間沒有任何空白,如U&"foo"(注意這里與操作符&似乎有一些混淆,但是在&操作符周圍使用空白避免了這個問題) 。在引號內(nèi),Unicode字符可以以轉(zhuǎn)義的形式指定:反斜線接上4位16進制代碼點號碼或者反斜線和加號接上6位16進制代碼點號碼。例如,標識符"data"可以寫成:

U&"d\0061t\+000061"

下面的例子用斯拉夫語字母寫出了俄語單詞 slon(大象):

U&"\0441\043B\043E\043D"

如果希望使用其他轉(zhuǎn)義字符來代替反斜線,可以在字符串后使用UESCAPE子句,例如:

U&"d!0061t!+000061" UESCAPE '!'

轉(zhuǎn)義字符可以是除了16進制位、加號、單引號、雙引號、空白字符之外的任意單個字符。請注意,轉(zhuǎn)義字符在 UESCAPE 之后用單引號而不是雙引號書寫。

為了在標識符中包括轉(zhuǎn)義字符本身,將其寫兩次即可。

4位或6位轉(zhuǎn)義形式都可以被用來定義UTF-16代理對來組成代碼點大于U+FFFF的字符,盡管6位形式的存在使得這種做法變得不必要(代理對并不被直接存儲,而是綁定成一個單獨的代碼點)。

如果服務(wù)器編碼不是UTF-8,則由其中一個轉(zhuǎn)義序列標識的Unicode代碼點轉(zhuǎn)換為實際的服務(wù)器編碼;如果不可能,則報告錯誤。

4.1.2. 常量

PostgreSQL中有三種隱式類型常量:字符串、位串和數(shù)字。常量也可以被指定顯示類型,這可以使得它被更精確地展示以及更有效地處理。這些選擇將會在后續(xù)小節(jié)中討論。

4.1.2.1. 字符串常量

在SQL中,一個字符串常量是一個由單引號(')包圍的任意字符序列,例如'This is a string'。為了在一個字符串中包括一個單引號,可以寫兩個相連的單引號,例如'Dianne''s horse'。注意這和一個雙引號("同。

兩個只由空白及至少一個新行分隔的字符串常量會被連接在一起,并且將作為一個寫在一起的字符串常量來對待。例如:

SELECT 'foo'
'bar';

等同于:

SELECT 'foobar';

但是:

SELECT 'foo'      'bar';

則不是合法的語法(這種有些奇怪的行為是SQL指定的,PostgreSQL遵循了該標準)。

4.1.2.2. C風(fēng)格轉(zhuǎn)義的字符串常量

PostgreSQL也接受轉(zhuǎn)義字符串常量,這也是SQL標準的一個擴展。一個轉(zhuǎn)義字符串常量可以通過在開單引號前面寫一個字母E(大寫或小寫形式)來指定,例如E'foo'(當(dāng)一個轉(zhuǎn)義字符串常量跨行時,只在第一個開引號之前寫E)。在一個轉(zhuǎn)義字符串內(nèi)部,一個反斜線字符(\)會開始一個 C 風(fēng)格的反斜線轉(zhuǎn)義序列,在其中反斜線和后續(xù)字符的組合表示一個特殊的字節(jié)值(如表 4.1中所示)。

表 4.1. 反斜線轉(zhuǎn)義序列

反斜線轉(zhuǎn)義序列解釋
\b退格
\f換頁
\n換行
\r回車
\t制表符
\o, \oo, \ooo (o = 0–7) 八進制字節(jié)值
\xh, \xhh (h = 0–9, A–F) 十六進制字節(jié)值
\uxxxx, \Uxxxxxxxx (x = 0–9, A–F) 16 或 32-位十六進制 Unicode 字符值

跟隨在一個反斜線后面的任何其他字符被當(dāng)做其字面意思。因此,要包括一個反斜線字符,請寫兩個反斜線(\\)。在一個轉(zhuǎn)義字符串中包括一個單引號除了普通方法''之外,還可以寫成\'。

你要負責(zé)保證你創(chuàng)建的字節(jié)序列由服務(wù)器字符集編碼中合法的字符組成,特別是在使用八進制或十六進制轉(zhuǎn)義時。一個有用的替代方法是使用Unicode轉(zhuǎn)義或替代的Unicode轉(zhuǎn)義語法,如 本文中帶有 Unicode 轉(zhuǎn)義的字符串常量 中所述;然后服務(wù)器將檢查字符轉(zhuǎn)換是否可行。

小心

如果配置參數(shù)standard_conforming_stringsoff,那么PostgreSQL對常規(guī)字符串常量和轉(zhuǎn)義字符串常量中的反斜線轉(zhuǎn)義都識別。不過,從PostgreSQL 9.1 開始,該參數(shù)的默認值為on,意味著只在轉(zhuǎn)義字符串常量中識別反斜線轉(zhuǎn)義。這種行為更兼容標準,但是可能打斷依賴于歷史行為(反斜線轉(zhuǎn)義總是會被識別)的應(yīng)用。作為一種變通,你可以設(shè)置該參數(shù)為off,但是最好遷移到符合新的行為。如果你需要使用一個反斜線轉(zhuǎn)義來表示一個特殊字符,為該字符串常量寫上一個E。

standard_conforming_strings之外,配置參數(shù)escape_string_warningbackslash_quote也決定了如何對待字符串常量中的反斜線。

代碼零的字符不能出現(xiàn)在一個字符串常量中。

4.1.2.3. 帶有 Unicode 轉(zhuǎn)義的字符串常量

PostgreSQL也支持另一種類型的字符串轉(zhuǎn)義語法,它允許用代碼點指定任意 Unicode 字符。一個 Unicode 轉(zhuǎn)義字符串常量開始于U&(大寫或小寫形式的字母 U,后跟花號),后面緊跟著開引號,之間沒有任何空白,例如U&'foo'(注意這產(chǎn)生了與操作符&的混淆。在操作符周圍使用空白來避免這個問題)。在引號內(nèi),Unicode 字符可以通過寫一個后跟 4 位十六進制代碼點編號或者一個前面有加號的 6 位十六進制代碼點編號的反斜線來指定。例如,字符串'data'可以被寫為

U&'d\0061t\+000061'

下面的例子用斯拉夫字母寫出了俄語的單詞slon(大象):

U&'\0441\043B\043E\043D'

如果想要一個不是反斜線的轉(zhuǎn)義字符,可以在字符串之后使用UESCAPE子句來指定,例如:

U&'d!0061t!+000061' UESCAPE '!'

轉(zhuǎn)義字符可以是出一個十六進制位、加號、單引號、雙引號或空白字符之外的任何單一字符。

要在一個字符串中包括一個表示其字面意思的轉(zhuǎn)義字符,把它寫兩次。

4位或6位轉(zhuǎn)義形式可用于指定UTF-16代理項對,以組成代碼點大于U+FFFF的字符,盡管從技術(shù)上講,6位形式的可用性使得這是不必要的(代理項對不是直接存儲的,而是合并到單個代碼點中。)

如果服務(wù)器編碼不是 UTF-8,則由這些轉(zhuǎn)義序列之一標識的 Unicode 代碼點將轉(zhuǎn)換為實際的服務(wù)器編碼; 如果不可能,則會報告錯誤。

此外,字符串常量的 Unicode 轉(zhuǎn)義語法僅在配置參數(shù) standard_conforming_strings 開啟時才有效。 這是因為否則這種語法可能會混淆解析 SQL 語句的客戶端,可能導(dǎo)致 SQL 注入和類似的安全問題。 如果該參數(shù)設(shè)置為 off,則此語法將被拒絕并顯示錯誤消息。

4.1.2.4. 美元引用的字符串常量

雖然用于指定字符串常量的標準語法通常都很方便,但是當(dāng)字符串中包含了很多單引號或反斜線時很難理解它,因為每一個都需要被雙寫。要在這種情形下允許可讀性更好的查詢,PostgreSQL提供了另一種被稱為美元引用的方式來書寫字符串常量。一個美元引用的字符串常量由一個美元符號($)、一個可選的另個或更多字符的標簽、另一個美元符號、一個構(gòu)成字符串內(nèi)容的任意字符序列、一個美元符號、開始這個美元引用的相同標簽和一個美元符號組成。例如,這里有兩種不同的方法使用美元引用指定字符串Dianne's horse

$$Dianne's horse$$
$SomeTag$Dianne's horse$SomeTag$

注意在美元引用字符串中,單引號可以在不被轉(zhuǎn)義的情況下使用。事實上,在一個美元引用字符串中不需要對字符進行轉(zhuǎn)義:字符串內(nèi)容總是按其字面意思寫出。反斜線不是特殊的,并且美元符號也不是特殊的,除非它們是匹配開標簽的一個序列的一部分。

可以通過在每一個嵌套級別上選擇不同的標簽來嵌套美元引用字符串常量。這最常被用在編寫函數(shù)定義上。例如:

$function$
BEGIN
    RETURN ($1 ~ $q$[\t\r\n\v\\]$q$);
END;
$function$

這里,序列$q$[\t\r\n\v\\]$q$表示一個美元引用的文字串[\t\r\n\v\\],當(dāng)該函數(shù)體被PostgreSQL執(zhí)行時它將被識別。但是因為該序列不匹配外層的美元引用的定界符$function$,它只是一些在外層字符串所關(guān)注的常量中的字符而已。

一個美元引用字符串的標簽(如果有)遵循一個未被引用標識符的相同規(guī)則,除了它不能包含一個美元符號之外。標簽是大小寫敏感的,因此$tag$String content$tag$是正確的,但是$TAG$String content$tag$不正確。

一個跟著一個關(guān)鍵詞或標識符的美元引用字符串必須用空白與之分隔開,否則美元引用定界符可能會被作為前面標識符的一部分。

美元引用不是 SQL 標準的一部分,但是在書寫復(fù)雜字符串文字方面,它常常是一種比兼容標準的單引號語法更方便的方法。當(dāng)要表示的字符串常量位于其他常量中時它特別有用,這種情況常常在過程函數(shù)定義中出現(xiàn)。如果用單引號語法,上一個例子中的每個反斜線將必須被寫成四個反斜線,這在解析原始字符串常量時會被縮減到兩個反斜線,并且接著在函數(shù)執(zhí)行期間重新解析內(nèi)層字符串常量時變成一個。

4.1.2.5. 位串常量

位串常量看起來像常規(guī)字符串常量在開引號之前(中間無空白)加了一個B(大寫或小寫形式),例如B'1001'。位串常量中允許的字符只有01。

作為一種選擇,位串常量可以用十六進制記號法指定,使用一個前導(dǎo)X(大寫或小寫形式),例如X'1FF'。這種記號法等價于一個用四個二進制位取代每個十六進制位的位串常量。

兩種形式的位串常量可以以常規(guī)字符串常量相同的方式跨行繼續(xù)。美元引用不能被用在位串常量中。

4.1.2.6. 數(shù)字常量

在這些一般形式中可以接受數(shù)字常量:

digits digits.[digits][e[+-]digits][digits].digits[e[+-]digits]digitse[+-]digits

其中digits是一個或多個十進制數(shù)字(0 到 9)。如果使用了小數(shù)點,在小數(shù)點前面或后面必須至少有一個數(shù)字。如果存在一個指數(shù)標記(e),在其后必須跟著至少一個數(shù)字。在該常量中不能嵌入任何空白或其他字符。注意任何前導(dǎo)的加號或減號并不實際被考慮為常量的一部分,它是一個應(yīng)用到該常量的操作符。

這些是合法數(shù)字常量的例子:


42
3.5
4.
.001
5e2
1.925e-3

如果一個不包含小數(shù)點和指數(shù)的數(shù)字常量的值適合類型integer(32 位),它首先被假定為類型integer。否則如果它的值適合類型bigint(64 位),它被假定為類型bigint。再否則它會被取做類型numeric。包含小數(shù)點和/或指數(shù)的常量總是首先被假定為類型numeric。

一個數(shù)字常量初始指派的數(shù)據(jù)類型只是類型轉(zhuǎn)換算法的一個開始點。在大部分情況中,常量將被根據(jù)上下文自動被強制到最合適的類型。必要時,你可以通過造型它來強制一個數(shù)字值被解釋為一種指定數(shù)據(jù)類型。例如,你可以這樣強制一個數(shù)字值被當(dāng)做類型realfloat4):

REAL '1.23'  -- string style
1.23::REAL   -- PostgreSQL (historical) style

這些實際上只是接下來要討論的一般造型記號的特例。

4.1.2.7. 其他類型的常量

一種任意類型的一個常量可以使用下列記號中的任意一種輸入:

type 'string''string'::typeCAST ( 'string' AS type )

字符串常量的文本被傳遞到名為type的類型的輸入轉(zhuǎn)換例程中。其結(jié)果是指定類型的一個常量。如果對該常量的類型沒有歧義(例如,當(dāng)它被直接指派給一個表列時),顯式類型造型可以被忽略,在那種情況下它會被自動強制。

字符串常量可以使用常規(guī) SQL 記號或美元引用書寫。

也可以使用一個類似函數(shù)的語法來指定一個類型強制:

typename ( 'string' )

但是并非所有類型名都可以用在這種方法中,詳見第 4.2.9 節(jié)

第 4.2.9 節(jié)中討論的,::、CAST()以及函數(shù)調(diào)用語法也可以被用來指定任意表達式的運行時類型轉(zhuǎn)換。要避免語法歧義,type 'string'語法只能被用來指定簡單文字常量的類型。type 'string'語法上的另一個限制是它無法對數(shù)組類型工作,指定一個數(shù)組常量的類型可使用::CAST()。

CAST()語法符合 SQL。type 'string'語法是該標準的一般化:SQL 指定這種語法只用于一些數(shù)據(jù)類型,但是PostgreSQL允許它用于所有類型。帶有::的語法是PostgreSQL的歷史用法,就像函數(shù)調(diào)用語法一樣。

4.1.3. 操作符

一個操作符名是最多NAMEDATALEN-1(默認為 63)的一個字符序列,其中的字符來自下面的列表:


+ - * / < > = ~ ! @ # % ^ & | ` ?

不過,在操作符名上有一些限制:

  • -- and /*不能在一個操作符名的任何地方出現(xiàn),因為它們將被作為一段注釋的開始。

  • 一個多字符操作符名不能以+-結(jié)尾,除非該名稱也至少包含這些字符中的一個:


    ~ ! @ # % ^ & | ` ?

    例如,@-是一個被允許的操作符名,但*-不是。這些限制允許PostgreSQL解析 SQL 兼容的查詢而不需要在記號之間有空格。

當(dāng)使用非 SQL 標準的操作符名時,你通常需要用空格分隔相鄰的操作符來避免歧義。例如,如果你定義了一個名為@的左一元操作符,你不能寫X*@Y,你必須寫X* @Y來確保PostgreSQL把它讀作兩個操作符名而不是一個。

4.1.4. 特殊字符

一些不是數(shù)字字母的字符有一種不同于作為操作符的特殊含義。這些字符的詳細用法可以在描述相應(yīng)語法元素的地方找到。這一節(jié)只是為了告知它們的存在以及總結(jié)這些字符的目的。

  • 跟隨在一個美元符號($)后面的數(shù)字被用來表示在一個函數(shù)定義或一個預(yù)備語句中的位置參數(shù)。在其他上下文中該美元符號可以作為一個標識符或者一個美元引用字符串常量的一部分。

  • 圓括號(())具有它們通常的含義,用來分組表達式并且強制優(yōu)先。在某些情況中,圓括號被要求作為一個特定 SQL 命令的固定語法的一部分。

  • 方括號([])被用來選擇一個數(shù)組中的元素。更多關(guān)于數(shù)組的信息見第 8.15 節(jié)。

  • 逗號(,)被用在某些語法結(jié)構(gòu)中來分割一個列表的元素。

  • 分號(;)結(jié)束一個 SQL 命令。它不能出現(xiàn)在一個命令中間的任何位置,除了在一個字符串常量中或者一個被引用的標識符中。

  • 冒號(:)被用來從數(shù)組中選擇切片(見第 8.15 節(jié))。在某些 SQL 的“方言”(例如嵌入式 SQL)中,冒號被用來作為變量名的前綴。

  • 星號(*)被用在某些上下文中標記一個表的所有域或者組合值。當(dāng)它被用作一個聚集函數(shù)的參數(shù)時,它還有一種特殊的含義,即該聚集不要求任何顯式參數(shù)。

  • 句點(.)被用在數(shù)字常量中,并且被用來分割模式、表和列名。

4.1.5. 注釋

一段注釋是以雙橫杠開始并且延伸到行結(jié)尾的一個字符序列,例如:

-- This is a standard SQL comment

另外,也可以使用 C 風(fēng)格注釋塊:

/* multiline comment
 * with nesting: /* nested block comment */
 */

這里該注釋開始于/*并且延伸到匹配出現(xiàn)的*/。這些注釋塊可按照 SQL 標準中指定的方式嵌套,但和 C 中不同。這樣我們可以注釋掉一大段可能包含注釋塊的代碼。

在進一步的語法分析前,注釋會被從輸入流中被移除并且實際被替換為空白。

4.1.6. 操作符優(yōu)先級

表 4.2顯示了PostgreSQL中操作符的優(yōu)先級和結(jié)合性。大部分操作符具有相同的優(yōu)先并且是左結(jié)合的。操作符的優(yōu)先級和結(jié)合性被硬寫在解析器中。 如果您希望以不同于優(yōu)先級規(guī)則所暗示的方式解析具有多個運算符的表達式,請?zhí)砑永ㄌ枴?

表 4.2. 操作符優(yōu)先級(從高到低)

操作符/元素結(jié)合性描述
.表/列名分隔符
::PostgreSQL-風(fēng)格的類型轉(zhuǎn)換
[ ]數(shù)組元素選擇
+ -一元加、一元減
^指數(shù)
* / %乘、除、模
+ -加、減
(任意其他操作符)所有其他本地以及用戶定義的操作符
BETWEEN IN LIKE ILIKE SIMILAR 范圍包含、集合成員關(guān)系、字符串匹配
< > = <= >= <>  比較操作符
IS ISNULL NOTNULL IS TRUE、IS FALSE、IS NULL、IS DISTINCT FROM
NOT邏輯否定
AND邏輯合取
OR邏輯析取

注意該操作符有限規(guī)則也適用于與上述內(nèi)建操作符具有相同名稱的用戶定義的操作符。例如,如果你為某種自定義數(shù)據(jù)類型定義了一個+操作符,它將具有和內(nèi)建的+操作符相同的優(yōu)先級,不管你的操作符要做什么。

當(dāng)一個模式限定的操作符名被用在OPERATOR語法中時,如下面的例子:

SELECT 3 OPERATOR(pg_catalog.+) 4;

OPERATOR結(jié)構(gòu)被用來為任意其他操作符獲得表 4.2中默認的優(yōu)先級。不管出現(xiàn)在OPERATOR()中的是哪個指定操作符,這都是真的。

注意

版本 9.5 之前的PostgreSQL使用的操作符優(yōu)先級 規(guī)則略有不同。特別是,<=、>=<>習(xí)慣于被當(dāng)作普通操作符,IS 測試習(xí)慣于具有較高的優(yōu)先級。并且在一些認為NOTBETWEEN優(yōu)先級高的情況下,NOT BETWEEN 和相關(guān)的結(jié)構(gòu)的行為不一致。為了更好地兼容 SQL 標準并且減少對 邏輯上等價的結(jié)構(gòu)不一致的處理,這些規(guī)則也得到了修改。在大部分情況下, 這些變化不會導(dǎo)致行為上的變化,或者可能會產(chǎn)生no such operator 錯誤,但可以通過增加圓括號解決。不過在一些極端情況中,查詢可能在 沒有被報告解析錯誤的情況下發(fā)生行為的改變。如果你發(fā)覺這些改變悄悄地 破壞了一些事情,可以打開operator_precedence_warning 配置參數(shù),然后測試你的應(yīng)用看看有沒有一些警告被記錄。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號