Code Monkey home page Code Monkey logo

jsqlparser / jsqlparser Goto Github PK

View Code? Open in Web Editor NEW
5.2K 216.0 1.3K 12.05 MB

JSqlParser parses an SQL statement and translate it into a hierarchy of Java classes. The generated hierarchy can be navigated using the Visitor Pattern

Home Page: https://github.com/JSQLParser/JSqlParser/wiki

License: Apache License 2.0

Java 98.74% PLSQL 0.54% XSLT 0.19% CSS 0.34% Python 0.05% JavaScript 0.14%
sql java parser ast postgresql mysql sqlserver jsqlparser hierarchy statement

jsqlparser's Introduction

Build Status Build Status (Legacy) Coverage Status Codacy Badge Maven Central Javadocs Gitter

Summary

Please visit the WebSite. JSqlParser is a RDBMS agnostic SQL statement parser. It translates SQL statements into a traversable hierarchy of Java classes (see Samples):

SELECT 1 FROM dual WHERE a = b
SQL Text
 └─Statements: statement.select.PlainSelect
    ├─selectItems: statement.select.SelectItem
    │  └─LongValue: 1
    ├─Table: dual
    └─where: expression.operators.relational.EqualsTo
       ├─Column: a
       └─Column: b
String sqlStr = "select 1 from dual where a=b";

PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse(sqlStr);

SelectItem selectItem =
        select.getSelectItems().get(0);
Assertions.assertEquals(
        new LongValue(1)
        , selectItem.getExpression());

Table table = (Table) select.getFromItem();
Assertions.assertEquals("dual", table.getName());

EqualsTo equalsTo = (EqualsTo) select.getWhere();
Column a = (Column) equalsTo.getLeftExpression();
Column b = (Column) equalsTo.getRightExpression();
Assertions.assertEquals("a", a.getColumnName());
Assertions.assertEquals("b", b.getColumnName());
}

JSQLParser-4.9 is the last JDK8 compatible version. The upcoming JSQLParser-5.0 will depend on JDK11 and introduces API breaking changes to the AST Visitors. Please see the Migration Guide for the details.

JSqlParser aims to support the SQL standard as well as all major RDBMS. Any missing syntax or features can be added on demand.

RDBMS Statements
Oracle
MS SQL Server and Sybase
Postgres
MySQL and MariaDB
DB2
H2 and HSQLDB and Derby
SQLite
SELECT
INSERT, UPDATE, UPSERT, MERGE
DELETE, TRUNCATE TABLE
CREATE ..., ALTER ...., DROP ...
WITH ...
Salesforce SOQL INCLUDES, EXCLUDES

JSqlParser can also be used to create SQL Statements from Java Code with a fluent API (see Samples).

Alternatives to JSqlParser?

General SQL Parser looks pretty good, with extended SQL syntax (like PL/SQL and T-SQL) and java + .NET APIs. The tool is commercial (license available online), with a free download option.

Alternatively the dual-licensed JOOQ provides a hand-written Parser supporting a lot of RDBMS, translation between dialects, SQL transformation, can be used as a JDBC proxy for translation and transformation purposes.

  1. Samples
  2. Build Instructions and Maven Artifact
  3. Contribution
  4. Change Log
  5. Issues

License

JSqlParser is dual licensed under LGPL V2.1 or Apache Software License, Version 2.0.

jsqlparser's People

Contributors

anemortalkid avatar cbockermann avatar ceekaygit avatar chiangcho avatar chrycheng avatar d2a-raudenaerde avatar davidjgoss avatar dependabot[bot] avatar georgekankava avatar gitmotte avatar jxnu-liguobin avatar kyongsik-yoon avatar manticore-projects avatar mathewjoseph31 avatar messfish avatar mo3000 avatar nhanitvn avatar oliviercavadenti avatar optimizing-ci-builds avatar pratrick avatar rfscholte avatar rotty3000 avatar sheldonkubor avatar skomlaebri avatar ted-johnson avatar tomershay avatar tvar avatar valdasraps avatar wumpz avatar zaza avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jsqlparser's Issues

Referencing database objects

@tzebool: Are there any progressions regarding your patch? Remember within the next days I will deactivate wumpz/JSQLParser and JSQLParser/JSqlParser will be it.

support for not expression using "!"

unable to parse following query --

select s1.a,s1.d as d from Sheet1 s1 where !(s1.b != 60)

version - 0.8,0.9

