| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  | " Vim OMNI completion script for SQL | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | " Language:    SQL | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  | " Maintainer:  David Fishburn <dfishburn dot vim at gmail dot com> | 
					
						
							| 
									
										
										
										
											2016-02-01 22:37:05 +01:00
										 |  |  | " Version:     16.0 | 
					
						
							| 
									
										
										
										
											2017-11-02 22:58:42 +01:00
										 |  |  | " Last Change: 2017 Oct 15 | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | " Homepage:    http://www.vim.org/scripts/script.php?script_id=1572 | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  | " Usage:       For detailed help | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | "              ":help sql.txt" | 
					
						
							|  |  |  | "              or ":help ft-sql-omni" | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  | "              or read $VIMRUNTIME/doc/sql.txt | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  | " History | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | " | 
					
						
							| 
									
										
										
										
											2013-05-17 18:14:19 +02:00
										 |  |  | " TODO | 
					
						
							|  |  |  | "     - Jonas Enberg - if no table is found when using column completion | 
					
						
							|  |  |  | "       look backwards to a FROM clause and find the first table | 
					
						
							|  |  |  | "       and complete it. | 
					
						
							|  |  |  | " | 
					
						
							| 
									
										
										
										
											2016-02-01 22:37:05 +01:00
										 |  |  | " Version 16.0 (Dec 2015) | 
					
						
							| 
									
										
										
										
											2021-09-09 21:55:11 +02:00
										 |  |  | "     - NF: If resetting the cache and table, procedure or view completion | 
					
						
							| 
									
										
										
										
											2016-02-01 22:37:05 +01:00
										 |  |  | "           had been used via dbext, have dbext delete or recreate the  | 
					
						
							|  |  |  | "           dictionary so that new objects are picked up for the  | 
					
						
							|  |  |  | "           next completion. | 
					
						
							|  |  |  | " | 
					
						
							| 
									
										
										
										
											2013-05-17 18:14:19 +02:00
										 |  |  | " Version 15.0 (May 2013) | 
					
						
							|  |  |  | "     - NF: Changed the SQL precached syntax items, omni_sql_precache_syntax_groups, | 
					
						
							|  |  |  | "           to use regular expressions to pick up extended syntax group names. | 
					
						
							|  |  |  | "           This requires an updated SyntaxComplete plugin version 13.0. | 
					
						
							|  |  |  | "           If the required versions have not been installed, previous | 
					
						
							|  |  |  | "           behaviour will not be impacted. | 
					
						
							|  |  |  | " | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | " Version 14.0 (Dec 2012) | 
					
						
							|  |  |  | "     - BF: Added check for cpo | 
					
						
							|  |  |  | " | 
					
						
							|  |  |  | " Version 13.0 (Dec 2012) | 
					
						
							|  |  |  | "     - NF: When completing column lists or drilling into a table | 
					
						
							|  |  |  | "           and g:omni_sql_include_owner is enabled, the | 
					
						
							|  |  |  | "           only the table name would be replaced with the column | 
					
						
							|  |  |  | "           list instead of the table name and owner (if specified). | 
					
						
							|  |  |  | "     - NF: When completing column lists using table aliases | 
					
						
							|  |  |  | "           and g:omni_sql_include_owner is enabled, account | 
					
						
							|  |  |  | "           for the owner name when looking up the table | 
					
						
							|  |  |  | "           list instead of the table name and owner (if specified). | 
					
						
							|  |  |  | "     - BF: When completing column lists or drilling into a table | 
					
						
							|  |  |  | "           and g:omni_sql_include_owner is enabled, the | 
					
						
							|  |  |  | "           column list could often not be found for the table. | 
					
						
							|  |  |  | "     - BF: When OMNI popped up, possibly the wrong word | 
					
						
							|  |  |  | "           would be replaced for column and column list options. | 
					
						
							|  |  |  | " | 
					
						
							|  |  |  | " Version 12.0 (Feb 2012) | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | "     - Partial column name completion did not work when a table | 
					
						
							|  |  |  | "       name or table alias was provided (Jonas Enberg). | 
					
						
							|  |  |  | "     - Improved the handling of column completion.  First we match any | 
					
						
							|  |  |  | "       columns from a previous completion.  If not matches are found, we | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | "       consider the partial name to be a table or table alias for the | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | "       query and attempt to match on it. | 
					
						
							|  |  |  | " | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | " Version 11.0 (Jan 2012) | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | "     Added g:omni_sql_default_compl_type variable | 
					
						
							|  |  |  | "         - You can specify which type of completion to default to | 
					
						
							|  |  |  | "           when pressing <C-X><C-O>.  The entire list of available | 
					
						
							|  |  |  | "           choices can be found in the calls to sqlcomplete#Map in: | 
					
						
							|  |  |  | "               ftplugin/sql.vim | 
					
						
							|  |  |  | " | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  | " Version 10.0 | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | "     Updated PreCacheSyntax() | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  | "         - Now returns a List of the syntax items it finds. | 
					
						
							|  |  |  | "           This allows other plugins / scripts to use this list for their own | 
					
						
							|  |  |  | "           purposes.  In this case XPTemplate can use them for a Choose list. | 
					
						
							|  |  |  | "         - Verifies the parameters are the correct type and displays a | 
					
						
							|  |  |  | "           warning if not. | 
					
						
							|  |  |  | "         - Verifies the parameters are the correct type and displays a | 
					
						
							|  |  |  | "           warning if not. | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | "     Updated SQLCWarningMsg() | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  | "         - Prepends warning message with SQLComplete so you know who issued | 
					
						
							|  |  |  | "           the warning. | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | "     Updated SQLCErrorMsg() | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  | "         - Prepends error message with SQLComplete so you know who issued | 
					
						
							|  |  |  | "           the error. | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | " | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | " Version 9.0 (May 2010) | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  | "     This change removes some of the support for tables with spaces in their | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | "     names in order to simplify the regexes used to pull out query table | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  | "     aliases for more robust table name and column name code completion. | 
					
						
							|  |  |  | "     Full support for "table names with spaces" can be added in again | 
					
						
							|  |  |  | "     after 7.3. | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  | " | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  | " Version 8.0 | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | "     Incorrectly re-executed the g:ftplugin_sql_omni_key_right and g:ftplugin_sql_omni_key_left | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  | "     when drilling in and out of a column list for a table. | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  | " | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | " Version 7.0 (Jan 2010) | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  | "     Better handling of object names | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  | " | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | " Version 6.0 (Apr 2008) | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  | "     Supports object names with spaces "my table name" | 
					
						
							|  |  |  | " | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | " Set completion with CTRL-X CTRL-O to autoloaded function. | 
					
						
							|  |  |  | " This check is in place in case this script is | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | " sourced directly instead of using the autoload feature. | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | if exists('&omnifunc') | 
					
						
							|  |  |  |     " Do not set the option if already set since this | 
					
						
							|  |  |  |     " results in an E117 warning. | 
					
						
							|  |  |  |     if &omnifunc == "" | 
					
						
							|  |  |  |         setlocal omnifunc=sqlcomplete#Complete | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if exists('g:loaded_sql_completion') | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |     finish | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | endif | 
					
						
							| 
									
										
										
										
											2016-02-01 22:37:05 +01:00
										 |  |  | let g:loaded_sql_completion = 160 | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | let s:keepcpo= &cpo | 
					
						
							|  |  |  | set cpo&vim | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | " Maintains filename of dictionary | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  | let s:sql_file_table        = "" | 
					
						
							|  |  |  | let s:sql_file_procedure    = "" | 
					
						
							|  |  |  | let s:sql_file_view         = "" | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | " Define various arrays to be used for caching | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  | let s:tbl_name              = [] | 
					
						
							|  |  |  | let s:tbl_alias             = [] | 
					
						
							|  |  |  | let s:tbl_cols              = [] | 
					
						
							|  |  |  | let s:syn_list              = [] | 
					
						
							|  |  |  | let s:syn_value             = [] | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | " Used in conjunction with the syntaxcomplete plugin | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  | let s:save_inc              = "" | 
					
						
							|  |  |  | let s:save_exc              = "" | 
					
						
							| 
									
										
										
										
											2013-05-17 18:14:19 +02:00
										 |  |  | if !exists('g:omni_syntax_group_include_sql') | 
					
						
							|  |  |  |     let g:omni_syntax_group_include_sql = '' | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | endif | 
					
						
							| 
									
										
										
										
											2013-05-17 18:14:19 +02:00
										 |  |  | if !exists('g:omni_syntax_group_exclude_sql') | 
					
						
							|  |  |  |     let g:omni_syntax_group_exclude_sql = '' | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | endif | 
					
						
							| 
									
										
										
										
											2013-05-17 18:14:19 +02:00
										 |  |  | let s:save_inc = g:omni_syntax_group_include_sql | 
					
						
							|  |  |  | let s:save_exc = g:omni_syntax_group_exclude_sql | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | " Used with the column list | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  | let s:save_prev_table       = "" | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | " Default the option to verify table alias | 
					
						
							|  |  |  | if !exists('g:omni_sql_use_tbl_alias') | 
					
						
							|  |  |  |     let g:omni_sql_use_tbl_alias = 'a' | 
					
						
							|  |  |  | endif | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  | " Default syntax items to precache | 
					
						
							|  |  |  | if !exists('g:omni_sql_precache_syntax_groups') | 
					
						
							|  |  |  |     let g:omni_sql_precache_syntax_groups = [ | 
					
						
							| 
									
										
										
										
											2013-05-17 18:14:19 +02:00
										 |  |  |                 \ 'syntax\w*', | 
					
						
							|  |  |  |                 \ 'sqlKeyword\w*', | 
					
						
							|  |  |  |                 \ 'sqlFunction\w*', | 
					
						
							|  |  |  |                 \ 'sqlOption\w*', | 
					
						
							|  |  |  |                 \ 'sqlType\w*', | 
					
						
							|  |  |  |                 \ 'sqlStatement\w*' | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |                 \ ] | 
					
						
							|  |  |  | endif | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  | " Set ignorecase to the ftplugin standard | 
					
						
							|  |  |  | if !exists('g:omni_sql_ignorecase') | 
					
						
							|  |  |  |     let g:omni_sql_ignorecase = &ignorecase | 
					
						
							|  |  |  | endif | 
					
						
							|  |  |  | " During table completion, should the table list also | 
					
						
							|  |  |  | " include the owner name | 
					
						
							|  |  |  | if !exists('g:omni_sql_include_owner') | 
					
						
							|  |  |  |     let g:omni_sql_include_owner = 0 | 
					
						
							|  |  |  |     if exists('g:loaded_dbext') | 
					
						
							|  |  |  |         if g:loaded_dbext >= 300 | 
					
						
							|  |  |  |             " New to dbext 3.00, by default the table lists include the owner | 
					
						
							|  |  |  |             " name of the table.  This is used when determining how much of | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |             " whatever has been typed should be replaced as part of the | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |             " code replacement. | 
					
						
							|  |  |  |             let g:omni_sql_include_owner = 1 | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | endif | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | " Default type of completion used when <C-X><C-O> is pressed | 
					
						
							|  |  |  | if !exists('g:omni_sql_default_compl_type') | 
					
						
							|  |  |  |     let g:omni_sql_default_compl_type = 'table' | 
					
						
							|  |  |  | endif | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | " This function is used for the 'omnifunc' option. | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | " It is called twice by omni and it is responsible | 
					
						
							|  |  |  | " for returning the completion list of items. | 
					
						
							|  |  |  | " But it must also determine context of what to complete | 
					
						
							|  |  |  | " and what to "replace" with the completion. | 
					
						
							|  |  |  | " The a:base, is replaced directly with what the user | 
					
						
							|  |  |  | " chooses from the choices. | 
					
						
							|  |  |  | " The s:prepend provides context for the completion. | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | function! sqlcomplete#Complete(findstart, base) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     " Default to table name completion | 
					
						
							|  |  |  |     let compl_type = 'table' | 
					
						
							|  |  |  |     " Allow maps to specify what type of object completion they want | 
					
						
							|  |  |  |     if exists('b:sql_compl_type') | 
					
						
							|  |  |  |         let compl_type = b:sql_compl_type | 
					
						
							|  |  |  |     endif | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |     let begindot = 0 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |     " First pass through this function determines how much of the line should | 
					
						
							|  |  |  |     " be replaced by whatever is chosen from the completion list | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     if a:findstart | 
					
						
							|  |  |  |         " Locate the start of the item, including "." | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |         let line     = getline('.') | 
					
						
							|  |  |  |         let start    = col('.') - 1 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         let lastword = -1 | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |         " Check if the first character is a ".", for column completion | 
					
						
							|  |  |  |         if line[start - 1] == '.' | 
					
						
							|  |  |  |             let begindot = 1 | 
					
						
							|  |  |  |         endif | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         while start > 0 | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |             " Additional code was required to handle objects which | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  |             " can contain spaces like "my table name". | 
					
						
							|  |  |  |             if line[start - 1] !~ '\(\w\|\.\)' | 
					
						
							|  |  |  |                 " If the previous character is not a period or word character | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             " elseif line[start - 1] =~ '\(\w\|\s\+\)' | 
					
						
							|  |  |  |             "     let start -= 1 | 
					
						
							|  |  |  |             elseif line[start - 1] =~ '\w' | 
					
						
							|  |  |  |                 " If the previous character is word character continue back | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |                 let start -= 1 | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |             elseif line[start - 1] =~ '\.' && | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |                         \ compl_type =~ 'column\|table\|view\|procedure' | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  |                 " If the previous character is a period and we are completing | 
					
						
							|  |  |  |                 " an object which can be specified with a period like this: | 
					
						
							|  |  |  |                 "     table_name.column_name | 
					
						
							|  |  |  |                 "     owner_name.table_name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |                 " If lastword has already been set for column completion | 
					
						
							|  |  |  |                 " break from the loop, since we do not also want to pickup | 
					
						
							|  |  |  |                 " a table name if it was also supplied. | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |                 " Unless g:omni_sql_include_owner == 1, then we can | 
					
						
							|  |  |  |                 " include the ownername. | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |                 if lastword != -1 && compl_type == 'column' | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |                             \ && g:omni_sql_include_owner == 0 | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |                     break | 
					
						
							|  |  |  |                 endif | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |                 " If column completion was specified stop at the "." if | 
					
						
							|  |  |  |                 " a . was specified, otherwise, replace all the way up | 
					
						
							|  |  |  |                 " to the owner name (if included). | 
					
						
							|  |  |  |                 if lastword == -1 && compl_type == 'column' && begindot == 1 | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |                     let lastword = start | 
					
						
							|  |  |  |                 endif | 
					
						
							|  |  |  |                 " If omni_sql_include_owner = 0, do not include the table | 
					
						
							|  |  |  |                 " name as part of the substitution, so break here | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |                 if lastword == -1 && | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |                             \ compl_type =~ '\<\(table\|view\|procedure\|column\|column_csv\)\>' && | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |                             \ g:omni_sql_include_owner == 0 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |                     let lastword = start | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |                     break | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |                 endif | 
					
						
							|  |  |  |                 let start -= 1 | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |         endwhile | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         " Return the column of the last word, which is going to be changed. | 
					
						
							|  |  |  |         " Remember the text that comes before it in s:prepended. | 
					
						
							|  |  |  |         if lastword == -1 | 
					
						
							|  |  |  |             let s:prepended = '' | 
					
						
							|  |  |  |             return start | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |         let s:prepended = strpart(line, start, lastword - start) | 
					
						
							|  |  |  |         return lastword | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |     " Second pass through this function will determine what data to put inside | 
					
						
							|  |  |  |     " of the completion list | 
					
						
							|  |  |  |     " s:prepended is set by the first pass | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     let base = s:prepended . a:base | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |     " Default the completion list to an empty list | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     let compl_list = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     " Default to table name completion | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |     let compl_type = g:omni_sql_default_compl_type | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     " Allow maps to specify what type of object completion they want | 
					
						
							|  |  |  |     if exists('b:sql_compl_type') | 
					
						
							|  |  |  |         let compl_type = b:sql_compl_type | 
					
						
							|  |  |  |         unlet b:sql_compl_type | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if compl_type == 'tableReset' | 
					
						
							|  |  |  |         let compl_type = 'table' | 
					
						
							|  |  |  |         let base = '' | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if compl_type == 'table' || | 
					
						
							|  |  |  |                 \ compl_type == 'procedure' || | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |                 \ compl_type == 'view' | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         " This type of completion relies upon the dbext.vim plugin | 
					
						
							|  |  |  |         if s:SQLCCheck4dbext() == -1 | 
					
						
							|  |  |  |             return [] | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |         " Allow the user to override the dbext plugin to specify whether | 
					
						
							|  |  |  |         " the owner/creator should be included in the list | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |         if g:loaded_dbext >= 300 | 
					
						
							|  |  |  |             let saveSetting = DB_listOption('dict_show_owner') | 
					
						
							|  |  |  |             exec 'DBSetOption dict_show_owner='.(g:omni_sql_include_owner==1?'1':'0') | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |         endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let compl_type_uc = substitute(compl_type, '\w\+', '\u&', '') | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  |         " Same call below, no need to do it twice | 
					
						
							|  |  |  |         " if s:sql_file_{compl_type} == "" | 
					
						
							|  |  |  |         "     let s:sql_file_{compl_type} = DB_getDictionaryName(compl_type_uc) | 
					
						
							|  |  |  |         " endif | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |         let s:sql_file_{compl_type} = DB_getDictionaryName(compl_type_uc) | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         if s:sql_file_{compl_type} != "" | 
					
						
							|  |  |  |             if filereadable(s:sql_file_{compl_type}) | 
					
						
							|  |  |  |                 let compl_list = readfile(s:sql_file_{compl_type}) | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |         endif | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |         if g:loaded_dbext > 300 | 
					
						
							|  |  |  |             exec 'DBSetOption dict_show_owner='.saveSetting | 
					
						
							|  |  |  |         endif | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |     elseif compl_type =~? 'column' | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         " This type of completion relies upon the dbext.vim plugin | 
					
						
							|  |  |  |         if s:SQLCCheck4dbext() == -1 | 
					
						
							|  |  |  |             return [] | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if base == "" | 
					
						
							|  |  |  |             " The last time we displayed a column list we stored | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |             " the table name.  If the user selects a column list | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |             " without a table name of alias present, assume they want | 
					
						
							|  |  |  |             " the previous column list displayed. | 
					
						
							|  |  |  |             let base = s:save_prev_table | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |         let owner  = '' | 
					
						
							|  |  |  |         let column = '' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if base =~ '\.' | 
					
						
							|  |  |  |             " Check if the owner/creator has been specified | 
					
						
							|  |  |  |             let owner  = matchstr( base, '^\zs.*\ze\..*\..*' ) | 
					
						
							|  |  |  |             let table  = matchstr( base, '^\(.*\.\)\?\zs.*\ze\..*' ) | 
					
						
							|  |  |  |             let column = matchstr( base, '.*\.\zs.*' ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |             if g:omni_sql_include_owner == 1 && owner == '' && table != '' && column != '' | 
					
						
							|  |  |  |                 let owner  = table | 
					
						
							|  |  |  |                 let table  = column | 
					
						
							|  |  |  |                 let column = '' | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |             " It is pretty well impossible to determine if the user | 
					
						
							|  |  |  |             " has entered: | 
					
						
							|  |  |  |             "    owner.table | 
					
						
							|  |  |  |             "    table.column_prefix | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |             " So there are a couple of things we can do to mitigate | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |             " this issue. | 
					
						
							|  |  |  |             "    1.  Check if the dbext plugin has the option turned | 
					
						
							|  |  |  |             "        on to even allow owners | 
					
						
							|  |  |  |             "    2.  Based on 1, if the user is showing a table list | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |             "        and the DrillIntoTable (using <Right>) then | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |             "        this will be owner.table.  In this case, we can | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |             "        check to see the table.column exists in the | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |             "        cached table list.  If it does, then we have | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |             "        determined the user has actually chosen | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |             "        owner.table, not table.column_prefix. | 
					
						
							|  |  |  |             let found = -1 | 
					
						
							|  |  |  |             if g:omni_sql_include_owner == 1 && owner == '' | 
					
						
							|  |  |  |                 if filereadable(s:sql_file_table) | 
					
						
							|  |  |  |                     let tbl_list = readfile(s:sql_file_table) | 
					
						
							|  |  |  |                     let found    = index( tbl_list, ((table != '')?(table.'.'):'').column) | 
					
						
							|  |  |  |                 endif | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |             " If the table.column was found in the table list, we can safely assume | 
					
						
							|  |  |  |             " the owner was not provided and shift the items appropriately. | 
					
						
							|  |  |  |             " OR | 
					
						
							|  |  |  |             " If the user has indicated not to use table owners at all and | 
					
						
							|  |  |  |             " the base ends in a '.' we know they are not providing a column | 
					
						
							|  |  |  |             " name, so we can shift the items appropriately. | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |             " if found != -1 || (g:omni_sql_include_owner == 0 && base !~ '\.$') | 
					
						
							|  |  |  |             "     let owner  = table | 
					
						
							|  |  |  |             "     let table  = column | 
					
						
							|  |  |  |             "     let column = '' | 
					
						
							|  |  |  |             " endif | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |         else | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |             " If no "." was provided and the user asked for | 
					
						
							|  |  |  |             " column level completion, first attempt the match | 
					
						
							|  |  |  |             " on any previous column lists.  If the user asked | 
					
						
							|  |  |  |             " for a list of columns comma separated, continue as usual. | 
					
						
							|  |  |  |             if compl_type == 'column' && s:save_prev_table != '' | 
					
						
							|  |  |  |                 " The last time we displayed a column list we stored | 
					
						
							|  |  |  |                 " the table name.  If the user selects a column list | 
					
						
							|  |  |  |                 " without a table name of alias present, assume they want | 
					
						
							|  |  |  |                 " the previous column list displayed. | 
					
						
							|  |  |  |                 let table     = s:save_prev_table | 
					
						
							|  |  |  |                 let list_type = '' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 let compl_list  = s:SQLCGetColumns(table, list_type) | 
					
						
							|  |  |  |                 if ! empty(compl_list) | 
					
						
							|  |  |  |                     " If no column prefix has been provided and the table | 
					
						
							|  |  |  |                     " name was provided, append it to each of the items | 
					
						
							|  |  |  |                     " returned. | 
					
						
							|  |  |  |                     let compl_list = filter(deepcopy(compl_list), 'v:val=~"^'.base.'"' ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     " If not empty, we have a match on columns | 
					
						
							|  |  |  |                     " return the list | 
					
						
							|  |  |  |                     if ! empty(compl_list) | 
					
						
							|  |  |  |                         return compl_list | 
					
						
							|  |  |  |                     endif | 
					
						
							|  |  |  |                 endif | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |             " Since no columns were found to match the base supplied | 
					
						
							|  |  |  |             " assume the user is trying to complete the column list | 
					
						
							|  |  |  |             " for a table (and or an alias to a table). | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |             let table  = base | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |         " Get anything after the . and consider this the table name | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |         " If an owner has been specified, then we must consider the | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |         " base to be a partial column name | 
					
						
							|  |  |  |         " let base  = matchstr( base, '^\(.*\.\)\?\zs.*' ) | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |         if table != "" | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |             let s:save_prev_table = base | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |             let list_type         = '' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if compl_type == 'column_csv' | 
					
						
							|  |  |  |                 " Return one array element, with a comma separated | 
					
						
							|  |  |  |                 " list of values instead of multiple array entries | 
					
						
							|  |  |  |                 " for each column in the table. | 
					
						
							|  |  |  |                 let list_type     = 'csv' | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |             " If we are including the OWNER for the objects, then for | 
					
						
							|  |  |  |             " table completion, if we have it, it should be included | 
					
						
							|  |  |  |             " as there can be the same table names in a database yet | 
					
						
							|  |  |  |             " with different owner names. | 
					
						
							|  |  |  |             if g:omni_sql_include_owner == 1 && owner != '' && table != '' | 
					
						
							|  |  |  |                 let compl_list  = s:SQLCGetColumns(owner.'.'.table, list_type) | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 let compl_list  = s:SQLCGetColumns(table, list_type) | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |             if column != '' | 
					
						
							|  |  |  |                 " If no column prefix has been provided and the table | 
					
						
							|  |  |  |                 " name was provided, append it to each of the items | 
					
						
							|  |  |  |                 " returned. | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |                 let compl_list = map(compl_list, 'table.".".v:val') | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |                 if owner != '' | 
					
						
							|  |  |  |                     " If an owner has been provided append it to each of the | 
					
						
							|  |  |  |                     " items returned. | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |                     let compl_list = map(compl_list, 'owner.".".v:val') | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |                 endif | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 let base = '' | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if compl_type == 'column_csv' | 
					
						
							|  |  |  |                 " Join the column array into 1 single element array | 
					
						
							|  |  |  |                 " but make the columns column separated | 
					
						
							|  |  |  |                 let compl_list        = [join(compl_list, ', ')] | 
					
						
							|  |  |  |             endif | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         endif | 
					
						
							|  |  |  |     elseif compl_type == 'resetCache' | 
					
						
							|  |  |  |         " Reset all cached items | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |         let s:tbl_name           = [] | 
					
						
							|  |  |  |         let s:tbl_alias          = [] | 
					
						
							|  |  |  |         let s:tbl_cols           = [] | 
					
						
							|  |  |  |         let s:syn_list           = [] | 
					
						
							|  |  |  |         let s:syn_value          = [] | 
					
						
							| 
									
										
										
										
											2016-02-01 22:37:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if s:sql_file_table != "" | 
					
						
							|  |  |  |             if g:loaded_dbext >= 2300 | 
					
						
							|  |  |  |                 call DB_DictionaryDelete("table") | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 DBCompleteTables! | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |         if s:sql_file_procedure != "" | 
					
						
							|  |  |  |             if g:loaded_dbext >= 2300 | 
					
						
							|  |  |  |                 call DB_DictionaryDelete("procedure") | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 DBCompleteProcedures! | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |         if s:sql_file_view != "" | 
					
						
							|  |  |  |             if g:loaded_dbext >= 2300 | 
					
						
							|  |  |  |                 call DB_DictionaryDelete("view") | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 DBCompleteViews! | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |         let s:sql_file_table     = "" | 
					
						
							|  |  |  |         let s:sql_file_procedure = "" | 
					
						
							|  |  |  |         let s:sql_file_view      = "" | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         let msg = "All SQL cached items have been removed." | 
					
						
							|  |  |  |         call s:SQLCWarningMsg(msg) | 
					
						
							|  |  |  |         " Leave time for the user to read the error message | 
					
						
							|  |  |  |         :sleep 2 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |         let compl_list = s:SQLCGetSyntaxList(compl_type) | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if base != '' | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  |         " Filter the list based on the first few characters the user entered. | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |         " Check if the text matches at the beginning | 
					
						
							|  |  |  |         "         \\(^.base.'\\) | 
					
						
							|  |  |  |         " or | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  |         " Match to a owner.table or alias.column type match | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |         "         ^\\(\\w\\+\\.\\)\\?'.base.'\\) | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  |         " or | 
					
						
							|  |  |  |         " Handle names with spaces "my table name" | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |         "         "\\(^'.base.'\\|^\\(\\w\\+\\.\\)\\?'.base.'\\)"' | 
					
						
							|  |  |  |         " | 
					
						
							| 
									
										
										
										
											2010-01-06 20:54:52 +01:00
										 |  |  |         let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\|^\\(\\w\\+\\.\\)\\?'.base.'\\)"' | 
					
						
							|  |  |  |         " let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\)"' | 
					
						
							|  |  |  |         " let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\|\\(\\.\\)\\?'.base.'\\)"' | 
					
						
							|  |  |  |         " let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\|\\([^.]*\\)\\?'.base.'\\)"' | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |         let compl_list = filter(deepcopy(compl_list), expr) | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if empty(compl_list) && compl_type == 'table' && base =~ '\.$' | 
					
						
							|  |  |  |             " It is possible we could be looking for column name completion | 
					
						
							|  |  |  |             " and the user simply hit C-X C-O to lets try it as well | 
					
						
							|  |  |  |             " since we had no hits with the tables. | 
					
						
							|  |  |  |             " If the base ends with a . it is hard to know if we are | 
					
						
							|  |  |  |             " completing table names or column names. | 
					
						
							|  |  |  |             let list_type = '' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             let compl_list  = s:SQLCGetColumns(base, list_type) | 
					
						
							|  |  |  |         endif | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |     if exists('b:sql_compl_savefunc') && b:sql_compl_savefunc != "" | 
					
						
							|  |  |  |         let &omnifunc = b:sql_compl_savefunc | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |     if empty(compl_list) | 
					
						
							|  |  |  |         call s:SQLCWarningMsg( 'Could not find type['.compl_type.'] using prepend[.'.s:prepended.'] base['.a:base.']' ) | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     return compl_list | 
					
						
							|  |  |  | endfunc | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  | function! sqlcomplete#PreCacheSyntax(...) | 
					
						
							|  |  |  |     let syn_group_arr = [] | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  |     let syn_items     = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |     if a:0 > 0 | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  |         if type(a:1) != 3 | 
					
						
							|  |  |  |             call s:SQLCWarningMsg("Parameter is not a list. Example:['syntaxGroup1', 'syntaxGroup2']") | 
					
						
							|  |  |  |             return '' | 
					
						
							|  |  |  |         endif | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |         let syn_group_arr = a:1 | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         let syn_group_arr = g:omni_sql_precache_syntax_groups | 
					
						
							|  |  |  |     endif | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |     " For each group specified in the list, precache all | 
					
						
							| 
									
										
										
										
											2021-09-09 21:55:11 +02:00
										 |  |  |     " the syntax items. | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |     if !empty(syn_group_arr) | 
					
						
							|  |  |  |         for group_name in syn_group_arr | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  |             let syn_items = extend( syn_items, s:SQLCGetSyntaxList(group_name) ) | 
					
						
							|  |  |  |         endfor | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return syn_items | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function! sqlcomplete#ResetCacheSyntax(...) | 
					
						
							|  |  |  |     let syn_group_arr = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |     if a:0 > 0 | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  |         if type(a:1) != 3 | 
					
						
							|  |  |  |             call s:SQLCWarningMsg("Parameter is not a list. Example:['syntaxGroup1', 'syntaxGroup2']") | 
					
						
							|  |  |  |             return '' | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |         let syn_group_arr = a:1 | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         let syn_group_arr = g:omni_sql_precache_syntax_groups | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |     " For each group specified in the list, precache all | 
					
						
							| 
									
										
										
										
											2021-09-09 21:55:11 +02:00
										 |  |  |     " the syntax items. | 
					
						
							| 
									
										
										
										
											2010-08-01 16:13:51 +02:00
										 |  |  |     if !empty(syn_group_arr) | 
					
						
							|  |  |  |         for group_name in syn_group_arr | 
					
						
							|  |  |  |             let list_idx = index(s:syn_list, group_name, 0, &ignorecase) | 
					
						
							|  |  |  |             if list_idx > -1 | 
					
						
							|  |  |  |                 " Remove from list of groups | 
					
						
							|  |  |  |                 call remove( s:syn_list, list_idx ) | 
					
						
							|  |  |  |                 " Remove from list of keywords | 
					
						
							|  |  |  |                 call remove( s:syn_value, list_idx ) | 
					
						
							|  |  |  |             endif | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |         endfor | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function! sqlcomplete#Map(type) | 
					
						
							|  |  |  |     " Tell the SQL plugin what you want to complete | 
					
						
							|  |  |  |     let b:sql_compl_type=a:type | 
					
						
							|  |  |  |     " Record previous omnifunc, if the SQL completion | 
					
						
							|  |  |  |     " is being used in conjunction with other filetype | 
					
						
							|  |  |  |     " completion plugins | 
					
						
							|  |  |  |     if &omnifunc != "" && &omnifunc != 'sqlcomplete#Complete' | 
					
						
							|  |  |  |         " Record the previous omnifunc, the plugin | 
					
						
							|  |  |  |         " will automatically set this back so that it | 
					
						
							|  |  |  |         " does not interfere with other ftplugins settings | 
					
						
							|  |  |  |         let b:sql_compl_savefunc=&omnifunc | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |     " Set the OMNI func for the SQL completion plugin | 
					
						
							|  |  |  |     let &omnifunc='sqlcomplete#Complete' | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  | function! sqlcomplete#DrillIntoTable() | 
					
						
							|  |  |  |     " If the omni popup window is visible | 
					
						
							|  |  |  |     if pumvisible() | 
					
						
							|  |  |  |         call sqlcomplete#Map('column') | 
					
						
							|  |  |  |         " C-Y, makes the currently highlighted entry active | 
					
						
							|  |  |  |         " and trigger the omni popup to be redisplayed | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  |         call feedkeys("\<C-Y>\<C-X>\<C-O>", 'n') | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  | 	" If the popup is not visible, simple perform the normal | 
					
						
							|  |  |  | 	" key behaviour. | 
					
						
							| 
									
										
										
										
											2021-09-09 21:55:11 +02:00
										 |  |  | 	" Must use exec since the key must be preceded by "\" | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | 	" or feedkeys will simply push each character of the string | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  | 	" rather than the "key press". | 
					
						
							|  |  |  |         exec 'call feedkeys("\'.g:ftplugin_sql_omni_key_right.'", "n")' | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |     endif | 
					
						
							|  |  |  |     return "" | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function! sqlcomplete#DrillOutOfColumns() | 
					
						
							|  |  |  |     " If the omni popup window is visible | 
					
						
							|  |  |  |     if pumvisible() | 
					
						
							|  |  |  |         call sqlcomplete#Map('tableReset') | 
					
						
							|  |  |  |         " Trigger the omni popup to be redisplayed | 
					
						
							|  |  |  |         call feedkeys("\<C-X>\<C-O>") | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  | 	" If the popup is not visible, simple perform the normal | 
					
						
							|  |  |  | 	" key behaviour. | 
					
						
							| 
									
										
										
										
											2021-09-09 21:55:11 +02:00
										 |  |  | 	" Must use exec since the key must be preceded by "\" | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | 	" or feedkeys will simply push each character of the string | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  | 	" rather than the "key press". | 
					
						
							|  |  |  |         exec 'call feedkeys("\'.g:ftplugin_sql_omni_key_left.'", "n")' | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |     endif | 
					
						
							|  |  |  |     return "" | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function! s:SQLCWarningMsg(msg) | 
					
						
							|  |  |  |     echohl WarningMsg | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |     echomsg 'SQLComplete:'.a:msg | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |     echohl None | 
					
						
							|  |  |  | endfunction | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  | function! s:SQLCErrorMsg(msg) | 
					
						
							|  |  |  |     echohl ErrorMsg | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |     echomsg 'SQLComplete:'.a:msg | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |     echohl None | 
					
						
							|  |  |  | endfunction | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  | function! s:SQLCGetSyntaxList(syn_group) | 
					
						
							|  |  |  |     let syn_group  = a:syn_group | 
					
						
							|  |  |  |     let compl_list = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     " Check if we have already cached the syntax list | 
					
						
							|  |  |  |     let list_idx = index(s:syn_list, syn_group, 0, &ignorecase) | 
					
						
							|  |  |  |     if list_idx > -1 | 
					
						
							|  |  |  |         " Return previously cached value | 
					
						
							|  |  |  |         let compl_list = s:syn_value[list_idx] | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2013-05-17 18:14:19 +02:00
										 |  |  |         let s:save_inc = g:omni_syntax_group_include_sql | 
					
						
							|  |  |  |         let s:save_exc = g:omni_syntax_group_exclude_sql | 
					
						
							|  |  |  |         let g:omni_syntax_group_include_sql = '' | 
					
						
							|  |  |  |         let g:omni_syntax_group_exclude_sql = '' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |         " Request the syntax list items from the | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |         " syntax completion plugin | 
					
						
							|  |  |  |         if syn_group == 'syntax' | 
					
						
							|  |  |  |             " Handle this special case.  This allows the user | 
					
						
							|  |  |  |             " to indicate they want all the syntax items available, | 
					
						
							|  |  |  |             " so do not specify a specific include list. | 
					
						
							| 
									
										
										
										
											2013-05-17 18:14:19 +02:00
										 |  |  |             let syn_value                       = syntaxcomplete#OmniSyntaxList() | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |         else | 
					
						
							|  |  |  |             " The user has specified a specific syntax group | 
					
						
							|  |  |  |             let g:omni_syntax_group_include_sql = syn_group | 
					
						
							| 
									
										
										
										
											2013-05-17 18:14:19 +02:00
										 |  |  |             let syn_value                       = syntaxcomplete#OmniSyntaxList(syn_group) | 
					
						
							| 
									
										
										
										
											2006-04-05 20:41:53 +00:00
										 |  |  |         endif | 
					
						
							|  |  |  |         let g:omni_syntax_group_include_sql = s:save_inc | 
					
						
							|  |  |  |         let g:omni_syntax_group_exclude_sql = s:save_exc | 
					
						
							|  |  |  |         " Cache these values for later use | 
					
						
							|  |  |  |         let s:syn_list  = add( s:syn_list,  syn_group ) | 
					
						
							|  |  |  |         let s:syn_value = add( s:syn_value, syn_value ) | 
					
						
							|  |  |  |         let compl_list  = syn_value | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return compl_list | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | function! s:SQLCCheck4dbext() | 
					
						
							|  |  |  |     if !exists('g:loaded_dbext') | 
					
						
							|  |  |  |         let msg = "The dbext plugin must be loaded for dynamic SQL completion" | 
					
						
							|  |  |  |         call s:SQLCErrorMsg(msg) | 
					
						
							|  |  |  |         " Leave time for the user to read the error message | 
					
						
							|  |  |  |         :sleep 2 | 
					
						
							|  |  |  |         return -1 | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |     elseif g:loaded_dbext < 600 | 
					
						
							|  |  |  |         let msg = "The dbext plugin must be at least version 5.30 " . | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |                     \ " for dynamic SQL completion" | 
					
						
							|  |  |  |         call s:SQLCErrorMsg(msg) | 
					
						
							|  |  |  |         " Leave time for the user to read the error message | 
					
						
							|  |  |  |         :sleep 2 | 
					
						
							|  |  |  |         return -1 | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |     return 1 | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function! s:SQLCAddAlias(table_name, table_alias, cols) | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |     " Strip off the owner if included | 
					
						
							|  |  |  |     let table_name  = matchstr(a:table_name, '\%(.\{-}\.\)\?\zs\(.*\)' ) | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     let table_alias = a:table_alias | 
					
						
							|  |  |  |     let cols        = a:cols | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |     if g:omni_sql_use_tbl_alias != 'n' | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         if table_alias == '' | 
					
						
							|  |  |  |             if 'da' =~? g:omni_sql_use_tbl_alias | 
					
						
							|  |  |  |                 if table_name =~ '_' | 
					
						
							|  |  |  |                     " Treat _ as separators since people often use these | 
					
						
							|  |  |  |                     " for word separators | 
					
						
							|  |  |  |                     let save_keyword = &iskeyword | 
					
						
							|  |  |  |                     setlocal iskeyword-=_ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     " Get the first letter of each word | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |                     " [[:alpha:]] is used instead of \w | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |                     " to catch extended accented characters | 
					
						
							|  |  |  |                     " | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |                     let table_alias = substitute( | 
					
						
							|  |  |  |                                 \ table_name, | 
					
						
							|  |  |  |                                 \ '\<[[:alpha:]]\+\>_\?', | 
					
						
							|  |  |  |                                 \ '\=strpart(submatch(0), 0, 1)', | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |                                 \ 'g' | 
					
						
							|  |  |  |                                 \ ) | 
					
						
							|  |  |  |                     " Restore original value | 
					
						
							|  |  |  |                     let &iskeyword = save_keyword | 
					
						
							|  |  |  |                 elseif table_name =~ '\u\U' | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |                     let table_alias = substitute( | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |                                 \ table_name, '\(\u\)\U*', '\1', 'g') | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                     let table_alias = strpart(table_name, 0, 1) | 
					
						
							|  |  |  |                 endif | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |         if table_alias != '' | 
					
						
							|  |  |  |             " Following a word character, make sure there is a . and no spaces | 
					
						
							|  |  |  |             let table_alias = substitute(table_alias, '\w\zs\.\?\s*$', '.', '') | 
					
						
							|  |  |  |             if 'a' =~? g:omni_sql_use_tbl_alias && a:table_alias == '' | 
					
						
							|  |  |  |                 let table_alias = inputdialog("Enter table alias:", table_alias) | 
					
						
							|  |  |  |             endif | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |         if table_alias != '' | 
					
						
							|  |  |  |             let cols = substitute(cols, '\<\w', table_alias.'&', 'g') | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return cols | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | function! s:SQLCGetObjectOwner(object) | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |     " The owner regex matches a word at the start of the string which is | 
					
						
							|  |  |  |     " followed by a dot, but doesn't include the dot in the result. | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |     " ^           - from beginning of line | 
					
						
							|  |  |  |     " \("\|\[\)\? - ignore any quotes | 
					
						
							|  |  |  |     " \zs         - start the match now | 
					
						
							|  |  |  |     " .\{-}       - get owner name | 
					
						
							|  |  |  |     " \ze         - end the match | 
					
						
							|  |  |  |     " \("\|\[\)\? - ignore any quotes | 
					
						
							|  |  |  |     " \.          - must by followed by a . | 
					
						
							|  |  |  |     " let owner = matchstr( a:object, '^\s*\zs.*\ze\.' ) | 
					
						
							|  |  |  |     let owner = matchstr( a:object, '^\("\|\[\)\?\zs\.\{-}\ze\("\|\]\)\?\.' ) | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |     return owner | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | endfunction | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | function! s:SQLCGetColumns(table_name, list_type) | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |     if a:table_name =~ '\.' | 
					
						
							|  |  |  |         " Check if the owner/creator has been specified | 
					
						
							|  |  |  |         let owner  = matchstr( a:table_name, '^\zs.*\ze\..*\..*' ) | 
					
						
							|  |  |  |         let table  = matchstr( a:table_name, '^\(.*\.\)\?\zs.*\ze\..*' ) | 
					
						
							|  |  |  |         let column = matchstr( a:table_name, '.*\.\zs.*' ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if g:omni_sql_include_owner == 1 && owner == '' && table != '' && column != '' | 
					
						
							|  |  |  |             let owner  = table | 
					
						
							|  |  |  |             let table  = column | 
					
						
							|  |  |  |             let column = '' | 
					
						
							|  |  |  |         endif | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         let owner  = '' | 
					
						
							|  |  |  |         let table  = matchstr(a:table_name, '^["\[\]a-zA-Z0-9_ ]\+\ze\.\?') | 
					
						
							|  |  |  |         let column = '' | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-05 18:27:07 +00:00
										 |  |  |     " Check if the table name was provided as part of the column name | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |     " let table_name   = matchstr(a:table_name, '^["\[\]a-zA-Z0-9_ ]\+\ze\.\?') | 
					
						
							|  |  |  |     let table_name   = table | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     let table_cols   = [] | 
					
						
							|  |  |  |     let table_alias  = '' | 
					
						
							|  |  |  |     let move_to_top  = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |     let table_name   = substitute(table_name, '\s*\(.\{-}\)\s*$', '\1', 'g') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     " If the table name was given as: | 
					
						
							|  |  |  |     "     where c. | 
					
						
							|  |  |  |     let table_name   = substitute(table_name, '^\c\(WHERE\|AND\|OR\)\s\+', '', '') | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |     if g:loaded_dbext >= 300 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         let saveSettingAlias = DB_listOption('use_tbl_alias') | 
					
						
							|  |  |  |         exec 'DBSetOption use_tbl_alias=n' | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |     let table_name_stripped = substitute(table_name, '["\[\]]*', '', 'g') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     " Check if we have already cached the column list for this table | 
					
						
							|  |  |  |     " by its name | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |     let list_idx = index(s:tbl_name, table_name_stripped, 0, &ignorecase) | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     if list_idx > -1 | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |         let table_cols = split(s:tbl_cols[list_idx], '\n') | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |         " Check if we have already cached the column list for this table | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         " by its alias, assuming the table_name provided was actually | 
					
						
							|  |  |  |         " the alias for the table instead | 
					
						
							|  |  |  |         "     select * | 
					
						
							|  |  |  |         "       from area a | 
					
						
							|  |  |  |         "      where a. | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |         let list_idx = index(s:tbl_alias, table_name_stripped, 0, &ignorecase) | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         if list_idx > -1 | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |             let table_alias = table_name_stripped | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |             let table_name  = s:tbl_name[list_idx] | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |             let table_cols  = split(s:tbl_cols[list_idx], '\n') | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         endif | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     " If we have not found a cached copy of the table | 
					
						
							|  |  |  |     " And the table ends in a "." or we are looking for a column list | 
					
						
							|  |  |  |     " if list_idx == -1 && (a:table_name =~ '\.' || b:sql_compl_type =~ 'column') | 
					
						
							|  |  |  |     " if list_idx == -1 && (a:table_name =~ '\.' || a:list_type =~ 'csv') | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |     if list_idx == -1 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |          let saveY      = @y | 
					
						
							|  |  |  |          let saveSearch = @/ | 
					
						
							|  |  |  |          let saveWScan  = &wrapscan | 
					
						
							|  |  |  |          let curline    = line(".") | 
					
						
							|  |  |  |          let curcol     = col(".") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 21:55:11 +02:00
										 |  |  |          " Do not let searches wrap | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |          setlocal nowrapscan | 
					
						
							|  |  |  |          " If . was entered, look at the word just before the . | 
					
						
							|  |  |  |          " We are looking for something like this: | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |          "    select * | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |          "      from customer c | 
					
						
							|  |  |  |          "     where c. | 
					
						
							|  |  |  |          " So when . is pressed, we need to find 'c' | 
					
						
							|  |  |  |          " | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          " Search backwards to the beginning of the statement | 
					
						
							|  |  |  |          " and do NOT wrap | 
					
						
							|  |  |  |          " exec 'silent! normal! v?\<\(select\|update\|delete\|;\)\>'."\n".'"yy' | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  |          exec 'silent! normal! ?\<\c\(select\|update\|delete\|;\)\>'."\n" | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |          " Start characterwise visual mode | 
					
						
							|  |  |  |          " Advance right one character | 
					
						
							| 
									
										
										
										
											2017-11-02 22:58:42 +01:00
										 |  |  |          " Search forward until one of the following: | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |          "     1.  Another select/update/delete statement | 
					
						
							|  |  |  |          "     2.  A ; at the end of a line (the delimiter) | 
					
						
							| 
									
										
										
										
											2021-09-09 21:55:11 +02:00
										 |  |  |          "     3.  The end of the file (in case no delimiter) | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |          " Yank the visually selected text into the "y register. | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  |          exec 'silent! normal! vl/\c\(\<select\>\|\<update\>\|\<delete\>\|;\s*$\|\%$\)'."\n".'"yy' | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |          let query = @y | 
					
						
							|  |  |  |          let query = substitute(query, "\n", ' ', 'g') | 
					
						
							|  |  |  |          let found = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  |          " if query =~? '^\c\(select\)' | 
					
						
							|  |  |  |          if query =~? '^\(select\|update\|delete\)' | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |              let found = 1 | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |              "  \(\(\<\w\+\>\)\.\)\?   - | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  |              " '\c\(from\|join\|,\).\{-}'  - Starting at the from clause (case insensitive) | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |              " '\zs\(\(\<\w\+\>\)\.\)\?' - Get the owner name (optional) | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |              " '\<\w\+\>\ze' - Get the table name | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |              " '\s\+\<'.table_name.'\>' - Followed by the alias | 
					
						
							|  |  |  |              " '\s*\.\@!.*'  - Cannot be followed by a . | 
					
						
							|  |  |  |              " '\(\<where\>\|$\)' - Must be followed by a WHERE clause | 
					
						
							|  |  |  |              " '.*'  - Exclude the rest of the line in the match | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |              " let table_name_new = matchstr(@y, | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  |              "             \ '\c\(from\|join\|,\).\{-}'. | 
					
						
							|  |  |  |              "             \ '\zs\(\("\|\[\)\?.\{-}\("\|\]\)\.\)\?'. | 
					
						
							|  |  |  |              "             \ '\("\|\[\)\?.\{-}\("\|\]\)\?\ze'. | 
					
						
							|  |  |  |              "             \ '\s\+\%(as\s\+\)\?\<'. | 
					
						
							|  |  |  |              "             \ matchstr(table_name, '.\{-}\ze\.\?$'). | 
					
						
							|  |  |  |              "             \ '\>'. | 
					
						
							|  |  |  |              "             \ '\s*\.\@!.*'. | 
					
						
							|  |  |  |              "             \ '\(\<where\>\|$\)'. | 
					
						
							|  |  |  |              "             \ '.*' | 
					
						
							|  |  |  |              "             \ ) | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |              " | 
					
						
							|  |  |  |              " | 
					
						
							|  |  |  |              " ''\c\(\<from\>\|\<join\>\|,\)\s*'  - Starting at the from clause (case insensitive) | 
					
						
							|  |  |  |              " '\zs\(\("\|\[\)\?\w\+\("\|\]\)\?\.\)\?' - Get the owner name (optional) | 
					
						
							|  |  |  |              " '\("\|\[\)\?\w\+\("\|\]\)\?\ze' - Get the table name | 
					
						
							|  |  |  |              " '\s\+\%(as\s\+\)\?\<'.matchstr(table_name, '.\{-}\ze\.\?$').'\>' - Followed by the alias | 
					
						
							|  |  |  |              " '\s*\.\@!.*'  - Cannot be followed by a . | 
					
						
							|  |  |  |              " '\(\<where\>\|$\)' - Must be followed by a WHERE clause | 
					
						
							|  |  |  |              " '.*'  - Exclude the rest of the line in the match | 
					
						
							|  |  |  |              let table_name_new = matchstr(@y, | 
					
						
							| 
									
										
										
										
											2010-05-14 23:24:24 +02:00
										 |  |  |                          \ '\c\(\<from\>\|\<join\>\|,\)\s*'. | 
					
						
							|  |  |  |                          \ '\zs\(\("\|\[\)\?\w\+\("\|\]\)\?\.\)\?'. | 
					
						
							|  |  |  |                          \ '\("\|\[\)\?\w\+\("\|\]\)\?\ze'. | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |                          \ '\s\+\%(as\s\+\)\?\<'. | 
					
						
							|  |  |  |                          \ matchstr(table_name, '.\{-}\ze\.\?$'). | 
					
						
							|  |  |  |                          \ '\>'. | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |                          \ '\s*\.\@!.*'. | 
					
						
							|  |  |  |                          \ '\(\<where\>\|$\)'. | 
					
						
							|  |  |  |                          \ '.*' | 
					
						
							|  |  |  |                          \ ) | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |              if table_name_new != '' | 
					
						
							|  |  |  |                  let table_alias = table_name | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |                  if g:omni_sql_include_owner == 1 | 
					
						
							|  |  |  |                     let table_name  = matchstr( table_name_new, '^\zs\(.\{-}\.\)\?\(.\{-}\.\)\?.*\ze' ) | 
					
						
							|  |  |  |                  else | 
					
						
							|  |  |  |                      " let table_name  = matchstr( table_name_new, '^\(.*\.\)\?\zs.*\ze' ) | 
					
						
							|  |  |  |                     let table_name  = matchstr( table_name_new, '^\(.\{-}\.\)\?\zs\(.\{-}\.\)\?.*\ze' ) | 
					
						
							|  |  |  |                  endif | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                  let list_idx = index(s:tbl_name, table_name, 0, &ignorecase) | 
					
						
							|  |  |  |                  if list_idx > -1 | 
					
						
							|  |  |  |                      let table_cols  = split(s:tbl_cols[list_idx]) | 
					
						
							|  |  |  |                      let s:tbl_name[list_idx]  = table_name | 
					
						
							|  |  |  |                      let s:tbl_alias[list_idx] = table_alias | 
					
						
							|  |  |  |                  else | 
					
						
							|  |  |  |                      let list_idx = index(s:tbl_alias, table_name, 0, &ignorecase) | 
					
						
							|  |  |  |                      if list_idx > -1 | 
					
						
							|  |  |  |                          let table_cols = split(s:tbl_cols[list_idx]) | 
					
						
							|  |  |  |                          let s:tbl_name[list_idx]  = table_name | 
					
						
							|  |  |  |                          let s:tbl_alias[list_idx] = table_alias | 
					
						
							|  |  |  |                      endif | 
					
						
							|  |  |  |                  endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              endif | 
					
						
							|  |  |  |          else | 
					
						
							|  |  |  |              " Simply assume it is a table name provided with a . on the end | 
					
						
							|  |  |  |              let found = 1 | 
					
						
							|  |  |  |          endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          let @y        = saveY | 
					
						
							|  |  |  |          let @/        = saveSearch | 
					
						
							|  |  |  |          let &wrapscan = saveWScan | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          " Return to previous location | 
					
						
							|  |  |  |          call cursor(curline, curcol) | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |          if found == 0 | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |              if g:loaded_dbext > 300 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |                  exec 'DBSetOption use_tbl_alias='.saveSettingAlias | 
					
						
							|  |  |  |              endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              " Not a SQL statement, do not display a list | 
					
						
							|  |  |  |              return [] | 
					
						
							|  |  |  |          endif | 
					
						
							| 
									
										
										
										
											2012-02-22 17:30:19 +01:00
										 |  |  |     endif | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if empty(table_cols) | 
					
						
							|  |  |  |         " Specify silent mode, no messages to the user (tbl, 1) | 
					
						
							|  |  |  |         " Specify do not comma separate (tbl, 1, 1) | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  |         " let table_cols_str = DB_getListColumn(table_name, 1, 1) | 
					
						
							|  |  |  |         let table_cols_str = DB_getListColumn((owner!=''?owner.'.':'').table_name, 1, 1) | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if table_cols_str != "" | 
					
						
							|  |  |  |             let s:tbl_name  = add( s:tbl_name,  table_name ) | 
					
						
							|  |  |  |             let s:tbl_alias = add( s:tbl_alias, table_alias ) | 
					
						
							|  |  |  |             let s:tbl_cols  = add( s:tbl_cols,  table_cols_str ) | 
					
						
							| 
									
										
										
										
											2008-06-24 22:58:06 +00:00
										 |  |  |             let table_cols  = split(table_cols_str, '\n') | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-22 22:33:57 +00:00
										 |  |  |     if g:loaded_dbext > 300 | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         exec 'DBSetOption use_tbl_alias='.saveSettingAlias | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |     " If the user has asked for a comma separate list of column | 
					
						
							|  |  |  |     " values, ask the user if they want to prepend each column | 
					
						
							|  |  |  |     " with a tablename alias. | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |     if a:list_type == 'csv' && !empty(table_cols) | 
					
						
							| 
									
										
										
										
											2006-04-27 00:02:13 +00:00
										 |  |  |         let cols       = join(table_cols, ', ') | 
					
						
							|  |  |  |         let cols       = s:SQLCAddAlias(table_name, table_alias, cols) | 
					
						
							| 
									
										
										
										
											2006-03-29 21:18:24 +00:00
										 |  |  |         let table_cols = [cols] | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return table_cols | 
					
						
							|  |  |  | endfunction | 
					
						
							| 
									
										
										
										
											2012-12-05 19:01:43 +01:00
										 |  |  | "  Restore: | 
					
						
							|  |  |  | let &cpo= s:keepcpo | 
					
						
							|  |  |  | unlet s:keepcpo | 
					
						
							|  |  |  | " vim: ts=4 fdm=marker |