diff runtime/autoload/sqlcomplete.vim @ 1126:c5c164b4c95c

updated for version 7.1a
author vimboss
date Sat, 05 May 2007 18:27:07 +0000
parents d3bbb5dd3913
children 18ee39301b82
line wrap: on
line diff
--- a/runtime/autoload/sqlcomplete.vim
+++ b/runtime/autoload/sqlcomplete.vim
@@ -1,8 +1,8 @@
 " Vim OMNI completion script for SQL
 " Language:    SQL
 " Maintainer:  David Fishburn <fishburn@ianywhere.com>
-" Version:     4.0
-" Last Change: Wed Apr 26 2006 3:00:06 PM
+" Version:     5.0
+" Last Change: Mon Jun 05 2006 3:30:04 PM
 " Usage:       For detailed help
 "              ":help sql.txt" 
 "              or ":help ft-sql-omni" 
@@ -22,7 +22,7 @@ endif
 if exists('g:loaded_sql_completion')
     finish 
 endif
-let g:loaded_sql_completion = 40
+let g:loaded_sql_completion = 50
 
 " Maintains filename of dictionary
 let s:sql_file_table        = ""
@@ -113,7 +113,7 @@ function! sqlcomplete#Complete(findstart
                 " 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.
-                if lastword != -1 && compl_type == 'column'
+                if lastword != -1 && compl_type == 'column' 
                     break
                 endif
                 " If column completion was specified stop at the "." if
@@ -176,11 +176,19 @@ function! sqlcomplete#Complete(findstart
             return []
         endif
 
+        " Allow the user to override the dbext plugin to specify whether
+        " the owner/creator should be included in the list
+        let saved_dbext_show_owner      = 1
+        if exists('g:dbext_default_dict_show_owner')
+            let saved_dbext_show_owner  = g:dbext_default_dict_show_owner
+        endif
+        let g:dbext_default_dict_show_owner = g:omni_sql_include_owner
+
+        let compl_type_uc = substitute(compl_type, '\w\+', '\u&', '')
         if s:sql_file_{compl_type} == ""
-            let compl_type = substitute(compl_type, '\w\+', '\u&', '')
-            let s:sql_file_{compl_type} = DB_getDictionaryName(compl_type)
+            let s:sql_file_{compl_type} = DB_getDictionaryName(compl_type_uc)
         endif
-        let s:sql_file_{compl_type} = DB_getDictionaryName(compl_type)
+        let s:sql_file_{compl_type} = DB_getDictionaryName(compl_type_uc)
         if s:sql_file_{compl_type} != ""
             if filereadable(s:sql_file_{compl_type})
                 let compl_list = readfile(s:sql_file_{compl_type})
@@ -194,7 +202,9 @@ function! sqlcomplete#Complete(findstart
                 " endif
             endif
         endif
-    elseif compl_type == 'column'
+
+        let g:dbext_default_dict_show_owner = saved_dbext_show_owner
+    elseif compl_type =~? 'column'
 
         " This type of completion relies upon the dbext.vim plugin
         if s:SQLCCheck4dbext() == -1
@@ -209,33 +219,88 @@ function! sqlcomplete#Complete(findstart
             let base = s:save_prev_table
         endif
 
-        if base != ""
-            let compl_list        = s:SQLCGetColumns(base, '')
-            let s:save_prev_table = base
-            let base              = ''
-        endif
-    elseif compl_type == 'column_csv'
+        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.*' )
 
-        " This type of completion relies upon the dbext.vim plugin
-        if s:SQLCCheck4dbext() == -1
-            return []
+            " It is pretty well impossible to determine if the user
+            " has entered:
+            "    owner.table
+            "    table.column_prefix
+            " So there are a couple of things we can do to mitigate 
+            " 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
+            "        and the DrillIntoTable (using <C-Right>) then 
+            "        this will be owner.table.  In this case, we can
+            "        check to see the table.column exists in the 
+            "        cached table list.  If it does, then we have
+            "        determined the user has actually chosen 
+            "        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.
+            if found != -1 || (g:omni_sql_include_owner == 0 && base !~ '\.$')
+                let owner  = table
+                let table  = column
+                let column = ''
+            endif
+        else
+            let table  = base
         endif
 
-        if base == ""
-            " 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 base = s:save_prev_table
-        endif
+        " Get anything after the . and consider this the table name
+        " If an owner has been specified, then we must consider the 
+        " base to be a partial column name
+        " let base  = matchstr( base, '^\(.*\.\)\?\zs.*' )
+
+        if table != ""
+            let s:save_prev_table = base
+            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
 
-        if base != ""
-            let compl_list        = s:SQLCGetColumns(base, 'csv')
-            let s:save_prev_table = base
-            " Join the column array into 1 single element array
-            " but make the columns column separated
-            let compl_list        = [join(compl_list, ', ')]
-            let base              = ''
+            let compl_list  = s:SQLCGetColumns(table, list_type)
+            if column != ''
+                " If no column prefix has been provided and the table
+                " name was provided, append it to each of the items
+                " returned.
+                let compl_list = map(compl_list, "table.'.'.v:val")
+                if owner != ''
+                    " If an owner has been provided append it to each of the
+                    " items returned.
+                    let compl_list = map(compl_list, "owner.'.'.v:val")
+                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
         endif
     elseif compl_type == 'resetCache'
         " Reset all cached items
@@ -256,7 +321,7 @@ function! sqlcomplete#Complete(findstart
     if base != ''
         " Filter the list based on the first few characters the user
         " entered
-        let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "^'.base.'"'
+        let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\|\\([^.]*\\)\\?'.base.'\\)"'
         let compl_list = filter(deepcopy(compl_list), expr)
     endif
 
@@ -274,6 +339,8 @@ function! sqlcomplete#PreCacheSyntax(...
     else
         let syn_group_arr = g:omni_sql_precache_syntax_groups
     endif
+    " For each group specified in the list, precache all
+    " the sytnax items.
     if !empty(syn_group_arr)
         for group_name in syn_group_arr
             call s:SQLCGetSyntaxList(group_name)
@@ -444,9 +511,23 @@ function! s:SQLCAddAlias(table_name, tab
     return cols
 endfunction
 
+function! s:SQLCGetObjectOwner(object) 
+    " 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.
+    " ^    - from beginning of line
+    " "\?  - ignore any quotes
+    " \zs  - start the match now
+    " \w\+ - get owner name
+    " \ze  - end the match
+    " "\?  - ignore any quotes
+    " \.   - must by followed by a .
+    let owner = matchstr( a:object, '^"\?\zs\w\+\ze"\?\.' )
+    return owner
+endfunction 
+
 function! s:SQLCGetColumns(table_name, list_type)
-    let table_name   = matchstr(a:table_name, '^\w\+')
-    let table_name   = matchstr(a:table_name, '^[a-zA-Z0-9_.]\+')
+    " Check if the table name was provided as part of the column name
+    let table_name   = matchstr(a:table_name, '^[a-zA-Z0-9_]\+\ze\.\?')
     let table_cols   = []
     let table_alias  = ''
     let move_to_top  = 1