following is the stacktrace--
net.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 1, column 45. Encountered: "(" (40), after : "!"
at net.sf.jsqlparser.parser.CCJSqlParserTokenManager.getNextToken(CCJSqlParserTokenManager.java:1750)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_scan_token(CCJSqlParser.java:8568)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_187(CCJSqlParser.java:5969)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_83(CCJSqlParser.java:5993)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_165(CCJSqlParser.java:6085)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_81(CCJSqlParser.java:6097)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_162(CCJSqlParser.java:6374)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_80(CCJSqlParser.java:6381)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_256(CCJSqlParser.java:6539)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_160(CCJSqlParser.java:6551)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_79(CCJSqlParser.java:6605)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_383(CCJSqlParser.java:6663)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_355(CCJSqlParser.java:6670)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_341(CCJSqlParser.java:7321)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_295(CCJSqlParser.java:5906)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_231(CCJSqlParser.java:6038)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_147(CCJSqlParser.java:5581)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_67(CCJSqlParser.java:5787)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3_16(CCJSqlParser.java:6060)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_2_16(CCJSqlParser.java:4818)
at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:695)
at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:687)
at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:74)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:54)
at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:38)

What would be the benefit of switching to ANTLR 4 as a parser generator?

Due to the lack of significant improvements of JavaCC over the last years, I got the impression one should think about a switch of the parser generator.

After playing around and testing a bit of ANLTR 4 I am quite impressed about the easieness to transform and improve JavaCCs JSQLParser grammar to ANTLR 4. Still there are some things to solve:

  • keywords as identifier: solution would be like now
  • deparsing has to be separated again since the tree node classes of ANTLR could not be provided, like in JavaCC but are automatically generated
  • tooling around JSqlParser should be rebuild (e.g. TableNameExtractor)

I appreciate any comments to this.

Maybe there is another generator at hand that would be even better to use.

WHERE support SQL

Hi, which part of the parser responsible for the "SQL WHERE" clause?
for example:

SELECT umowy_finansowanie.id_umowy_finansowanie, umowy_finansowanie.id_donatorzy, umowy_finansowanie.nazwa, umowy_finansowanie.kwota, umowy_finansowanie.id_preliminarze, COALESCE(umowy_finansowanie.rozliczone,0) AS rozliczone,
COALESCE(umowy_finansowanie.opcja1,0) AS opcja1, COALESCE(umowy_finansowanie.opcja2,0) AS opcja2, COALESCE(umowy_finansowanie.opcja3,0) AS opcja3, COALESCE(umowy_finansowanie.opcja4,0) AS opcja4,
COALESCE(umowy_finansowanie.opcja5,0) AS opcja5, COALESCE(umowy_finansowanie.opcja6,0) AS opcja6, COALESCE(umowy_finansowanie.opcja7,0) AS opcja7, COALESCE(umowy_finansowanie.opcja8,0) AS opcja8,
COALESCE(umowy_finansowanie.opcja9,0) AS opcja9, COALESCE(umowy_finansowanie.opcja10,0) AS opcja10, COALESCE(umowy_finansowanie.opcja11,0) AS opcja11, COALESCE(umowy_finansowanie.opcja12,0) AS opcja12,
COALESCE(umowy_finansowanie.opcja13,0) AS opcja13, preliminarze.id_preliminarze AS preliminarz, preliminarze.nazwa AS preliminarz_nazwa
FROM umowy_finansowanie, preliminarze WHERE preliminarze.id_preliminarze=umowy_finansowanie.id_preliminarze AND umowy_finansowanie.id_donatorzy=1

I want to get:

preliminarze.id_preliminarze = umowy_finansowanie.id_preliminarze AND umowy_finansowanie.id_donatorzy = 1

column names and values ​​from where

Regards

PostgreSQL - insert table returning

Hey,

I have another issue regarding insert statements. Using PostgreSQL, you can add the term returning after an insert statement to get information regarding the inserted tuple, e.g.

insert into table(column) values('1') returning id

id is another column of the same table. Using this insert statement with the JSqlParser, I get the error message, that he expects end of file, ; or , instead of returning.

Consider default adapters for Visitor classes

It would be great if JSqlParser provided adpater classes such that writing the following code may be possible out of the box

final List<String> variables = new ArrayList<>();   
class JdbcVariableExtractor extends ExpressionVisitorAdapter {
  public void visit(JdbcNamedParameter param) {
    variables.add(param.getName());
  }
}

