- Aug 02, 2017
-
-
gmantele authored
On the contrary to other DBMS, MySQL supports schemas, but as databases. Which means that JDBCConnection gets from the JDBC driver that MySQL does not support schemas and so it tries to access TAP_SCHEMA tables with a 'TAP_SCHEMA_' prefix instead of 'TAP_SCHEMA.' one. Since MySQL does behave like it supports schemas, JDBCConnection.supportsSchema must be set to 'true' if the DBMS is MySQL. Besides, since no schemas are returned by the JDBC driver (cf DatabaseMetadata.listSchema(...)), the function JDBCConnection.isSchemaExisting(String, DatabaseMetaData) must always assume that the specified schema exists if the DBMS is MySQL. This is particularly important when the existence of 'TAP_UPLOAD' must be checked, because if the function returns 'false' the library will attempt to create the database/schema 'TAP_UPLOAD' and will obviously fail due to a lack of permissions. Of course, it means that the TAP implementor must create manually the schema/database 'TAP_UPLOAD' him-/her-self. The second particularity of MySQL is the quote character for identifiers. It is a back-quote (`) instead of a double quote ("). To reflect this difference, JDBCTranslator.appendIdentifier(...) has been overwritten in a new JDBCTranslator extension: MySQLTranslator. The translation of all SQL types and mathematical functions have been adapted to MySQL according to the online documentation. Few tests have been done locally with a tiny database. This seems to work but further testing should be performed in order to ensure the stability of this implementation.
-
- Jun 01, 2017
-
-
gmantele authored
This infinite loop occured only when the replacement object is just a wrapping of the matching object ; after replacement, the new object was inspected for matching objects. Example: infinite loop if we want to wrap all foo(...) functions with the function ROUND in the following query: SELECT foo(foo(123)) FROM myTable Expected result: SELECT ROUND(foo(ROUND(foo(123)))) FROM myTable But generated result was: SELECT ROUND(ROUND(ROUND(......foo(foo(123))))) FROM myTable
-
- May 10, 2017
-
-
gmantele authored
See the test case TestDBChecker.testClauseADQLWithNameNull() for more details.
-
- Apr 20, 2017
-
- Apr 04, 2017
-
-
gmantele authored
(https://github.com/gmantele/taplib/commit/7a70c6038cef460ab169682bed391bb5ae1de1e9) It was not possible to use a GROUP BY with a qualified column name. So finally, now, a GROUP BY is a ClauseADQL<ADQLColumn> instead of a ClauseADQL<ColumnReference>. Indeed, according to the ADQL's BNF, GROUP BY items are only columns as they would appear in the SELECT clause (i.e. qualified or not, delimited or not). On the other hand an ORDER BY accepts ONLY column index or non-qualified column name/alias. The class ColumnReference is kept for backward compatibility (or in case the next version of the ADQL grammar make items of GROUP BY and ORDER BY of the same type: index or qualified column). Besides, this class is still inherited for the ORDER BY clause items (see adql.query.ADQLOrder).
-
- Apr 03, 2017
- Mar 29, 2017
- Mar 10, 2017
-
-
gmantele authored
This error has been raised on the issue #32 by Zarquan.
-
- Mar 08, 2017
-
-
gmantele authored
Two classes have been modified after compilation: - ADQLParser - a simple cast for one of the automatically generated constructor. - ParseException - the token position has been stored for better syntax error messages. A note has been added at the top comment for both files to highlight the modified parts and how to restore them after re-generation.
-
- Mar 02, 2017
-
-
gmantele authored
-
- Feb 24, 2017
-
-
Ole Streicher authored
This import can not be resolved in a standalone version of adql. It also creates a circular dependency: ADQL then depends on TAP, which depends on starjava, but starjava depends on ADQL.
-
- Feb 22, 2017
-
-
gmantele authored
the automatic datatype detection was missing for CENTROID functions. -- Additionally, some JUnit test files of the `adql` package has been moved to the correct location.
-
- Feb 20, 2017
-
-
gmantele authored
-
- Feb 09, 2017
- Oct 12, 2016
-
-
gmantele authored
-
- Sep 20, 2016
-
-
gmantele authored
The "normal" JOIN: A JOIN B ON A.id = B.id JOIN C ON B.id = C.id is correctly interpreted as: ( (A JOIN B ON A.id = B.id) JOIN C ON B.id = C.id ) But with a NATURAL JOIN, the tree is mirrored: A NATURAL JOIN B NATURAL JOIN C gives: ( A NATURAL JOIN (B NATURAL JOIN C) ) instead of: ( (A NATURAL JOIN B) NATURAL JOIN C ) This is not a problem when the SQL translation is identical to the ADQL expression, but for some DBMS a conversion into a INNER JOIN ON is necessary and in this case we got the following SQL: A JOIN B JOIN C ON A.id = B.id ON B.id = C.id Which seems to work, but is syntactically strange. This commit should fix the generated tree. A "normal" JOIN and a NATURAL JOIN should now have the same form. A JUnit test has been added into TestADQLParser to check that: testJoinTree().
-
- Aug 10, 2016
-
-
gmantele authored
This is particularly annoying for numeric functions like sqrt(...) (example query: SELECT TOP 1 sqrt(2) as s2 FROM whatever_table). This bug has been raised by M. Taylor.
-
- Jul 14, 2016
-
-
gmantele authored
These two columns let recommend an order, respectively, for tables in their schema, and columns in their table. In addition of these new columns, "arraysize" has been also added. All these new columns are already supported when creating a TAP_SCHEMA from an XML file.
-
- Jul 13, 2016
-
-
gmantele authored
sub-query. Without this information, it was impossible to resolve columns makingreference to sub-queries of the clause FROM. See the JUnit test case for a concrete example. (error raised by Hendrik Heinl - ARI/GAVO)
-
gmantele authored
column in TAP_SCHEMA. Such names are normalized (without any prefix and without double quotes) when getADQLName() is called, but are returned just trimmed by getRawName(). This latter is just used by TAPMetadata when writing the XML description of all TAP tables.
-
gmantele authored
in DBType.DBDatatype (for UNKNOWN and UNKNOWN_NUMERIC). This reset is performed after each JUnit setting a special custom value (otherwise it prevents other JUnit to run correctly)
-
- Jul 12, 2016
-
-
gmantele authored
clause SELECT.
-
- Jun 08, 2016
-
-
theresa dower authored
[ADQL] SqlServerTranslator: bug fix for TOP vs LIMITgrammar. Adding support for math functions, including translations for TRUNCATE and MOD non-standard implementation.
-
- May 25, 2016
-
-
gmantele authored
Before correction, if an ADQlObject (e.g. a function or a sub-query) contains another ADQLObject and that both (i.e. parent and child) are matching in a SimpleReplaceHandler and are asked to be replaced, only the parent seemed to have been replaced. However, the child has been replaced, but in the former instance of the parent ; and so its replacement is not visible in the final query. For instance: if all mathematical functions must be replaced by a dumb UDF named 'foo' in the ADQL query: "SELECT sqrt(abs(81)) FROM myTable" ,the result should be: "SELECT foo(foo(81)) FROM myTable" ,but before this correction it was: "SELECT foo(abs(81)) FROM myTable".
-
- Apr 20, 2016
-
-
gmantele authored
This function was originally static. Since no other classes benefits of this static state, this function is no longer static. This might however raise a small incompatibility for the users of the library which used it.
-
gmantele authored
Before this commit, unsigned integers were also allowed (as for ORDER BY).
-
gmantele authored
Because of a test of the first parameter (non existing for functions like PI() and RAND()), a NullPointerException was thrown and so was stopping brutally an ADQL query interpretation.
-
- Mar 17, 2016
-
-
gmantele authored
deals with NATURAL JOINs and JOINs using the keyword USING so that being supported by SQL Server. Basically, they are translated as a list of ON conditions. Warning: This translator is just guaranteed to solve the NATURAL and USING issue. Support for datatypes conversion and case sensitivity has to be reviewed. Besides no geometrical function is translated for SQL Server.
-
gmantele authored
in first position. This should be totally harmless and should be conform to the behaviour of a NATURAL or USING keywords in DBMS.
-
- Mar 04, 2016
-
-
gmantele authored
This is easily possible for concatenations, string constants and User Defined Functions having a FunctionDef. A new special datatype was needed for numeric functions and operations: UNKNOWN_NUMERIC. This special type can not be set with FunctionDef.parse(...) and it behaves exactly like the type UNKNOWN, except that DBType.isNumeric() returns true (as .isUnknown()). Thus, while writing the metadata of a result in TAP, nothing changes: an UNKNOWN_NUMERIC type will be processed similarly as an UNKNOWN type: to use the type returned from the database ResultSet or to set VARCHAR. (no modification of TAP was needed for that)
-
gmantele authored
Functions whose some parameters are another function were not correctly identified: since the inner functions were not yet identified, their type was UNKNOWN and so it makes the identification of the parent function much easier since an UNKNOWN parameter is not checked. But, it was a problem if the parameter occurs to be finally of the wrong type.
-
gmantele authored
(indeed, a Concatenation object has no name).
-
- Jan 29, 2016
-
-
gmantele authored
-
- Dec 01, 2015
-
-
gmantele authored
functions must be casted into NUMERIC. Otherwise Postgres rejects the query.
-
- Sep 30, 2015
-
-
gmantele authored
Now, all occurences of ' are replaced by '' in the SQL translation.
-
- Sep 01, 2015
-
-
gmantele authored
types. The notion of "unknown type" is different in function of the target object: - a DBType and a FunctionDef have an unknown type if their function isUnknown() returns true. In such case, the other functions such as isNumeric/String/Geometry() will return false. - an ADQLOperand (e.g. ADQLColumn) does NOT have a isUnknown() function. But if the type of the operand is unknown, its functions isNumeric(), isString() and isGeometry() must ALL return true. Otherwise, just one of these functions can return true.
-