rawsql-ts 0.1.0-beta.5 → 0.1.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +13 -0
- package/dist/models/BinarySelectQuery.d.ts +91 -0
- package/dist/models/Clause.d.ts +189 -0
- package/dist/models/KeywordTrie.d.ts +11 -0
- package/dist/models/Lexeme.d.ts +25 -0
- package/dist/models/SelectQuery.d.ts +5 -0
- package/dist/models/SimpleSelectQuery.d.ts +167 -0
- package/dist/models/SqlComponent.d.ts +18 -0
- package/dist/models/ValueComponent.d.ts +158 -0
- package/dist/models/ValuesQuery.d.ts +10 -0
- package/dist/parsers/CommandExpressionParser.d.ts +15 -0
- package/dist/parsers/CommonTableParser.d.ts +9 -0
- package/dist/parsers/ForClauseParser.d.ts +9 -0
- package/dist/parsers/FromClauseParser.d.ts +9 -0
- package/dist/parsers/FunctionExpressionParser.d.ts +22 -0
- package/dist/parsers/GroupByParser.d.ts +10 -0
- package/dist/parsers/HavingParser.d.ts +9 -0
- package/dist/parsers/IdentifierParser.d.ts +8 -0
- package/dist/parsers/JoinClauseParser.d.ts +14 -0
- package/dist/parsers/KeywordParser.d.ts +17 -0
- package/dist/parsers/LimitClauseParser.d.ts +9 -0
- package/dist/parsers/LiteralParser.d.ts +8 -0
- package/dist/parsers/OrderByClauseParser.d.ts +10 -0
- package/dist/parsers/OverExpressionParser.d.ts +9 -0
- package/dist/parsers/ParameterExpressionParser.d.ts +8 -0
- package/dist/parsers/ParenExpressionParser.d.ts +8 -0
- package/dist/parsers/PartitionByParser.d.ts +9 -0
- package/dist/parsers/SelectClauseParser.d.ts +10 -0
- package/dist/parsers/SelectQueryParser.d.ts +13 -0
- package/dist/parsers/SourceAliasExpressionParser.d.ts +8 -0
- package/dist/parsers/SourceExpressionParser.d.ts +8 -0
- package/dist/parsers/SourceParser.d.ts +13 -0
- package/dist/parsers/SqlTokenizer.d.ts +64 -0
- package/dist/parsers/StringSpecifierExpressionParser.d.ts +8 -0
- package/dist/parsers/UnaryExpressionParser.d.ts +8 -0
- package/dist/parsers/ValueParser.d.ts +14 -0
- package/dist/parsers/ValuesQueryParser.d.ts +10 -0
- package/dist/parsers/WhereClauseParser.d.ts +9 -0
- package/dist/parsers/WindowClauseParser.d.ts +9 -0
- package/dist/parsers/WindowExpressionParser.d.ts +12 -0
- package/dist/parsers/WithClauseParser.d.ts +9 -0
- package/dist/tokenReaders/BaseTokenReader.d.ts +43 -0
- package/dist/tokenReaders/CommandTokenReader.d.ts +7 -0
- package/dist/tokenReaders/FunctionTokenReader.d.ts +11 -0
- package/dist/tokenReaders/IdentifierTokenReader.d.ts +15 -0
- package/dist/tokenReaders/LiteralTokenReader.d.ts +23 -0
- package/dist/tokenReaders/OperatorTokenReader.d.ts +5 -0
- package/dist/tokenReaders/ParameterTokenReader.d.ts +11 -0
- package/dist/tokenReaders/StringSpecifierTokenReader.d.ts +8 -0
- package/dist/tokenReaders/SymbolTokenReader.d.ts +12 -0
- package/dist/tokenReaders/TokenReaderManager.d.ts +53 -0
- package/dist/tokenReaders/TypeTokenReader.d.ts +11 -0
- package/dist/transformers/CTEBuilder.d.ts +52 -0
- package/dist/transformers/CTECollector.d.ts +81 -0
- package/dist/transformers/CTEDisabler.d.ts +77 -0
- package/dist/transformers/CTEInjector.d.ts +40 -0
- package/dist/transformers/CTENormalizer.d.ts +25 -0
- package/dist/transformers/Formatter.d.ts +67 -0
- package/dist/transformers/QueryNormalizer.d.ts +37 -0
- package/dist/transformers/SelectValueCollector.d.ts +62 -0
- package/dist/transformers/SelectableColumnCollector.d.ts +70 -0
- package/dist/transformers/TableSourceCollector.d.ts +92 -0
- package/dist/transformers/UpstreamSelectQueryFinder.d.ts +27 -0
- package/dist/utils/charLookupTable.d.ts +11 -0
- package/dist/utils/stringUtils.d.ts +43 -0
- package/package.json +7 -3
- package/src/index.d.ts +378 -0
- package/.vs/CopilotSnapshots/02E79E48DFF5234787CB618DE990598A/48814CCF3E4E4B44A66AB8BC7D6CF6B6/904140CF7EDF0C98AEA45F0D36062FE1 +0 -1
- package/.vs/CopilotSnapshots/02E79E48DFF5234787CB618DE990598A/48814CCF3E4E4B44A66AB8BC7D6CF6B6/A32D1DB906C73FA74EF270AAEE165FC0 +0 -86
- package/.vs/CopilotSnapshots/02E79E48DFF5234787CB618DE990598A/48814CCF3E4E4B44A66AB8BC7D6CF6B6/E621434FB1D5415B14FBBCC11967E420 +0 -34
- package/.vs/CopilotSnapshots/02E79E48DFF5234787CB618DE990598A/48814CCF3E4E4B44A66AB8BC7D6CF6B6/EF71788BE39818EEA3F0164DC15E1BD7 +0 -170
- package/.vs/CopilotSnapshots/02E79E48DFF5234787CB618DE990598A/state.mpack +0 -1
- package/.vs/CopilotSnapshots/07B1013C385C5641A5F5100E0751210B/0C73C015B2C859419AFBD08BE1343FC0/BA5D2B145A59265D63FA3B3584344B02 +0 -236
- package/.vs/CopilotSnapshots/07B1013C385C5641A5F5100E0751210B/state.mpack +0 -1
- package/.vs/CopilotSnapshots/0D03762A9EA0CB4885F2114567F23F93/A9AF50781E77B849AA3262D2738D9338/1F95FD72006ED6E92629CEFD7B2C4FEC +0 -1
- package/.vs/CopilotSnapshots/0D03762A9EA0CB4885F2114567F23F93/A9AF50781E77B849AA3262D2738D9338/4CA7B9D3BC2D0A498DC0777EDA3F9B0F +0 -1
- package/.vs/CopilotSnapshots/0D03762A9EA0CB4885F2114567F23F93/A9AF50781E77B849AA3262D2738D9338/7B623BFBAEB4EB61A9585F0BC8039B06 +0 -19
- package/.vs/CopilotSnapshots/0D03762A9EA0CB4885F2114567F23F93/CA94452964F7A94B8ECE3B54EE21B50F/1F95FD72006ED6E92629CEFD7B2C4FEC +0 -5
- package/.vs/CopilotSnapshots/0D03762A9EA0CB4885F2114567F23F93/CA94452964F7A94B8ECE3B54EE21B50F/4CA7B9D3BC2D0A498DC0777EDA3F9B0F +0 -3
- package/.vs/CopilotSnapshots/0D03762A9EA0CB4885F2114567F23F93/CA94452964F7A94B8ECE3B54EE21B50F/7B623BFBAEB4EB61A9585F0BC8039B06 +0 -21
- package/.vs/CopilotSnapshots/0D03762A9EA0CB4885F2114567F23F93/state.mpack +0 -1
- package/.vs/CopilotSnapshots/10B71DC3C4C1C04E8602FA06D3925F98/23B181EB1228EF40ABCEF51E89FBF6E6/41035D2B1D57326B55F66372017E223A +0 -1
- package/.vs/CopilotSnapshots/10B71DC3C4C1C04E8602FA06D3925F98/23B181EB1228EF40ABCEF51E89FBF6E6/45EABF6EF6BDFAA58C941A29E98C9C83 +0 -113
- package/.vs/CopilotSnapshots/10B71DC3C4C1C04E8602FA06D3925F98/23B181EB1228EF40ABCEF51E89FBF6E6/748E0B8859CA1A5FDCA675C9E53B6D1C +0 -1
- package/.vs/CopilotSnapshots/10B71DC3C4C1C04E8602FA06D3925F98/23B181EB1228EF40ABCEF51E89FBF6E6/A250FF4AD59546A65FFDC6AA92A4698E +0 -1
- package/.vs/CopilotSnapshots/10B71DC3C4C1C04E8602FA06D3925F98/23B181EB1228EF40ABCEF51E89FBF6E6/C42432BC73D8AA122171FAB6EEB13CBC +0 -19
- package/.vs/CopilotSnapshots/10B71DC3C4C1C04E8602FA06D3925F98/state.mpack +0 -1
- package/.vs/CopilotSnapshots/13B40109875D434BB24880356492BE7E/828B96E81CC7014B887AA519767FACC3/437DAEC1EBBAF4F25ABA1B6A25EB6933 +0 -25
- package/.vs/CopilotSnapshots/13B40109875D434BB24880356492BE7E/state.mpack +0 -1
- package/.vs/CopilotSnapshots/245168908540D646ACBD4FDE8D6DD2D4/1CDE8BAB21868E4D893E119554BA87E5/904140CF7EDF0C98AEA45F0D36062FE1 +0 -63
- package/.vs/CopilotSnapshots/245168908540D646ACBD4FDE8D6DD2D4/1CDE8BAB21868E4D893E119554BA87E5/DFF70C60F68ECD9A4E4C3C74E4CC4DEE +0 -1
- package/.vs/CopilotSnapshots/245168908540D646ACBD4FDE8D6DD2D4/1CDE8BAB21868E4D893E119554BA87E5/EF71788BE39818EEA3F0164DC15E1BD7 +0 -170
- package/.vs/CopilotSnapshots/245168908540D646ACBD4FDE8D6DD2D4/state.mpack +0 -1
- package/.vs/CopilotSnapshots/3BACC9346120824DB30006E353477163/87C831E9EA1AA249A25A44D08CF8E0B5/EF71788BE39818EEA3F0164DC15E1BD7 +0 -328
- package/.vs/CopilotSnapshots/3BACC9346120824DB30006E353477163/state.mpack +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/14FE66AD0B834E488EECD9594AE72472/23E7151F0483C5BB5E663F83D4962FD4 +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/14FE66AD0B834E488EECD9594AE72472/2D4DCEBC89D52B097AEEEABA23C0EB59 +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/14FE66AD0B834E488EECD9594AE72472/7C951A8A572EA5C371FDE657AF968B9C +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/14FE66AD0B834E488EECD9594AE72472/A32D1DB906C73FA74EF270AAEE165FC0 +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/14FE66AD0B834E488EECD9594AE72472/B692C85119711C76235AA5D78F9F3818 +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/14FE66AD0B834E488EECD9594AE72472/E602628EF6D764C2C267810C92906DBA +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/14FE66AD0B834E488EECD9594AE72472/E621434FB1D5415B14FBBCC11967E420 +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/9C5A45FA50D5344FBB275F406599FF4E/23E7151F0483C5BB5E663F83D4962FD4 +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/9C5A45FA50D5344FBB275F406599FF4E/2D4DCEBC89D52B097AEEEABA23C0EB59 +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/9C5A45FA50D5344FBB275F406599FF4E/7C951A8A572EA5C371FDE657AF968B9C +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/9C5A45FA50D5344FBB275F406599FF4E/A32D1DB906C73FA74EF270AAEE165FC0 +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/9C5A45FA50D5344FBB275F406599FF4E/B692C85119711C76235AA5D78F9F3818 +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/9C5A45FA50D5344FBB275F406599FF4E/E602628EF6D764C2C267810C92906DBA +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/9C5A45FA50D5344FBB275F406599FF4E/E621434FB1D5415B14FBBCC11967E420 +0 -1
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/9C5A45FA50D5344FBB275F406599FF4E/EF71788BE39818EEA3F0164DC15E1BD7 +0 -489
- package/.vs/CopilotSnapshots/3EFABA5D1530804CA04C606F5EFDDC38/state.mpack +0 -1
- package/.vs/CopilotSnapshots/4C16AB71DC018C46A734FBF0BF4AEDD9/0E5F1D40C0CAE848B8F9457F29A1F3FF/D03CD05B4F5C8B7C8CDF0B5E1961B3CA +0 -42
- package/.vs/CopilotSnapshots/4C16AB71DC018C46A734FBF0BF4AEDD9/462A64EF41A4BF42A18708B83E02FD6F/D03CD05B4F5C8B7C8CDF0B5E1961B3CA +0 -40
- package/.vs/CopilotSnapshots/4C16AB71DC018C46A734FBF0BF4AEDD9/90C95C12B91FA142BEF509B6FA329DE5/A3B20E10A19C7CA170132274D2F9312B +0 -9
- package/.vs/CopilotSnapshots/4C16AB71DC018C46A734FBF0BF4AEDD9/90C95C12B91FA142BEF509B6FA329DE5/D03CD05B4F5C8B7C8CDF0B5E1961B3CA +0 -1
- package/.vs/CopilotSnapshots/4C16AB71DC018C46A734FBF0BF4AEDD9/AD7513C9BBFE904AAB7F940397B95A99/D03CD05B4F5C8B7C8CDF0B5E1961B3CA +0 -42
- package/.vs/CopilotSnapshots/4C16AB71DC018C46A734FBF0BF4AEDD9/state.mpack +0 -1
- package/.vs/CopilotSnapshots/50E0417FAD2E524D887CB5763C2FB7B4/63A4C250D9DCE04B9F61D8833B89B5BF/EF71788BE39818EEA3F0164DC15E1BD7 +0 -174
- package/.vs/CopilotSnapshots/50E0417FAD2E524D887CB5763C2FB7B4/state.mpack +0 -1
- package/.vs/CopilotSnapshots/5EF2507B002AC14EA991043C37C36551/60FF68DE489DAD4FBCBBB54AA3F6A552/EF71788BE39818EEA3F0164DC15E1BD7 +0 -496
- package/.vs/CopilotSnapshots/5EF2507B002AC14EA991043C37C36551/state.mpack +0 -1
- package/.vs/CopilotSnapshots/6AA7610F1FB2B746821E54C28A8D109B/7FB78C0F8CB04F4AA6AF3315277B80F8/FB35DD13E708043D4CD8ACD54E14708F +0 -1
- package/.vs/CopilotSnapshots/6AA7610F1FB2B746821E54C28A8D109B/state.mpack +0 -1
- package/.vs/CopilotSnapshots/7F905F8BAC0DAD49BD507CA45C569AFD/5782E13CAB03A04E9E1EC5692F892170/BA5D2B145A59265D63FA3B3584344B02 +0 -5
- package/.vs/CopilotSnapshots/7F905F8BAC0DAD49BD507CA45C569AFD/5782E13CAB03A04E9E1EC5692F892170/EF71788BE39818EEA3F0164DC15E1BD7 +0 -158
- package/.vs/CopilotSnapshots/7F905F8BAC0DAD49BD507CA45C569AFD/9886598393C89944B51920C01EB650C9/BA5D2B145A59265D63FA3B3584344B02 +0 -35
- package/.vs/CopilotSnapshots/7F905F8BAC0DAD49BD507CA45C569AFD/state.mpack +0 -1
- package/.vs/CopilotSnapshots/8492D9C7A2D9514DB8A69D304B48BF3C/D2DA3C4E2131E84EA02E321802A65254/EF71788BE39818EEA3F0164DC15E1BD7 +0 -165
- package/.vs/CopilotSnapshots/8492D9C7A2D9514DB8A69D304B48BF3C/state.mpack +0 -1
- package/.vs/CopilotSnapshots/891A2DC0E5FA424CB8BDDA4FE26ED372/E244D49DDC79514DBA322770B03AE287/1CF9939611B0D194AC81951A171DF046 +0 -43
- package/.vs/CopilotSnapshots/891A2DC0E5FA424CB8BDDA4FE26ED372/state.mpack +0 -1
- package/.vs/CopilotSnapshots/8D302F8BAE46F54EA82AE1DED1A5D240/11E6D1F8E56D734F99C5216231273E8D/E621434FB1D5415B14FBBCC11967E420 +0 -66
- package/.vs/CopilotSnapshots/8D302F8BAE46F54EA82AE1DED1A5D240/24C69A83160FD844B0DEFECF8E1313DB/1CF9939611B0D194AC81951A171DF046 +0 -43
- package/.vs/CopilotSnapshots/8D302F8BAE46F54EA82AE1DED1A5D240/24C69A83160FD844B0DEFECF8E1313DB/E621434FB1D5415B14FBBCC11967E420 +0 -53
- package/.vs/CopilotSnapshots/8D302F8BAE46F54EA82AE1DED1A5D240/5E6D1BCD7CE81548AB445DE97505DC62/1CF9939611B0D194AC81951A171DF046 +0 -30
- package/.vs/CopilotSnapshots/8D302F8BAE46F54EA82AE1DED1A5D240/5E6D1BCD7CE81548AB445DE97505DC62/E621434FB1D5415B14FBBCC11967E420 +0 -53
- package/.vs/CopilotSnapshots/8D302F8BAE46F54EA82AE1DED1A5D240/EC4E81E0109C8F4BA1B5D9CFE1C122BC/E621434FB1D5415B14FBBCC11967E420 +0 -54
- package/.vs/CopilotSnapshots/8D302F8BAE46F54EA82AE1DED1A5D240/state.mpack +0 -1
- package/.vs/CopilotSnapshots/90C28D332F9B2949810126139FCA2640/6139F888FA743143B8E6C99306A478A6/30F913EA337870677E7C575773ECF531 +0 -130
- package/.vs/CopilotSnapshots/90C28D332F9B2949810126139FCA2640/F21743E379F9C1439F6A6405A289AA99/30F913EA337870677E7C575773ECF531 +0 -160
- package/.vs/CopilotSnapshots/90C28D332F9B2949810126139FCA2640/state.mpack +0 -1
- package/.vs/CopilotSnapshots/99E22E75C8AEDF4DB3A668A9ADF0BC43/2E2EFE66C5E05C4B809986E9B23D5409/45EABF6EF6BDFAA58C941A29E98C9C83 +0 -113
- package/.vs/CopilotSnapshots/99E22E75C8AEDF4DB3A668A9ADF0BC43/2E2EFE66C5E05C4B809986E9B23D5409/FB35DD13E708043D4CD8ACD54E14708F +0 -2
- package/.vs/CopilotSnapshots/99E22E75C8AEDF4DB3A668A9ADF0BC43/BE46916E3A8F2C4284792B951B674907/FB35DD13E708043D4CD8ACD54E14708F +0 -5
- package/.vs/CopilotSnapshots/99E22E75C8AEDF4DB3A668A9ADF0BC43/state.mpack +0 -1
- package/.vs/CopilotSnapshots/A6D99EA2D3819F45AD8087D7487F9318/state.mpack +0 -1
- package/.vs/CopilotSnapshots/A78C77F7A237704D95BCFE1BBC39FB0F/68BA9941941DC244BC799D89DB2BF86E/7C951A8A572EA5C371FDE657AF968B9C +0 -96
- package/.vs/CopilotSnapshots/A78C77F7A237704D95BCFE1BBC39FB0F/state.mpack +0 -1
- package/.vs/CopilotSnapshots/AD2203F1B9FECE44BB6D5DC5D83E87AA/734AB1B2974F9545B7F12AAA5842524B/840203FFA9CCF5B33DFD5C7CC5B13527 +0 -125
- package/.vs/CopilotSnapshots/AD2203F1B9FECE44BB6D5DC5D83E87AA/state.mpack +0 -1
- package/.vs/CopilotSnapshots/AEC950C2FAD20147AEE8E325E2CA0A78/89CF3F527D0687479D14274E8CDF3DFF/1CF9939611B0D194AC81951A171DF046 +0 -30
- package/.vs/CopilotSnapshots/AEC950C2FAD20147AEE8E325E2CA0A78/89CF3F527D0687479D14274E8CDF3DFF/BA5D2B145A59265D63FA3B3584344B02 +0 -158
- package/.vs/CopilotSnapshots/AEC950C2FAD20147AEE8E325E2CA0A78/E495EBF64DC77A4BBD470B92DB0391C4/1CF9939611B0D194AC81951A171DF046 +0 -30
- package/.vs/CopilotSnapshots/AEC950C2FAD20147AEE8E325E2CA0A78/E495EBF64DC77A4BBD470B92DB0391C4/BA5D2B145A59265D63FA3B3584344B02 +0 -67
- package/.vs/CopilotSnapshots/AEC950C2FAD20147AEE8E325E2CA0A78/state.mpack +0 -1
- package/.vs/CopilotSnapshots/AF947096A34634478C5D084B8442CD81/1FCDCC65B992954DB78BD1F46892312B/44EB81A1663981E3F52FFFECE3A2918E +0 -143
- package/.vs/CopilotSnapshots/AF947096A34634478C5D084B8442CD81/1FCDCC65B992954DB78BD1F46892312B/E602628EF6D764C2C267810C92906DBA +0 -253
- package/.vs/CopilotSnapshots/AF947096A34634478C5D084B8442CD81/state.mpack +0 -1
- package/.vs/CopilotSnapshots/B1DED422A45D5740BA4EE745C04B2B0B/226F822A22D6BD44BCF56BAA47FA274C/EF71788BE39818EEA3F0164DC15E1BD7 +0 -174
- package/.vs/CopilotSnapshots/B1DED422A45D5740BA4EE745C04B2B0B/state.mpack +0 -1
- package/.vs/CopilotSnapshots/B5DD5E50ACD0FD4998564F0FDE7FAEE0/97908D1D83AD2D4EA7082388DE07CBB4/44EB81A1663981E3F52FFFECE3A2918E +0 -148
- package/.vs/CopilotSnapshots/B5DD5E50ACD0FD4998564F0FDE7FAEE0/state.mpack +0 -1
- package/.vs/CopilotSnapshots/B8ADCAC0C19DB14FB8388BA59A86BC74/7ED3F1557FD7BE4DBEAF9B59FD442925/44EB81A1663981E3F52FFFECE3A2918E +0 -152
- package/.vs/CopilotSnapshots/B8ADCAC0C19DB14FB8388BA59A86BC74/state.mpack +0 -1
- package/.vs/CopilotSnapshots/BDFF50BBC1A93747A0001969C3BD195F/0130610530354840BB06BF4F4E744242/D03CD05B4F5C8B7C8CDF0B5E1961B3CA +0 -138
- package/.vs/CopilotSnapshots/BDFF50BBC1A93747A0001969C3BD195F/5F1C58CEFBAF1B4E80C4CF38B83A0A5F/D03CD05B4F5C8B7C8CDF0B5E1961B3CA +0 -129
- package/.vs/CopilotSnapshots/BDFF50BBC1A93747A0001969C3BD195F/BDC3D099FCCCC147848630670EED45CF/D03CD05B4F5C8B7C8CDF0B5E1961B3CA +0 -139
- package/.vs/CopilotSnapshots/BDFF50BBC1A93747A0001969C3BD195F/D9E2B1CDD1E2BB468E0703BEF6706FF6/D03CD05B4F5C8B7C8CDF0B5E1961B3CA +0 -139
- package/.vs/CopilotSnapshots/BDFF50BBC1A93747A0001969C3BD195F/state.mpack +0 -1
- package/.vs/CopilotSnapshots/C1E2C1A9C1DCFA46B1D5F1C6F36A152D/BC91C0FD38D8694BB992A8DEC1833670/148399016C7971F5592DAADBB9523118 +0 -120
- package/.vs/CopilotSnapshots/C1E2C1A9C1DCFA46B1D5F1C6F36A152D/state.mpack +0 -1
- package/.vs/CopilotSnapshots/C4D8E85893425E4F86F18850F5CA5C08/6C0950E97063C547A72D737E618436B0/1CF9939611B0D194AC81951A171DF046 +0 -9
- package/.vs/CopilotSnapshots/C4D8E85893425E4F86F18850F5CA5C08/6C0950E97063C547A72D737E618436B0/DFF70C60F68ECD9A4E4C3C74E4CC4DEE +0 -84
- package/.vs/CopilotSnapshots/C4D8E85893425E4F86F18850F5CA5C08/state.mpack +0 -1
- package/.vs/CopilotSnapshots/C5C3CA4C37B14A47B6BC753D09F69117/03EA1376F04C0D468FD0851119159D34/44EB81A1663981E3F52FFFECE3A2918E +0 -148
- package/.vs/CopilotSnapshots/C5C3CA4C37B14A47B6BC753D09F69117/03EA1376F04C0D468FD0851119159D34/E602628EF6D764C2C267810C92906DBA +0 -265
- package/.vs/CopilotSnapshots/C5C3CA4C37B14A47B6BC753D09F69117/6887503C15557349842029E58C9C0D11/44EB81A1663981E3F52FFFECE3A2918E +0 -152
- package/.vs/CopilotSnapshots/C5C3CA4C37B14A47B6BC753D09F69117/6887503C15557349842029E58C9C0D11/E602628EF6D764C2C267810C92906DBA +0 -265
- package/.vs/CopilotSnapshots/C5C3CA4C37B14A47B6BC753D09F69117/state.mpack +0 -1
- package/.vs/CopilotSnapshots/C7190BBC8D95D44F9CF8E65E3E8C9CFD/4B6D07592F8EDC4AA3FF742B1F9531CC/1B80EB15A2FEBEC11C8210C5461F8DB7 +0 -43
- package/.vs/CopilotSnapshots/C7190BBC8D95D44F9CF8E65E3E8C9CFD/state.mpack +0 -1
- package/.vs/CopilotSnapshots/C79D12964917E44F9A5BB9D8FA725A0C/2071ADB146D8F7499419123B2A595A41/03E00441128DC70FFEA043158417AC9A +0 -15
- package/.vs/CopilotSnapshots/C79D12964917E44F9A5BB9D8FA725A0C/6ECBF707FE2A88418EA1649CE46068D5/03E00441128DC70FFEA043158417AC9A +0 -1
- package/.vs/CopilotSnapshots/C79D12964917E44F9A5BB9D8FA725A0C/70BAB1D82B755F47A2351CA905ACC0F1/03E00441128DC70FFEA043158417AC9A +0 -49
- package/.vs/CopilotSnapshots/C79D12964917E44F9A5BB9D8FA725A0C/99DDFADAEC5CA14D92CC470523A11743/03E00441128DC70FFEA043158417AC9A +0 -39
- package/.vs/CopilotSnapshots/C79D12964917E44F9A5BB9D8FA725A0C/state.mpack +0 -1
- package/.vs/CopilotSnapshots/D533D78C39683A4188A2CEC902BC03CD/2445F4111C26EB4DA5404F930E140F56/840203FFA9CCF5B33DFD5C7CC5B13527 +0 -6
- package/.vs/CopilotSnapshots/D533D78C39683A4188A2CEC902BC03CD/2445F4111C26EB4DA5404F930E140F56/C27E5C1787B7957BF6F0C3D417890141 +0 -1
- package/.vs/CopilotSnapshots/D533D78C39683A4188A2CEC902BC03CD/state.mpack +0 -1
- package/.vs/CopilotSnapshots/DCAA5A718EC8304685D14C52356D80E0/5FC7C36C7769414C80BFF27A07BB5063/BE400B34D9700403D2BA3A1AA6B1EF1D +0 -15
- package/.vs/CopilotSnapshots/DCAA5A718EC8304685D14C52356D80E0/A4DD9B92084D8E48A95435EDB2B14545/86848C7099AD75EE4E8F10E066F49671 +0 -15
- package/.vs/CopilotSnapshots/DCAA5A718EC8304685D14C52356D80E0/A4DD9B92084D8E48A95435EDB2B14545/BE400B34D9700403D2BA3A1AA6B1EF1D +0 -15
- package/.vs/CopilotSnapshots/DCAA5A718EC8304685D14C52356D80E0/state.mpack +0 -1
- package/.vs/CopilotSnapshots/DCF62F751B748642A0BF5D5125AB6769/5F324CB20D1B5045A13090FA9D177B74/7C951A8A572EA5C371FDE657AF968B9C +0 -96
- package/.vs/CopilotSnapshots/DCF62F751B748642A0BF5D5125AB6769/5F324CB20D1B5045A13090FA9D177B74/B692C85119711C76235AA5D78F9F3818 +0 -73
- package/.vs/CopilotSnapshots/DCF62F751B748642A0BF5D5125AB6769/5F324CB20D1B5045A13090FA9D177B74/EF71788BE39818EEA3F0164DC15E1BD7 +0 -182
- package/.vs/CopilotSnapshots/DCF62F751B748642A0BF5D5125AB6769/C1287B2893D30D40A46C30DC2CE05178/7C951A8A572EA5C371FDE657AF968B9C +0 -96
- package/.vs/CopilotSnapshots/DCF62F751B748642A0BF5D5125AB6769/C1287B2893D30D40A46C30DC2CE05178/B692C85119711C76235AA5D78F9F3818 +0 -98
- package/.vs/CopilotSnapshots/DCF62F751B748642A0BF5D5125AB6769/CA6304DFE7764A4C87ACE5816CDB7CD9/7C951A8A572EA5C371FDE657AF968B9C +0 -96
- package/.vs/CopilotSnapshots/DCF62F751B748642A0BF5D5125AB6769/CA6304DFE7764A4C87ACE5816CDB7CD9/B692C85119711C76235AA5D78F9F3818 +0 -21
- package/.vs/CopilotSnapshots/DCF62F751B748642A0BF5D5125AB6769/CA6304DFE7764A4C87ACE5816CDB7CD9/EF71788BE39818EEA3F0164DC15E1BD7 +0 -176
- package/.vs/CopilotSnapshots/DCF62F751B748642A0BF5D5125AB6769/state.mpack +0 -1
- package/.vs/VSWorkspaceState.json +0 -6
- package/.vs/slnx.sqlite +0 -0
- package/.vs/ts-sample/CopilotIndices/17.13.433.20974/CodeChunks.db +0 -0
- package/.vs/ts-sample/CopilotIndices/17.13.433.20974/SemanticSymbols.db +0 -0
- package/.vs/ts-sample/CopilotIndices/17.13.439.2385/CodeChunks.db +0 -0
- package/.vs/ts-sample/CopilotIndices/17.13.439.2385/SemanticSymbols.db +0 -0
- package/.vs/ts-sample/CopilotIndices/17.13.441.19478/CodeChunks.db +0 -0
- package/.vs/ts-sample/CopilotIndices/17.13.441.19478/SemanticSymbols.db +0 -0
- package/.vs/ts-sample/FileContentIndex/2fa9d8cc-9158-496d-aa9b-3a471d46a157.vsidx +0 -0
- package/.vs/ts-sample/FileContentIndex/5530f45b-244e-4271-b3e3-d8250f03da64.vsidx +0 -0
- package/.vs/ts-sample/FileContentIndex/75f95b5d-c8f7-49ca-a3d7-d1d8f63db437.vsidx +0 -0
- package/.vs/ts-sample/FileContentIndex/abb2aeeb-f62a-4ca7-bfbf-7a1eada625a5.vsidx +0 -0
- package/.vs/ts-sample/FileContentIndex/fc749b54-0f95-45f6-ac75-a8ab3409a5ce.vsidx +0 -0
- package/.vs/ts-sample/config/applicationhost.config +0 -1026
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/0901b413-5d87-4b43-b248-80356492be7e +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/0f61a76a-b21f-46b7-821e-54c28a8d109b +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/101aef14-dd28-4de3-b2eb-e0b26d587b3a +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/22d4deb1-5da4-4057-ba4e-e745c04b2b0b +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/2a76030d-a09e-48cb-85f2-114567f23f93 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/2c6d08ca-cb98-4233-8f7c-011c3b409234 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/338dc290-9b2f-4929-8101-26139fca2640 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/34c9ac3b-2061-4d82-b300-06e353477163 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/3c01b107-5c38-4156-a5f5-100e0751210b +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/489ee702-f5df-4723-87cb-618de990598a +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/4ccac3c5-b137-474a-b6bc-753d09f69117 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/505eddb5-d0ac-49fd-9856-4f0fde7faee0 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/58e8d8c4-4293-4f5e-86f1-8850f5ca5c08 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/5dbafa3e-3015-4c80-a04c-606f5efddc38 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/5f29f527-e43a-4661-b60e-ff772041f413 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/6248dfd7-38ae-4fa6-9176-2fdc0694c3e8 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/66fcbd64-32dc-436d-80e6-7435a1a3ecf1 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/6f9ad733-d555-4d2c-b073-eb6a1aada347 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/715aaadc-c88e-4630-85d1-4c52356d80e0 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/71ab164c-01dc-468c-a734-fbf0bf4aedd9 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/752ee299-aec8-4ddf-b3a6-68a9adf0bc43 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/752ff6dc-741b-4286-a0bf-5d5125ab6769 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/7b50f25e-2a00-4ec1-a991-043c37c36551 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/7f41e050-2ead-4d52-887c-b5763c2fb7b4 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/85b50c9e-8895-4085-89c1-934ad2704744 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/8b2f308d-46ae-4ef5-a82a-e1ded1a5d240 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/8b5f907f-0dac-49ad-bd50-7ca45c569afd +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/8cd733d5-6839-413a-88a2-cec902bc03cd +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/90685124-4085-46d6-acbd-4fde8d6dd2d4 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/96129dc7-1749-4fe4-9a5b-b9d8fa725a0c +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/967094af-46a3-4734-8c5d-084b8442cd81 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/a29ed9a6-81d3-459f-ad80-87d7487f9318 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/a9c1e2c1-dcc1-46fa-b1d5-f1c6f36a152d +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/badc76f4-d284-4b6c-94e9-abdbc74de540 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/bb50ffbd-a9c1-4737-a000-1969c3bd195f +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/bc0b19c7-958d-4fd4-9cf8-e65e3e8c9cfd +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/c02d1a89-fae5-4c42-b8bd-da4fe26ed372 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/c0caadb8-9dc1-4fb1-b838-8ba59a86bc74 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/c250c9ae-d2fa-4701-aee8-e325e2ca0a78 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/c31db710-c1c4-4ec0-8602-fa06d3925f98 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/c7d99284-d9a2-4d51-b8a6-9d304b48bf3c +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/ddd1fab4-4016-4cfc-bf9f-f4a85bdfc112 +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/f10322ad-feb9-44ce-bb6d-5dc5d83e87aa +0 -0
- package/.vs/ts-sample/copilot-chat/3c67db7d/sessions/f7778ca7-37a2-4d70-95bc-fe1bbc39fb0f +0 -0
- package/.vs/ts-sample/v17/.suo +0 -0
- package/.vs/ts-sample/v17/.wsuo +0 -0
- package/.vs/ts-sample/v17/DocumentLayout.backup.json +0 -425
- package/.vs/ts-sample/v17/DocumentLayout.json +0 -423
- package/.vs/ts-sample/v17/TestStore/0/000.testlog +0 -0
- package/.vs/ts-sample/v17/TestStore/0/testlog.manifest +0 -0
@@ -1,96 +0,0 @@
|
|
1
|
-
import { BaseTokenReader } from './BaseTokenReader';
|
2
|
-
import { TokenType } from '../enums/tokenType';
|
3
|
-
import { Lexeme } from '../models/Lexeme';
|
4
|
-
import { CharLookupTable } from '../utils/charLookupTable';
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Reads SQL identifier tokens
|
8
|
-
*/
|
9
|
-
export class IdentifierTokenReader extends BaseTokenReader {
|
10
|
-
/**
|
11
|
-
* Try to read an identifier token
|
12
|
-
*/
|
13
|
-
public tryRead(previous: Lexeme | null): Lexeme | null {
|
14
|
-
if (this.isEndOfInput()) {
|
15
|
-
return null;
|
16
|
-
}
|
17
|
-
|
18
|
-
const char = this.input[this.position];
|
19
|
-
|
20
|
-
// wildcard identifier
|
21
|
-
if (char === '*' && previous !== null) {
|
22
|
-
if (previous.type === TokenType.Dot) {
|
23
|
-
// Treat as a wildcard if it follows a dot
|
24
|
-
this.position++;
|
25
|
-
return this.createLexeme(TokenType.Identifier, char);
|
26
|
-
} else if (previous.type !== TokenType.Literal && previous.type !== TokenType.Identifier) {
|
27
|
-
// Treat as a wildcard if it is not an operator
|
28
|
-
this.position++;
|
29
|
-
return this.createLexeme(TokenType.Identifier, char);
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|
33
|
-
// MySQL escaped identifier (escape character is backtick)
|
34
|
-
if (char === '`') {
|
35
|
-
const identifier = this.readEscapedIdentifier('`');
|
36
|
-
return this.createLexeme(TokenType.Identifier, identifier);
|
37
|
-
}
|
38
|
-
|
39
|
-
// Postgres escaped identifier (escape character is double quote)
|
40
|
-
if (char === '"') {
|
41
|
-
const identifier = this.readEscapedIdentifier('"');
|
42
|
-
return this.createLexeme(TokenType.Identifier, identifier);
|
43
|
-
}
|
44
|
-
|
45
|
-
// SQLServer escaped identifier (escape character is square bracket)
|
46
|
-
if (char === '[' && (previous === null || previous.command !== "array")) {
|
47
|
-
const identifier = this.readEscapedIdentifier(']');
|
48
|
-
return this.createLexeme(TokenType.Identifier, identifier);
|
49
|
-
}
|
50
|
-
|
51
|
-
// Regular identifier
|
52
|
-
const start = this.position;
|
53
|
-
while (this.canRead()) {
|
54
|
-
if (CharLookupTable.isDelimiter(this.input[this.position])) {
|
55
|
-
break;
|
56
|
-
}
|
57
|
-
this.position++;
|
58
|
-
}
|
59
|
-
|
60
|
-
if (start === this.position) {
|
61
|
-
return null;
|
62
|
-
}
|
63
|
-
|
64
|
-
return this.createLexeme(
|
65
|
-
TokenType.Identifier,
|
66
|
-
this.input.slice(start, this.position)
|
67
|
-
);
|
68
|
-
}
|
69
|
-
|
70
|
-
/**
|
71
|
-
* Read an escaped identifier (surrounded by delimiters)
|
72
|
-
*/
|
73
|
-
private readEscapedIdentifier(delimiter: string): string {
|
74
|
-
const start = this.position;
|
75
|
-
|
76
|
-
// Skip the opening delimiter
|
77
|
-
this.position++;
|
78
|
-
|
79
|
-
while (this.canRead()) {
|
80
|
-
if (this.input[this.position] === delimiter) {
|
81
|
-
break;
|
82
|
-
}
|
83
|
-
this.position++;
|
84
|
-
}
|
85
|
-
|
86
|
-
if (start === this.position) {
|
87
|
-
throw new Error(`Closing delimiter is not found. position: ${start}, delimiter: ${delimiter}\n${this.getDebugPositionInfo(start)}}`);
|
88
|
-
}
|
89
|
-
|
90
|
-
// Skip the closing delimiter
|
91
|
-
this.position++;
|
92
|
-
|
93
|
-
// exclude the delimiter
|
94
|
-
return this.input.slice(start + 1, this.position - 1);
|
95
|
-
}
|
96
|
-
}
|
@@ -1,73 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Utilities for string operations during tokenization
|
3
|
-
*/
|
4
|
-
export class StringUtils {
|
5
|
-
/**
|
6
|
-
* Creates a visual representation of an error position in text
|
7
|
-
* @param input The input text
|
8
|
-
* @param errPosition The error position
|
9
|
-
* @returns A string with a caret pointing to the error position
|
10
|
-
*/
|
11
|
-
public static getDebugPositionInfo(input: string, errPosition: number): string {
|
12
|
-
// Get 5 characters before and after the error
|
13
|
-
// If the start and end points are out of the string range, keep them within the range
|
14
|
-
// Display ^ at the error position on the next line
|
15
|
-
const start = Math.max(0, errPosition - 5);
|
16
|
-
const end = Math.min(input.length, errPosition + 5);
|
17
|
-
const debugInfo = input.slice(start, end);
|
18
|
-
const caret = ' '.repeat(errPosition - start) + '^';
|
19
|
-
return `${debugInfo}\n${caret}`;
|
20
|
-
}
|
21
|
-
|
22
|
-
/**
|
23
|
-
* Skip white space characters.
|
24
|
-
*/
|
25
|
-
public static skipWhiteSpace(input: string, position: number): number {
|
26
|
-
const start = position;
|
27
|
-
const whitespace = new Set([' ', '\r', '\n', '\t']);
|
28
|
-
while (position < input.length) {
|
29
|
-
if (!whitespace.has(input[position])) {
|
30
|
-
break;
|
31
|
-
}
|
32
|
-
position++;
|
33
|
-
}
|
34
|
-
return position;
|
35
|
-
}
|
36
|
-
|
37
|
-
/**
|
38
|
-
* Skip line comment.
|
39
|
-
*/
|
40
|
-
public static skipLineComment(input: string, position: number): number {
|
41
|
-
if (position + 1 >= input.length) {
|
42
|
-
return position;
|
43
|
-
}
|
44
|
-
if (input[position] === '-' && input[position + 1] === '-') {
|
45
|
-
position += 2;
|
46
|
-
while (position < input.length && input[position] !== '\n') {
|
47
|
-
position++;
|
48
|
-
}
|
49
|
-
}
|
50
|
-
return position;
|
51
|
-
}
|
52
|
-
|
53
|
-
/**
|
54
|
-
* Skip block comment.
|
55
|
-
*/
|
56
|
-
public static skipBlockComment(input: string, position: number): number {
|
57
|
-
if (position + 3 >= input.length) {
|
58
|
-
return position;
|
59
|
-
}
|
60
|
-
if (input[position] === '/' && input[position + 1] === '*') {
|
61
|
-
position += 2;
|
62
|
-
while (position + 1 < input.length) {
|
63
|
-
if (input[position] === '*' && input[position + 1] === '/') {
|
64
|
-
position += 2;
|
65
|
-
return position;
|
66
|
-
}
|
67
|
-
position++;
|
68
|
-
}
|
69
|
-
throw new Error(`Block comment is not closed. position: ${position}`);
|
70
|
-
}
|
71
|
-
return position;
|
72
|
-
}
|
73
|
-
}
|
@@ -1,182 +0,0 @@
|
|
1
|
-
import { Lexeme } from './models/Lexeme';
|
2
|
-
import { IdentifierTokenReader } from './tokenReaders/IdentifierTokenReader';
|
3
|
-
import { LiteralTokenReader } from './tokenReaders/LiteralTokenReader';
|
4
|
-
import { ParameterTokenReader } from './tokenReaders/ParameterTokenReader';
|
5
|
-
import { SpecialSymbolTokenReader } from './tokenReaders/SymbolTokenReader';
|
6
|
-
import { TokenReaderManager } from './tokenReaders/TokenReaderManager';
|
7
|
-
import { OperatorTokenReader } from './tokenReaders/OperatorTokenReader';
|
8
|
-
import { StringUtils } from './utils/stringUtils';
|
9
|
-
|
10
|
-
export class SqlTokenizer {
|
11
|
-
/// <summary>
|
12
|
-
/// Input string.
|
13
|
-
/// </summary>
|
14
|
-
private input: string;
|
15
|
-
|
16
|
-
/// <summary>
|
17
|
-
/// Current position in the input string.
|
18
|
-
/// </summary>
|
19
|
-
private position: number;
|
20
|
-
|
21
|
-
/// <summary>
|
22
|
-
/// Token reader manager
|
23
|
-
/// </summary>
|
24
|
-
private readerManager: TokenReaderManager;
|
25
|
-
|
26
|
-
constructor(input: string) {
|
27
|
-
this.input = input;
|
28
|
-
this.position = 0;
|
29
|
-
|
30
|
-
// Initialize the token reader manager and register all readers
|
31
|
-
// NOTE: The execution order of token readers is important.
|
32
|
-
// - Since LiteralTokenReader has a process to read numeric literals starting with a dot,
|
33
|
-
// it needs to be registered before SpecialSymbolTokenReader.
|
34
|
-
// - Since LiteralTokenReader has a process to read numeric literals starting with a sign,
|
35
|
-
// it needs to be registered before OperatorTokenReader.
|
36
|
-
this.readerManager = new TokenReaderManager(input)
|
37
|
-
.register(new ParameterTokenReader(input))
|
38
|
-
.register(new LiteralTokenReader(input))
|
39
|
-
.register(new IdentifierTokenReader(input))
|
40
|
-
.register(new SpecialSymbolTokenReader(input))
|
41
|
-
.register(new OperatorTokenReader(input));
|
42
|
-
}
|
43
|
-
|
44
|
-
private isEndOfInput(shift: number = 0): boolean {
|
45
|
-
return this.position + shift >= this.input.length;
|
46
|
-
}
|
47
|
-
|
48
|
-
private canRead(shift: number = 0): boolean {
|
49
|
-
return !this.isEndOfInput(shift);
|
50
|
-
}
|
51
|
-
|
52
|
-
public readLexmes(): Lexeme[] {
|
53
|
-
const lexemes: Lexeme[] = [];
|
54
|
-
|
55
|
-
// Skip whitespace and comments at the start
|
56
|
-
this.skipWhiteSpacesAndComments();
|
57
|
-
|
58
|
-
// Track the previous token
|
59
|
-
let previous: Lexeme | null = null;
|
60
|
-
|
61
|
-
// Read tokens until the end of the input is reached
|
62
|
-
while (this.canRead()) {
|
63
|
-
// semicolon is a delimiter
|
64
|
-
if (this.input[this.position] === ';') {
|
65
|
-
return lexemes;
|
66
|
-
}
|
67
|
-
|
68
|
-
// Try to read with the reader manager
|
69
|
-
const lexeme = this.readerManager.tryRead(this.position, previous);
|
70
|
-
|
71
|
-
// If a token is read by any reader
|
72
|
-
if (lexeme) {
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
lexemes.push(lexeme);
|
77
|
-
previous = lexeme;
|
78
|
-
|
79
|
-
// Update position
|
80
|
-
this.position = this.readerManager.getMaxPosition();
|
81
|
-
|
82
|
-
// Skip whitespace and comments after the token
|
83
|
-
this.skipWhiteSpacesAndComments();
|
84
|
-
} else {
|
85
|
-
// Exception
|
86
|
-
throw new Error(`Unexpected character. actual: ${this.input[this.position]}, position: ${this.position}\n${this.getDebugPositionInfo(this.position)}`);
|
87
|
-
}
|
88
|
-
}
|
89
|
-
|
90
|
-
return lexemes;
|
91
|
-
}
|
92
|
-
|
93
|
-
/// <summary>
|
94
|
-
/// Skip white space characters and sql comments.
|
95
|
-
/// </summary>
|
96
|
-
private skipWhiteSpacesAndComments(): void {
|
97
|
-
while (true) {
|
98
|
-
const newPosition = StringUtils.skipWhiteSpace(this.input, this.position);
|
99
|
-
if (newPosition !== this.position) {
|
100
|
-
this.position = newPosition;
|
101
|
-
continue;
|
102
|
-
}
|
103
|
-
const newLineCommentPosition = StringUtils.skipLineComment(this.input, this.position);
|
104
|
-
if (newLineCommentPosition !== this.position) {
|
105
|
-
this.position = newLineCommentPosition;
|
106
|
-
continue;
|
107
|
-
}
|
108
|
-
const newBlockCommentPosition = StringUtils.skipBlockComment(this.input, this.position);
|
109
|
-
if (newBlockCommentPosition !== this.position) {
|
110
|
-
this.position = newBlockCommentPosition;
|
111
|
-
continue;
|
112
|
-
}
|
113
|
-
break;
|
114
|
-
}
|
115
|
-
}
|
116
|
-
|
117
|
-
private skipWhiteSpace(): boolean {
|
118
|
-
const start = this.position;
|
119
|
-
|
120
|
-
// Skip tab, newline, and space characters
|
121
|
-
const whitespace = new Set([' ', '\r', '\n', '\t']);
|
122
|
-
|
123
|
-
while (this.canRead()) {
|
124
|
-
if (!whitespace.has(this.input[this.position])) {
|
125
|
-
break;
|
126
|
-
}
|
127
|
-
this.position++;
|
128
|
-
}
|
129
|
-
return start !== this.position;
|
130
|
-
}
|
131
|
-
|
132
|
-
private skipLineComment(): boolean {
|
133
|
-
// At least 2 characters are needed. '--'
|
134
|
-
if (this.isEndOfInput(1)) {
|
135
|
-
return false;
|
136
|
-
}
|
137
|
-
|
138
|
-
if (this.input[this.position] === '-' && this.input[this.position + 1] === '-') {
|
139
|
-
this.position += 2;
|
140
|
-
|
141
|
-
while (this.canRead() && this.input[this.position] !== '\n') {
|
142
|
-
this.position++;
|
143
|
-
}
|
144
|
-
return true;
|
145
|
-
}
|
146
|
-
|
147
|
-
return false;
|
148
|
-
}
|
149
|
-
|
150
|
-
private skipBlockComment(): boolean {
|
151
|
-
// At least 4 characters are needed. '/**/'
|
152
|
-
if (this.isEndOfInput(3)) {
|
153
|
-
return false;
|
154
|
-
}
|
155
|
-
|
156
|
-
// Record the start position of the comment to track error location
|
157
|
-
const start = this.position;
|
158
|
-
|
159
|
-
if (this.input[this.position] === '/' && this.input[this.position + 1] === '*') {
|
160
|
-
this.position += 2;
|
161
|
-
|
162
|
-
while (this.canRead(1)) {
|
163
|
-
if (this.input[this.position] === '*' && this.input[this.position + 1] === '/') {
|
164
|
-
this.position += 2;
|
165
|
-
return true;
|
166
|
-
}
|
167
|
-
this.position++;
|
168
|
-
}
|
169
|
-
|
170
|
-
throw new Error(`Block comment is not closed. position: ${start}`);
|
171
|
-
}
|
172
|
-
|
173
|
-
return false;
|
174
|
-
}
|
175
|
-
|
176
|
-
/**
|
177
|
-
* Get debug info for error reporting
|
178
|
-
*/
|
179
|
-
private getDebugPositionInfo(errPosition: number): string {
|
180
|
-
return StringUtils.getDebugPositionInfo(this.input, errPosition);
|
181
|
-
}
|
182
|
-
}
|
@@ -1,96 +0,0 @@
|
|
1
|
-
import { BaseTokenReader } from './BaseTokenReader';
|
2
|
-
import { TokenType } from '../enums/tokenType';
|
3
|
-
import { Lexeme } from '../models/Lexeme';
|
4
|
-
import { CharLookupTable } from '../utils/charLookupTable';
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Reads SQL identifier tokens
|
8
|
-
*/
|
9
|
-
export class IdentifierTokenReader extends BaseTokenReader {
|
10
|
-
/**
|
11
|
-
* Try to read an identifier token
|
12
|
-
*/
|
13
|
-
public tryRead(previous: Lexeme | null): Lexeme | null {
|
14
|
-
if (this.isEndOfInput()) {
|
15
|
-
return null;
|
16
|
-
}
|
17
|
-
|
18
|
-
const char = this.input[this.position];
|
19
|
-
|
20
|
-
// wildcard identifier
|
21
|
-
if (char === '*' && previous !== null) {
|
22
|
-
if (previous.type === TokenType.Dot) {
|
23
|
-
// Treat as a wildcard if it follows a dot
|
24
|
-
this.position++;
|
25
|
-
return this.createLexeme(TokenType.Identifier, char);
|
26
|
-
} else if (previous.type !== TokenType.Literal && previous.type !== TokenType.Identifier) {
|
27
|
-
// Treat as a wildcard if it is not an operator
|
28
|
-
this.position++;
|
29
|
-
return this.createLexeme(TokenType.Identifier, char);
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|
33
|
-
// MySQL escaped identifier (escape character is backtick)
|
34
|
-
if (char === '`') {
|
35
|
-
const identifier = this.readEscapedIdentifier('`');
|
36
|
-
return this.createLexeme(TokenType.Identifier, identifier);
|
37
|
-
}
|
38
|
-
|
39
|
-
// Postgres escaped identifier (escape character is double quote)
|
40
|
-
if (char === '"') {
|
41
|
-
const identifier = this.readEscapedIdentifier('"');
|
42
|
-
return this.createLexeme(TokenType.Identifier, identifier);
|
43
|
-
}
|
44
|
-
|
45
|
-
// SQLServer escaped identifier (escape character is square bracket)
|
46
|
-
if (char === '[' && (previous === null || previous.command !== "array")) {
|
47
|
-
const identifier = this.readEscapedIdentifier(']');
|
48
|
-
return this.createLexeme(TokenType.Identifier, identifier);
|
49
|
-
}
|
50
|
-
|
51
|
-
// Regular identifier
|
52
|
-
const start = this.position;
|
53
|
-
while (this.canRead()) {
|
54
|
-
if (CharLookupTable.isDelimiter(this.input[this.position])) {
|
55
|
-
break;
|
56
|
-
}
|
57
|
-
this.position++;
|
58
|
-
}
|
59
|
-
|
60
|
-
if (start === this.position) {
|
61
|
-
return null;
|
62
|
-
}
|
63
|
-
|
64
|
-
return this.createLexeme(
|
65
|
-
TokenType.Identifier,
|
66
|
-
this.input.slice(start, this.position)
|
67
|
-
);
|
68
|
-
}
|
69
|
-
|
70
|
-
/**
|
71
|
-
* Read an escaped identifier (surrounded by delimiters)
|
72
|
-
*/
|
73
|
-
private readEscapedIdentifier(delimiter: string): string {
|
74
|
-
const start = this.position;
|
75
|
-
|
76
|
-
// Skip the opening delimiter
|
77
|
-
this.position++;
|
78
|
-
|
79
|
-
while (this.canRead()) {
|
80
|
-
if (this.input[this.position] === delimiter) {
|
81
|
-
break;
|
82
|
-
}
|
83
|
-
this.position++;
|
84
|
-
}
|
85
|
-
|
86
|
-
if (start === this.position) {
|
87
|
-
throw new Error(`Closing delimiter is not found. position: ${start}, delimiter: ${delimiter}\n${this.getDebugPositionInfo(start)}}`);
|
88
|
-
}
|
89
|
-
|
90
|
-
// Skip the closing delimiter
|
91
|
-
this.position++;
|
92
|
-
|
93
|
-
// exclude the delimiter
|
94
|
-
return this.input.slice(start + 1, this.position - 1);
|
95
|
-
}
|
96
|
-
}
|
@@ -1,98 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Utilities for string operations during tokenization
|
3
|
-
*/
|
4
|
-
export class StringUtils {
|
5
|
-
/**
|
6
|
-
* Creates a visual representation of an error position in text
|
7
|
-
* @param input The input text
|
8
|
-
* @param errPosition The error position
|
9
|
-
* @returns A string with a caret pointing to the error position
|
10
|
-
*/
|
11
|
-
public static getDebugPositionInfo(input: string, errPosition: number): string {
|
12
|
-
// Get 5 characters before and after the error
|
13
|
-
// If the start and end points are out of the string range, keep them within the range
|
14
|
-
// Display ^ at the error position on the next line
|
15
|
-
const start = Math.max(0, errPosition - 5);
|
16
|
-
const end = Math.min(input.length, errPosition + 5);
|
17
|
-
const debugInfo = input.slice(start, end);
|
18
|
-
const caret = ' '.repeat(errPosition - start) + '^';
|
19
|
-
return `${debugInfo}\n${caret}`;
|
20
|
-
}
|
21
|
-
|
22
|
-
/**
|
23
|
-
* Skip white space characters.
|
24
|
-
*/
|
25
|
-
public static skipWhiteSpace(input: string, position: number): number {
|
26
|
-
const start = position;
|
27
|
-
const whitespace = new Set([' ', '\r', '\n', '\t']);
|
28
|
-
while (position < input.length) {
|
29
|
-
if (!whitespace.has(input[position])) {
|
30
|
-
break;
|
31
|
-
}
|
32
|
-
position++;
|
33
|
-
}
|
34
|
-
return position;
|
35
|
-
}
|
36
|
-
|
37
|
-
/**
|
38
|
-
* Skip line comment.
|
39
|
-
*/
|
40
|
-
private static skipLineComment(input: string, position: number): number {
|
41
|
-
if (position + 1 >= input.length) {
|
42
|
-
return position;
|
43
|
-
}
|
44
|
-
if (input[position] === '-' && input[position + 1] === '-') {
|
45
|
-
position += 2;
|
46
|
-
while (position < input.length && input[position] !== '\n') {
|
47
|
-
position++;
|
48
|
-
}
|
49
|
-
}
|
50
|
-
return position;
|
51
|
-
}
|
52
|
-
|
53
|
-
/**
|
54
|
-
* Skip block comment.
|
55
|
-
*/
|
56
|
-
private static skipBlockComment(input: string, position: number): number {
|
57
|
-
if (position + 3 >= input.length) {
|
58
|
-
return position;
|
59
|
-
}
|
60
|
-
if (input[position] === '/' && input[position + 1] === '*') {
|
61
|
-
position += 2;
|
62
|
-
while (position + 1 < input.length) {
|
63
|
-
if (input[position] === '*' && input[position + 1] === '/') {
|
64
|
-
position += 2;
|
65
|
-
return position;
|
66
|
-
}
|
67
|
-
position++;
|
68
|
-
}
|
69
|
-
throw new Error(`Block comment is not closed. position: ${position}`);
|
70
|
-
}
|
71
|
-
return position;
|
72
|
-
}
|
73
|
-
|
74
|
-
/**
|
75
|
-
* Skip white space characters and SQL comments.
|
76
|
-
*/
|
77
|
-
public static skipWhiteSpacesAndComments(input: string, position: number): number {
|
78
|
-
while (true) {
|
79
|
-
const newPosition = StringUtils.skipWhiteSpace(input, position);
|
80
|
-
if (newPosition !== position) {
|
81
|
-
position = newPosition;
|
82
|
-
continue;
|
83
|
-
}
|
84
|
-
const newLineCommentPosition = StringUtils.skipLineComment(input, position);
|
85
|
-
if (newLineCommentPosition !== position) {
|
86
|
-
position = newLineCommentPosition;
|
87
|
-
continue;
|
88
|
-
}
|
89
|
-
const newBlockCommentPosition = StringUtils.skipBlockComment(input, position);
|
90
|
-
if (newBlockCommentPosition !== position) {
|
91
|
-
position = newBlockCommentPosition;
|
92
|
-
continue;
|
93
|
-
}
|
94
|
-
break;
|
95
|
-
}
|
96
|
-
return position;
|
97
|
-
}
|
98
|
-
}
|
@@ -1,96 +0,0 @@
|
|
1
|
-
import { BaseTokenReader } from './BaseTokenReader';
|
2
|
-
import { TokenType } from '../enums/tokenType';
|
3
|
-
import { Lexeme } from '../models/Lexeme';
|
4
|
-
import { CharLookupTable } from '../utils/charLookupTable';
|
5
|
-
|
6
|
-
/**
|
7
|
-
* Reads SQL identifier tokens
|
8
|
-
*/
|
9
|
-
export class IdentifierTokenReader extends BaseTokenReader {
|
10
|
-
/**
|
11
|
-
* Try to read an identifier token
|
12
|
-
*/
|
13
|
-
public tryRead(previous: Lexeme | null): Lexeme | null {
|
14
|
-
if (this.isEndOfInput()) {
|
15
|
-
return null;
|
16
|
-
}
|
17
|
-
|
18
|
-
const char = this.input[this.position];
|
19
|
-
|
20
|
-
// wildcard identifier
|
21
|
-
if (char === '*' && previous !== null) {
|
22
|
-
if (previous.type === TokenType.Dot) {
|
23
|
-
// Treat as a wildcard if it follows a dot
|
24
|
-
this.position++;
|
25
|
-
return this.createLexeme(TokenType.Identifier, char);
|
26
|
-
} else if (previous.type !== TokenType.Literal && previous.type !== TokenType.Identifier) {
|
27
|
-
// Treat as a wildcard if it is not an operator
|
28
|
-
this.position++;
|
29
|
-
return this.createLexeme(TokenType.Identifier, char);
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|
33
|
-
// MySQL escaped identifier (escape character is backtick)
|
34
|
-
if (char === '`') {
|
35
|
-
const identifier = this.readEscapedIdentifier('`');
|
36
|
-
return this.createLexeme(TokenType.Identifier, identifier);
|
37
|
-
}
|
38
|
-
|
39
|
-
// Postgres escaped identifier (escape character is double quote)
|
40
|
-
if (char === '"') {
|
41
|
-
const identifier = this.readEscapedIdentifier('"');
|
42
|
-
return this.createLexeme(TokenType.Identifier, identifier);
|
43
|
-
}
|
44
|
-
|
45
|
-
// SQLServer escaped identifier (escape character is square bracket)
|
46
|
-
if (char === '[' && (previous === null || previous.command !== "array")) {
|
47
|
-
const identifier = this.readEscapedIdentifier(']');
|
48
|
-
return this.createLexeme(TokenType.Identifier, identifier);
|
49
|
-
}
|
50
|
-
|
51
|
-
// Regular identifier
|
52
|
-
const start = this.position;
|
53
|
-
while (this.canRead()) {
|
54
|
-
if (CharLookupTable.isDelimiter(this.input[this.position])) {
|
55
|
-
break;
|
56
|
-
}
|
57
|
-
this.position++;
|
58
|
-
}
|
59
|
-
|
60
|
-
if (start === this.position) {
|
61
|
-
return null;
|
62
|
-
}
|
63
|
-
|
64
|
-
return this.createLexeme(
|
65
|
-
TokenType.Identifier,
|
66
|
-
this.input.slice(start, this.position)
|
67
|
-
);
|
68
|
-
}
|
69
|
-
|
70
|
-
/**
|
71
|
-
* Read an escaped identifier (surrounded by delimiters)
|
72
|
-
*/
|
73
|
-
private readEscapedIdentifier(delimiter: string): string {
|
74
|
-
const start = this.position;
|
75
|
-
|
76
|
-
// Skip the opening delimiter
|
77
|
-
this.position++;
|
78
|
-
|
79
|
-
while (this.canRead()) {
|
80
|
-
if (this.input[this.position] === delimiter) {
|
81
|
-
break;
|
82
|
-
}
|
83
|
-
this.position++;
|
84
|
-
}
|
85
|
-
|
86
|
-
if (start === this.position) {
|
87
|
-
throw new Error(`Closing delimiter is not found. position: ${start}, delimiter: ${delimiter}\n${this.getDebugPositionInfo(start)}}`);
|
88
|
-
}
|
89
|
-
|
90
|
-
// Skip the closing delimiter
|
91
|
-
this.position++;
|
92
|
-
|
93
|
-
// exclude the delimiter
|
94
|
-
return this.input.slice(start + 1, this.position - 1);
|
95
|
-
}
|
96
|
-
}
|
@@ -1,21 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Utilities for string operations during tokenization
|
3
|
-
*/
|
4
|
-
export class StringUtils {
|
5
|
-
/**
|
6
|
-
* Creates a visual representation of an error position in text
|
7
|
-
* @param input The input text
|
8
|
-
* @param errPosition The error position
|
9
|
-
* @returns A string with a caret pointing to the error position
|
10
|
-
*/
|
11
|
-
public static getDebugPositionInfo(input: string, errPosition: number): string {
|
12
|
-
// Get 5 characters before and after the error
|
13
|
-
// If the start and end points are out of the string range, keep them within the range
|
14
|
-
// Display ^ at the error position on the next line
|
15
|
-
const start = Math.max(0, errPosition - 5);
|
16
|
-
const end = Math.min(input.length, errPosition + 5);
|
17
|
-
const debugInfo = input.slice(start, end);
|
18
|
-
const caret = ' '.repeat(errPosition - start) + '^';
|
19
|
-
return `${debugInfo}\n${caret}`;
|
20
|
-
}
|
21
|
-
}
|