Statement stmnt = CCJSqlParserUtil.parse(new StringReader(sql));
stmnt.accept(new StatementVisitorAdapter() {
  public void visit(Select select) {
    select.getSelectBody().accept(new SelectVisitorAdapter() {
      public void visit(PlainSelect plainselect) {
        plainSelect.accept(new JdbcVariableExtractor());
      }
    });
  }
});

will jsqlparser support analytic function any sooner?

Hi, I wonder whether analytic function will be supported :)
for example:
SELECT ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS "Row Number",
p.LastName, s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0
ORDER BY PostalCode;
Thank you.
Best,

GROUP BY GROUPING SETS support

We used "GROUPING SETS" and parser gives error for this.
Additionally, GROUP BY ROLLUP and GROUP BY CUBE may be supported with this, their syntax is similar.

A DB2 SQL sample using "GROUPING SETS":

SELECT WEEK(SALES_DATE) AS WEEK,
DAYOFWEEK(SALES_DATE) AS DAY_WEEK,
SALES_PERSON, SUM(SALES) AS UNITS_SOLD
FROM SALES
WHERE WEEK(SALES_DATE) = 13
GROUP BY GROUPING SETS ( (WEEK(SALES_DATE), SALES_PERSON),
(DAYOFWEEK(SALES_DATE), SALES_PERSON))
ORDER BY WEEK, DAY_WEEK, SALES_PERSON

http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/index.jsp?topic=%2Fcom.ibm.db2.luw.sql.ref.doc%2Fdoc%2Fr0059215.html

It is also supported by SQL Server and Oracle:
http://blogs.msdn.com/b/craigfr/archive/2007/10/11/grouping-sets-in-sql-server-2008.aspx
http://www.oracle-base.com/articles/misc/rollup-cube-grouping-functions-and-grouping-sets.php

Alias Field

Hi
I know how to retrieve a list of fields from a SQL query, but how to get the alias of these fields?

Regards

JSqlParser failed at insert into query

This is the query that JSqlParser fails at parsing it
insert /+direct/ into s_rdf_staging.rdf_ext_adacc_m (
data_as_of_date ,
month_id ,
ad_account_id ,
advertiser_sf_id ,
rand_advertiser_sf_id ,
advertiser ,
advertiser_country_abbr ,
advertiser_country ,
advertiser_region ,
advertiser_vertical ,
advertiser_sub_vertical ,
agency_sf_id ,
agency ,
ad_buying_mechanism ,
sales_channel ,
page_type_group ,
creative_type_group ,
bid_type ,
delivered_country_abbr ,
delivered_country ,
delivered_region ,
ind_tgt_offsite_cnvrsn ,
ind_tgt_fan ,
ind_tgt_fof ,
ind_tgt_age ,
ind_tgt_gender ,
ind_tgt_custom_audience_inc ,
ind_tgt_custom_audience_exc ,
ind_tgt_mobilefeed ,
ind_newsfeed ,
ind_dark_post ,
legal_imps ,
legal_clicks ,
legal_revenue,
bucket_date_id,
bucket_start_time,
bucket_end_time,
src_create_time,
src_update_time,
create_time,
update_time,
create_user,
update_user
)
select
dt.last_refresh_date data_as_of_date ,
f.month_id month_id ,
f.ad_account_id ad_account_id ,
adv.sf_customer_account_id advertiser_sf_id ,
isnull(adv.sf_customer_account_id, substr(to_char(-1*random()),1,100)) rand_advertiser_sf_id ,
substring(adv.name,1,100 using octets) advertiser ,
f.advertiser_country advertiser_country_abbr ,
adv_rgn.country advertiser_country ,
adv_rgn.sales_adv_region advertiser_region ,
vrt.level_1 advertiser_vertical ,
vrt.level_2 advertiser_sub_vertical ,
agc.sf_customer_account_id agency_sf_id ,
substring(agc.name,1,100 using octets) agency ,
f.ad_buying_mechanism ad_buying_mechanism ,
f.sales_channel sales_channel ,
pt.page_type_group page_type_group ,
ct.api_creative_type_group creative_type_group ,
f.bid_type bid_type ,
f.delivered_country delivered_country_abbr ,
dlv_rgn.country delivered_country ,
dlv_rgn.sales_adv_region delivered_region ,
f.tgt_offsite_cnvrsn_ind ind_tgt_offsite_cnvrsn ,
f.tgt_fan_ind ind_tgt_fan ,
f.tgt_fof_ind ind_tgt_fof ,
f.tgt_age_ind ind_tgt_age ,
f.tgt_gender_ind ind_tgt_gender ,
f.tgt_custom_audience_inc_ind ind_tgt_custom_audience_inc ,
f.tgt_custom_audience_exc_ind ind_tgt_custom_audience_exc ,
f.tgt_mobilefeed_ind ind_tgt_mobilefeed ,
f.newsfeed_ind ind_newsfeed ,
f.dark_post_ind ind_dark_post ,
sum(f.admkt_legal_imps) legal_imps ,
sum(f.admkt_legal_clicks) legal_clicks ,
sum(f.admkt_legal_revn)/100 legal_revenue,
max(f.bucket_date_id),
max(f.bucket_start_time),
max(f.bucket_end_time),
max(f.src_create_time),
max(f.src_update_time),
sysdate,
sysdate,
'svc_etl_rdf',
'svc_etl_rdf'
from
s_rdf.f_admarket_ad_account_stats_m f
join s_rdf.d_ad_account acct on f.id_d_ad_account = acct.id_d_ad_account
join s_rdf.d_customer_account adv on acct.id_d_account_advertiser = adv.id_d_customer_account
join s_rdf.d_customer_account agc on acct.id_d_account_soldto = agc.id_d_customer_account
join s_rdf.d_page_type pt on f.id_d_page_type = pt.id_d_page_type
join s_rdf.d_api_creative_type ct on f.id_d_api_creative_type = ct.id_d_api_creative_type
join s_rdf.dh_account_vertical_v vrt on adv.id_dh_account_sub_vertical = vrt.id_dh_account_sub_vertical
left outer join s_rdf.d_geo_country adv_rgn on f.advertiser_country = adv_rgn.country_abbr
left outer join s_rdf.d_geo_country dlv_rgn on f.delivered_country = dlv_rgn.country_abbr
cross join (select max(cj.last_refresh_date ) as last_refresh_date
from s_general.c_job_status_v cj
where cj.job_sub_group = 'admarket_stats'
) dt
where f.month_id >= trunc(date('1987-03-09')-360, 'mm')
group by
1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,
31

