[Gambas-user] PostgreSQL multiple column problem

Markus Schatten markus.schatten at ...2005...
Thu Oct 18 21:02:15 CEST 2012


Dear Fabien,

I'm using Gambas 3.3.0. Under database manager you mean the connection
manager? I just tried it out, see attached screenshot. The query
doesn't return any results, just pops up a "OK".

All the best,

M.

On Thu, Oct 18, 2012 at 9:19 AM, Fabien Bodard <gambas.fr at ...626...> wrote:
> Have you try your sql request in the gambas3 IDE database manager?
> Le 18 oct. 2012 02:54, "Markus Schatten" <markus.schatten at ...2005...> a écrit :
>
>> Dear Fabien and Ian,
>>
>> thank you for your reply. I was kind of hoping that there is a way to
>> index the results. I started of to write a query rewriter, but got
>> soon into trouble with lots of possible ways of writing a query. I
>> would probably need a grammar parser to do that ;-)
>>
>> Anyways, after looking up the SELECT syntax, I found another way. I
>> wasn't aware of the WITH clause in a select statement which allows you
>> (at least in PostgreSQL) to create an alias for a subquery with
>> specified column names. I used this to create a rewrite. The idea is
>> to construct a query like:
>>
>> WITH query(a0, a1) AS (SELECT * FROM test t1, test t2) SELECT * FROM query
>>
>> which replaces the initial column names with a0 and a1. Afterwards I
>> put the original column names into the TableView header (datasource +
>> dataview doesn't work since the table attribute doesn't seem to accept
>> WITH queries - is there a reason for that, or is that a bug?). Here is
>> the solution if anyone might need it:
>>
>>
>> Public con As New Connection
>> Public original As New String[]
>>
>> Public Sub _new()
>>   With con
>>     .Type = "postgresql"
>>     .Name = "db"
>>     .User = "markus"
>>     .Password = "secret"
>>     .Open
>>   End With
>>   execute(rewrite_query("SELECT * FROM test t1, test t2"))
>> End
>>
>> Public Sub execute(query As String)
>>   ' execute the query and show the results
>>   Dim res As Result
>>   Dim rfield As ResultField
>>   Dim col_counter, row_counter, i As Integer
>>   Dim context As New Collection
>>   res = con.Exec(query)
>>   TableView1.Rows.Count = res.Count
>>   TableView1.Columns.Count = res.Fields.Count
>>   For i = 0 To original.Max
>>     TableView1.Columns[i].Title = original[i]
>>   Next
>>   row_counter = 0
>>   For Each res
>>     col_counter = 0
>>     context["res"] = res
>>     TableView1.Row = row_counter
>>     For Each rfield In res.Fields
>>      TableView1.Column = col_counter
>>       TableView1.Current.Text = Eval("res!" & rfield.Name, context)
>>       col_counter += 1
>>     Next
>>     row_counter += 1
>>   Next
>> End
>>
>>
>> Public Function find_all(subj As String, pattern As String, Optional
>> submatchindex As Integer = 0) As String[]
>>   ' findall matches of a given regex in a given string, return only
>> submatches if submatchindex is specified
>>   Dim re As Regexp
>>   Dim matches As New String[]
>>   re = New Regexp(subj, pattern)
>>
>>   Do While re.offset >= 0 And subj <> ""
>>     If submatchindex = 0 Then
>>       matches.push(re.Text)
>>     Else
>>       matches.push(re.SubMatches[submatchindex].Text)
>>     End If
>>     If Len(subj) > Len(re.text) Then
>>       subj = Mid(subj, re.offset + Len(re.text) + 1)
>>     Else
>>       subj = ""
>>     End If
>>       If subj <> "" Then re.exec(subj)
>>   Loop
>>   Return matches
>> End
>>
>> Public Function rewrite_query(query As String) As String
>>   ' rewrite the query to return distinct column names
>>   Dim has_asterisk As String[]
>>   Dim defined_limit As String[]
>>   Dim replace_limit As String
>>   Dim query_copy As String
>>   Dim res As Result
>>   Dim rfield As ResultField
>>   Dim counter As Collection
>>   Dim with_string As String
>>   Dim i As Integer
>>   has_asterisk = find_all(query, "(?i)select (.*?[\\*].*?) from", 1)
>>   If has_asterisk.Count > 0 Then
>>     query_copy = query
>>     defined_limit = find_all(query, "(?i)(limit +[0-9]+)", 1)
>>     If defined_limit.Count > 0 Then
>>       For Each replace_limit In defined_limit
>>         query = Replace(query, replace_limit, "LIMIT 1")
>>       Next
>>     Else
>>       query &= " LIMIT 1"
>>     Endif
>>     res = con.Exec(query)
>>     For Each res
>>       counter = New Collection
>>       For Each rfield In res.Fields
>>         original.Push(rfield.name)
>>       Next
>>     Next
>>     with_string = "WITH query("
>>     For i = 0 To original.Max
>>       with_string &= "a" & Str(i) & ", "
>>     Next
>>     with_string = Left$(with_string, -2) & ") AS (" & query_copy & ")
>> SELECT * FROM query"
>>     Print with_string
>>     Return with_string
>>   Else
>>     Return query
>>   Endif
>> End
>>
>> On Wed, Oct 17, 2012 at 10:33 AM, Ian Haywood <ihaywood at ...1979...>
>> wrote:
>> > No, I think its your best solution
>> > Maybe your users can just type in the "where" part of the query and
>> > then you add the rest?
>>
>> The app is a database development environment, so users have to enter
>> the whole query. I will try to find solutions for other dbms' (I'm
>> planning to support SQLite and MySQL as well) so if anyone has another
>> idea on how to approach the matter, I'll be happy to see a solution.
>>
>> All the best,
>>
>> M.
>>
>> --
>> Markus Schatten, PhD
>> Assistant professor
>> University of Zagreb
>> Faculty of Organization and Informatics
>> Pavlinska 2, 42000 Varazdin, Croatia
>> http://www.foi.hr/nastavnici/schatten.markus/index.html
>> http://www.researchgate.net/profile/Markus_Schatten1
>>
>>
>> ------------------------------------------------------------------------------
>> Everyone hates slow websites. So do we.
>> Make your web apps faster with AppDynamics
>> Download AppDynamics Lite for free today:
>> http://p.sf.net/sfu/appdyn_sfd2d_oct
>> _______________________________________________
>> Gambas-user mailing list
>> Gambas-user at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/gambas-user
>>
> ------------------------------------------------------------------------------
> Everyone hates slow websites. So do we.
> Make your web apps faster with AppDynamics
> Download AppDynamics Lite for free today:
> http://p.sf.net/sfu/appdyn_sfd2d_oct
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user



-- 
Markus Schatten, PhD
Assistant professor
University of Zagreb
Faculty of Organization and Informatics
Pavlinska 2, 42000 Varazdin, Croatia
http://www.foi.hr/nastavnici/schatten.markus/index.html
http://www.researchgate.net/profile/Markus_Schatten1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: with_query.png
Type: image/png
Size: 34894 bytes
Desc: not available
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20121018/c53626ea/attachment.png>


More information about the User mailing list