Encountered " "INDEX"

Any ideas on following?

With following statement:
select tbl.enclosure,tbl.delimiter,tbl.filename,tbl.Columns,tbl.isheaderpresent,tbl.isedgestep,tbl.displayY,tbl.errorStep,tbl.isinputstep,tbl.displayX,tbl.Child,tbl.Parents,tbl.Index,tbl.Title,tbl.Description,tbl.type from Simple_Builder.CSVStep tbl

I get following exception:
net.sf.jsqlparser.parser.ParseException: Encountered " "INDEX" "Index "" at line 1, column 178.
Was expecting one of:
<S_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...
<S_QUOTED_IDENTIFIER> ...

CREATE TABLE doesn't allow to have column names in quotes

http://sourceforge.net/tracker/?func=detail&aid=3068961&group_id=104597&atid=638634

Since this "hub" doesn't allow attachments, here is the change which works for me

--- a/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj
+++ b/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj
@@ -1523,7 +1523,11 @@ CreateTable CreateTable():
    [
        "("

-       columnName=<S_IDENTIFIER>
+       (
+           columnName=<S_IDENTIFIER>
+           |
+           columnName=<S_QUOTED_IDENTIFIER>
+       )
        colDataType = ColDataType()
        {
            columnSpecs = new ArrayList();
@@ -1582,7 +1586,11 @@ CreateTable CreateTable():
                )
                |
                (
-                   columnName=<S_IDENTIFIER> 
+                    (
+                        columnName=<S_IDENTIFIER>
+                        |
+                        columnName=<S_QUOTED_IDENTIFIER>
+                    )

net.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 2, column 19. Encountered: "\u2018" (8216), after : ""

Hi, community.
I ran.
insert into example (num, name, address, tel)
values (1, ‘name‘, ’test ‘, ’1234-1234‘)

The following error appears.

!MESSAGE Unhandled event loop exception
!STACK 0
net.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 2, column 19. Encountered: "\u2018" (8216), after : ""
at net.sf.jsqlparser.parser.CCJSqlParserTokenManager.getNextToken(CCJSqlParserTokenManager.java:1771)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_scan_token(CCJSqlParser.java:7951)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_110(CCJSqlParser.java:7234)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_57(CCJSqlParser.java:7258)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_90(CCJSqlParser.java:7375)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_181(CCJSqlParser.java:7477)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_89(CCJSqlParser.java:7484)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_180(CCJSqlParser.java:7551)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_86(CCJSqlParser.java:7684)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_83(CCJSqlParser.java:7603)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3_36(CCJSqlParser.java:7673)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_2_36(CCJSqlParser.java:4762)
at net.sf.jsqlparser.parser.CCJSqlParser.SimpleExpression(CCJSqlParser.java:2790)
at net.sf.jsqlparser.parser.CCJSqlParser.Insert(CCJSqlParser.java:468)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:146)
at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:38)
at com.hangum.tadpole.sql.util.SQLUtil.isStatement(SQLUtil.java:122)
at com.hangum.tadpole.rdb.core.editors.main.MainEditor.execute(MainEditor.java:1157)
at com.hangum.tadpole.rdb.core.editors.main.MainEditor.executeCommand(MainEditor.java:975)
at com.hangum.tadpole.rdb.core.editors.main.function.MainEditorBrowserFunctionService.doExecuteQuery(MainEditorBrowserFunctionService.java:89)
at com.hangum.tadpole.editor.core.rdb.texteditor.function.EditorBrowserFunctionService.function(EditorBrowserFunctionService.java:53)
at org.eclipse.swt.internal.browser.browserkit.BrowserOperationHandler$1.run(BrowserOperationHandler.java:83)
at org.eclipse.rap.rwt.lifecycle.ProcessActionRunner.executeNext(ProcessActionRunner.java:53)
at org.eclipse.swt.widgets.Display.runPendingMessages(Display.java:1187)
at org.eclipse.swt.widgets.Display.safeReadAndDispatch(Display.java:1172)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1164)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2733)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2694)
at org.eclipse.ui.internal.Workbench.access$5(Workbench.java:2530)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:701)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:684)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:157)
at com.hangum.tadpole.application.Application.createUI(Application.java:40)
at org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle.createUI(RWTLifeCycle.java:186)
at org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle$UIThreadController.run(RWTLifeCycle.java:298)
at java.lang.Thread.run(Thread.java:724)
at org.eclipse.rap.rwt.internal.lifecycle.UIThread.run(UIThread.java:104)
ERROR - LogListener : logging Unhandled event loop exceptionnet.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 2, column 19. Encountered: "\u2018" (8216), after : ""
ERROR - LogListener : logging Unhandled event loop exceptionnet.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 2, column 19. Encountered: "\u2018" (8216), after : ""
ERROR - LogListener : logging Unhandled event loop exceptionnet.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 2, column 19. Encountered: "\u2018" (8216), after : ""
ERROR - LogListener : logging Unhandled event loop exceptionnet.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 2, column 19. Encountered: "\u2018" (8216), after : ""
ERROR - LogListener : logging Unhandled event loop exceptionnet.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 2, column 19. Encountered: "\u2018" (8216), after : ""
ERROR - LogListener : logging Unhandled event loop exceptionnet.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 2, column 19. Encountered: "\u2018" (8216), after : ""
ERROR - LogListener : logging Unhandled event loop exceptionnet.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 2, column 19. Encountered: "\u2018" (8216), after : ""
ERROR - LogListener : logging Unhandled event loop exceptionnet.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 2, column 19. Encountered: "\u2018" (8216), after : ""

JSQLParser Maintainer

Hi Florent,
I would like to be the main maintainer of JSQLParser on GitHub. Is there any possibility to take over your repository of JSQLParser to my account or is there any other possibility? Maybe an github organisation?

Regards

Tobias

Failed to parse "CREATE TABLE" statement

Hey,

I tried to execute the following program. The specified query is a valid one, so the parser should work for it:

public class TablesNamesFinder {
    /**
     * @param args
     * @throws JSQLParserException
     */
    public static void main(String[] args) throws JSQLParserException {

        CCJSqlParserManager pm = new CCJSqlParserManager();
        //@formatter:off
        String sql = "CREATE TABLE test ( " + 
                "id INT UNSIGNED NOT NULL AUTO_INCREMENT, " + 
                "string VARCHAR(20), " + 
                "PRIMARY KEY (id)," +
                "user_id INT UNSIGNED," +
                "FOREIGN KEY (user_id) REFERENCES ra_user(id)" + 
                ")";
        //@formatter:on
        System.out.println(sql);
        Statement statement = pm.parse(new StringReader(sql));

        if (statement instanceof CreateTable) {
            CreateTable createTable = (CreateTable) statement;
            List<ColumnDefinition> columnDefinitions = createTable.getColumnDefinitions();
            for (ColumnDefinition o : columnDefinitions) {
                System.out.println(o.getColumnName());
            }
        }
    }

}

There is something wrong while parsing the foreign key statement. By executing my program, i receive the the following exception:

    CREATE TABLE test ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, string VARCHAR(20), PRIMARY KEY (id),user_id INT UNSIGNED,FOREIGN KEY (user_id) REFERENCES ra_user(id))
    Exception in thread "main" net.sf.jsqlparser.JSQLParserException
        at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:42)
        at de.stahlhofen.shisharater.sql.scheme.TablesNamesFinder.main(TablesNamesFinder.java:30)
    Caused by: net.sf.jsqlparser.parser.ParseException: Encountered " "KEY" "KEY "" at line 1, column 128.
    Was expecting:
        <S_IDENTIFIER> ...

        at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:7117)
        at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:6993)
        at net.sf.jsqlparser.parser.CCJSqlParser.ColDataType(CCJSqlParser.java:3711)
        at net.sf.jsqlparser.parser.CCJSqlParser.CreateTable(CCJSqlParser.java:3631)
        at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:147)
        at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:40)
        ... 1 more
    Caused by:
    net.sf.jsqlparser.parser.ParseException: Encountered " "KEY" "KEY "" at line 1, column 128.
    Was expecting:
        <S_IDENTIFIER> ...

        at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:7117)
        at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:6993)
        at net.sf.jsqlparser.parser.CCJSqlParser.ColDataType(CCJSqlParser.java:3711)
        at net.sf.jsqlparser.parser.CCJSqlParser.CreateTable(CCJSqlParser.java:3631)
        at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:147)
        at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:40)
        at de.stahlhofen.shisharater.sql.scheme.TablesNamesFinder.main(TablesNamesFinder.java:30)

Would it be possible to add support for the foreign key statement?
Thanks and best regards.

Support for Oracle when using aliases in from part

When using the sqlparser to modify sql statements generated by Hibernate I get "ORA-00933: SQL command not properly ended" when I run the sql against Oracle.

The offending code is toString in the Table class and other FromItem implementations:

public String toString() {
    return getWholeTableName() +
            ((pivot != null) ? " "+pivot : "") +
            ((alias != null) ? " AS " + alias : "");
}

As far as I know there is no need to use the AS keyword so
SELECT * FROM PERSON AS P
should be
SELECT * FROM PERSON P

Oracle does not like the AS part and that is what is causing the ORA-00933 error.

I will test with a local patch for this.

Let me know if you need more information about this.

/Mattias

Error in recursive select "start with...connect by prior ..." in oracle

Hi,

I had problem when I try to parse the recursive select sql like "...start with ...connect by prior ..." in oracle .I use 0.8.4-SNAPSHOT version of jsqlparse.It gives the follow error:

Caused by: net.sf.jsqlparser.parser.ParseException: Encountered " <S_IDENTIFIER> "start "" at line 47, column 17.
Was expecting one of:

"GROUP" ...
"HAVING" ...
";" ...
"(+)" ...
"||" ...
"^" ...
"::" ...
"::" ...
"^" ...
"||" ...
"(+)" ...
"GROUP" ...
"HAVING" ...
"::" ...
"^" ...
"||" ...
"(+)" ...
"::" ...
"^" ...
"||" ...
"(+)" ...
"(+)" ...
"(+)" ...
"(+)" ...
"::" ...
"^" ...
"||" ...
"::" ...
"^" ...

at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:7145)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:7021)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:174)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:47)
... 89 more

Regards

No-argument functions are ambiguous with column names (multiple issues)

Let's consider you allow to write custom queries to your database, and you use the scanner visitors to scan the given query for permitted columns and functions. If you use no-args functions like NOW(), then JSqlParser respects it as a column name:

  1. incosistent Function.toString()
final SelectBody selectBody = parseSelectBody("SELECT NOW() FROM bar");
System.out.printLn(selectBody);

gives the following output:

SELECT NOW FROM bar

Note that NOW is now considered as a column name.

  1. for such kind of queries we can use ExpressionVisitor to check the columns and functions against the whitelist, so NOW, as it's now considered as a column and accepted in public void visit(Column column) rather than public void visit(Function function)

Is there any workaround for this issue? I'm currently using 0.7.0, but 0.8.0 seems to work the same. Thank you!

Integrate changes into main project

Hey,

it would be nice if the fixes/additions done for jsqlparser could be merged into one version again. The author of the project on sourceforge.net indicated, that he would be willing to add authors to the project. So it would be nice if you could join that effort.

A good place to discuss possibilities for further development could be this start of a discussion on sourceforce.net:

https://sourceforge.net/projects/jsqlparser/forums/forum/360150/topic/5652953/index/page/1

Greetings

Matthias

Union in select

Primarily, great project, great work.
I used JSqlParser 0.7.0 version earlier and I want to pass to 0.8.9.
I see you added a support for new clauses, but UNION, I used, isn't working now.
What's your substitute for one?
I see UnionOP, but I used union.getPlainSelects() before.

I would be glad to help the project, if you need something.
I'm not a great expert in JAVA, but I have a lot of experience in oracle.
Regards
Yuri

REGEXP in mysql

Hi! Does JSQLParser support Regular Expression for Mysql database?
I tried with:
SELECT * FROM pet WHERE name REGEXP '^b'
and the parser returned the error:

Encountered " <S_IDENTIFIER> "name "" at line 1, column 25.
Was expecting one of:
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...

at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:9257)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:9130)
at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:2400)
at net.sf.jsqlparser.parser.CCJSqlParser.WhereClause(CCJSqlParser.java:2068)
at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:939)
at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:850)
at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:837)
at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:74)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:54)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:49)
at it.unibz.krdb.sql.api.VisitedQuery.<init>(VisitedQuery.java:93)
at it.unibz.krdb.obda.parser.JSQLParserTest.parseUnquotedJSQL(JSQLParserTest.java:768)
at it.unibz.krdb.obda.parser.JSQLParserTest.testRegexMySQL(JSQLParserTest.java:690)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)

Thanks

PostgreSQL - create table constraint

Hey there

in PostgreSQL, you can,additionally to foreign keys, define primary keys, unique and not null constraints with the constraint parameter. The advantage of using;

constraint pk_table primary key(column)

instead of just writing primary key behind the column is, that you can name the constraint. (in this case pk_table). At the moment, JSQLParser has problems with detecting this kind of constraint (it expects FOREIGN instead of PRIMARY)

Is it possible to "fix" that issue?

Thanks and have a nice weekend.

Stefan

Erro in WITH clausule with ALIAS

Hi,
I had problem when I try to parse the code below:

WITH WS_A AS (SELECT /+ MATERIALIZE/
I_AJ.AJ
, I_AJ.OG
, I_AJ.A
, I_AJ.M
, I_AJ.MR
, SUM ( I_AJ.AJU_PRE ) AS AJU_PRE
FROM TABLE_A I_AJ
GROUP BY I_AJ.AJ
, I_AJ.OG
, I_AJ.A
, I_AJ.M
, I_AJ.MR),
WS_B AS (SELECT /+ MATERIALIZE/
I_AA.A
, I_AA.ASUC
, I_AA.DT_SUC_INI
, I_AA.DT_SUC_FIM
, I_AA.P_SUC
FROM TABLE_B I_AA
WHERE I_AA.TIPO_SUC = (SELECT VALUE
FROM TABLE_C
WHERE ACRON_ID = 1175
AND DESCR = 'MONE'))
SELECT I_AMMR.AJ
, I_AMMR.OG
, I_AMMR.A
, NVL ( I_AASUC.ASUC, I_AMMR.A ) AS ASUC
, I_AMMR.MR
, I_AMMR.AJU_PRE * NVL ( I_AASUC.P_SUC, 1 ) AS AJU_PRE_SUC
FROM WS_A I_AMMR, WS_B I_AASUC
WHERE I_AMMR.A = I_AASUC.A(+)
AND I_AMMR.MR >= TO_CHAR ( I_AASUC.DT_SUC_INI(+), 'YYYYMM' )
AND I_AMMR.MR < TO_CHAR ( I_AASUC.DT_SUC_FIM(+), 'YYYYMM' );

I received the code error:

Caused by: net.sf.jsqlparser.parser.ParseException: Encountered " <S_IDENTIFIER> "I_AA "" at line 21, column 28.

How can I fix it ?

CHARACTER SET mysql

Hi, using the parser an exception is generated when I run a query of the form

SELECT DISTINCT 
CAST(`view0`.`nick2` AS CHAR(8000) CHARACTER SET utf8) AS `v0`
FROM people `view0`
WHERE `view0`.`nick2` IS NOT NULL

The exception returned is:
net.sf.jsqlparser.parser.ParseException: Encountered " "CAST" "CAST "" at line 1, column 17.
Was expecting one of:
"ON" ...
"TOP" ...
"(" ...
"" ...
"ON" ...
"TOP" ...
"
" ...
"(" ...

I saw that the problem is not present when I remove the character set from the query.
Is this not supported yet?

Thanks

CASE ELSE Expression not supporting Addition operators

Hi,

Upon trying the library, the following statement does not parse. It seems the Case statement does not suy:

select 
    case 
        when 1 + 3 > 20 
        then 0
        else 1000 + 1
    END as d 
from dual;

The output is correctly parsed by Oracle.

The stack trace follows:

Exception in thread "main" net.sf.jsqlparser.JSQLParserException
at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:40)
at Main.test(Main.java:34)
at Main.main(Main.java:86)
Caused by: net.sf.jsqlparser.parser.ParseException: Encountered " "CASE" "case "" at line 2, column 5.
Was expecting one of:
"ALL" ...
"TOP" ...
"DISTINCT" ...
"(" ...
"" ...
"ALL" ...
"DISTINCT" ...
"TOP" ...
"
" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...

at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:5530)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:5406)
at net.sf.jsqlparser.parser.CCJSqlParser.SimpleExpression(CCJSqlParser.java:2026)
at net.sf.jsqlparser.parser.CCJSqlParser.SelectItem(CCJSqlParser.java:981)
at net.sf.jsqlparser.parser.CCJSqlParser.SelectItemsList(CCJSqlParser.java:925)
at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:637)
at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:570)
at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:557)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:113)
at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:38)
... 2 more

Caused by:
net.sf.jsqlparser.parser.ParseException: Encountered " "CASE" "case "" at line 2, column 5.
Was expecting one of:
"ALL" ...
"TOP" ...
"DISTINCT" ...
"(" ...
"" ...
"ALL" ...
"DISTINCT" ...
"TOP" ...
"
" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...
"(" ...

at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:5530)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:5406)
at net.sf.jsqlparser.parser.CCJSqlParser.SimpleExpression(CCJSqlParser.java:2026)
at net.sf.jsqlparser.parser.CCJSqlParser.SelectItem(CCJSqlParser.java:981)
at net.sf.jsqlparser.parser.CCJSqlParser.SelectItemsList(CCJSqlParser.java:925)
at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:637)
at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:570)
at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:557)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:113)
at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:38)
at Main.test(Main.java:34)
at Main.main(Main.java:86)

Many thanks.

Edit: This might be solved in 0.7.1. Is there any binary jar that I can download? sf.net only shows me 0.7.0.

OVER issue (partition by)

Hi

I am using JSqlParser in one of my projects. While parsing some queries some exceptions occured, I will describe them in separated threads.

There is an issue with OVER expression. In general it works, but problem is when I provide parser with statement containting PARTITION BY in OVER, e.g.

over (partition by ws_perm_id, frequency, fiscalperiod, pointdate order by load_date asc rows between unbounded preceding and 1 preceding))

Mateusz

Replace parser fails on processing own statement toString output

One should expect that "toString" output of any statement should be not only functionally identical to the original query text, but can be also used to create another statement with the same result.
For replace statements it works only for simple queries. If query contains sub select it fails
Example:
Original query:
replace a_table (ID,A,B) select A_ID,A,B from b_table
Statement's toString output:
REPLACE a_table (ID, A, B) (SELECT A_ID, A, B FROM b_table WHERE D = 0)

This output used as an input string for another statement fails with the following parser error:
net.sf.jsqlparser.parser.ParseException: Encountered " "(" "( "" at line 1, column xxx.
Was expecting:
"SELECT" ...

Similar INSERT works fine.

MySQL TRUNCATE function cannot be parsed because of conflict with SQL TRUNCATE keyword

For example,

SELECT TRUNCATE(foo) FROM bar

cannot be parsed, however, I guess, it might be parsed as a function name rather than a DDL keyword (for example, TRUNCATE TABLE bar is parsed nice). What the TRUNCATE function is in MySQL: http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html . I've checked both 0.7.0 and 0.8.0 -- they both cannot accept TRUNCATE as a function name.

Can it be reworked to work both in "keyword" and "function" manner? Thanks.

Release 0.8.4

Hello Tobias,
when do you expect to release 0.8.4?

Is the Postgres ~ operator supported?

Here is what I am seeing.

SELECT a, b FROM foo WHERE a ~ '[help].*';

Caused by: net.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 1, column 30. Encountered: "~" (126), after : ""

Using

com.github.jsqlparser
jsqlparser
0.8.5

Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.